使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例

从Detectron输出的相关示例

使用Detectron预训练权重输出 *e2e_keypoint_rcnn-R-50-FPN_s1x*的示例

这个代码是按照Detectron的安装架构来实现的,仅支持部分功能性,你可以通过点击此链接来获取更多相关信息。

通过这个代码,你可以……

  1. 根据草图训练模型;

  2. 通过使用Detectron中得到预训练权重(*.pk)来进行推断;

这个储存器最早是建在jwyang/faster-rcnn.pytorch上的,但是经过多次的修改,这个结构已经变了很多了而且现在更类似于Detectron。为了直接从正式的预训练权重文件中重新得到结果,我刻意将所有东西弄得和Detectron的运行方法相似或者一致了。

这个工具有以下特征:

  • 这个完全是Pytorch代码,当然了,也有一些CUDA代码。

  • 它支持多图像的批处理加工训练。

  • 它支持多GPUs 训练。

  • 它支持三种合并方法,但是需要注意的是只有roi align能被改进去匹配 Caffe2的安装。所以,尽管去用就好了。

  • 它可以高效利用内存。对于数据的批处理,这儿有两种可选择的技术去减少显存使用量:1)根据类别分组:同批次的一组图像是有相似的类别比率 2)根据类别剪裁:剪裁图像太长了。 类别分组是在Detectron运行,所以用来默认,类别剪裁是来自jwyang/faster-rcnn.pytorch,所以它不能用来默认。

除此之外,我提供一个定制化的模型nn.DataParallel ,它能够使不同批次混乱的型号出现在不同的绘图处理器上。你可以在My nn.DataParallel 这节找到更多关于这个的详细内容。

支持的网络模型

  • 主要架构:

ResNet series: ResNet50_conv4_body, ResNet50_conv5_body, ResNet101_Conv4_Body, ResNet101_Conv5_Body, ResNet152_Conv5_Body

FPN: fpn_ResNet50_conv5_body, fpn_ResNet50_conv5_P2only_body, fpn_ResNet101_conv5_body,fpn_ResNet101_conv5_P2only_body, fpn_ResNet152_conv5_body, fpn_ResNet152_conv5_P2only_body

  • ResNeXt也被运行了但是还没有测试。

  • Box head: ResNet_roi_conv5_head, roi_2mlp_head

  • Mask head: mask_rcnn_fcn_head_v0upshare, mask_rcnn_fcn_head_v0up, mask_rcnn_fcn_head_v1up4convs, mask_rcnn_fcn_head_v1up

  • Keypoints head: roi_pose_head_v1convX

注意:这个命名和那个用在Detectron的是相似的。只是删掉前置的add_,如果有的话。

支持的数据集

现在只有COCO是被支持的。但是,整个数据集库运行几乎是和 Detectron的是一样的,所以用Detectron支持添加更多的数据集是很简单的。

配置选择

架构单一明确的配置文件是放在configs下的。 一般的配置文件lib/core/config.py里所有的选项都基本是和Detectron相同的默认值。所以把架构单一的configs转化到Detectron是非常轻松的。

怎样把配置文件从Detectron转化出来

1. 删除 MODEL.NUM_CLASSES 。在JsonDataset初赋值过程中被设置。

2. 删除 TRAIN.WEIGHTS,TRAIN.DATASETS 和TEST.DATASETS。

3. 在模型类型的选择中,

(比如: MODEL.CONV_BODY,FAST_RCNN.ROI_BOX_HEAD ……) 如果在数串中存在 add_,则将其删除。

4. 如果想给模型加载更多的ImageNet 预训练权重,添加指向预训练权重文件的RESNETS.IMAGENET_PRETRAINED_WEIGHTS 。如果没有就把MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS设置成 False

更多的细节

一些选项是不能使用的因为相关的功能性还没有实现。但是有一些不能被使用的原因是我用不同方法安装了程序。

这里有一些没有影响但值得注意的选项:

  • SOLVER.LR_POLICY, SOLVER.MAX_ITER, SOLVER.STEPS,SOLVER.LRS :就目前情况,训练指令被这些命令行参数控制:

--epochs:要训练多少 epochs 。一个 epoch意味着要遍历整个训练集并且将默认值设为6。

--lr_decay_epochs:每一epochs都是衰减学习率的。 衰减是发生在每个 epoch的开始。 Epoch 是 以0索引开始的,默认值是 [4, 5]。

要获得更多地命令行参数,请参考python train_net.py --help

  • SOLVER.WARM_UP_ITERS, SOLVER.WARM_UP_FACTOR, SOLVER.WARM_UP_METHOD: 在纸上做预热训练Accurate,Large Minibatch SGD:在一小时内训练 ImageNet 是不能被运行的。

  • OUTPUT_DIR :使用命令行参数来代替--output_base_dir 去明确化输出目录。

当更多地选项被提供:

  • MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True:是否载入 ImageNet的预训练权重。

    RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '':预训练网络的权重文件路径。如果是以 '/' 开始的,那它就是一个绝对路径。否则就会被当作是一个和ROOT_DIR相关的路径。

  • TRAIN.ASPECT_CROPPING = False, TRAIN.ASPECT_HI = 2,TRAIN.ASPECT_LO = 0.:根据类别选项的剪裁去限制图像类别比率范围的选项。

  • RPN.OUT_DIM_AS_IN_DIM = True,RPN.OUT_DIM = 512 ,RPN.CLS_ACTIVATION = 'sigmoid' :RPN的正式运行有相同的输入和输出特征通道,它们使用sigmoid作为激活函数作为对fg/bg class类的输出预测,在jwyang's implementation,它把输出路径数字确定为512而且使用softmax为激活函数。

我的nn.DataParallel

TBA

开始

克隆这个仓库:

git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git

命令

在 python3下测试。

  • python安装包

pytorch==0.3.1 (cuda80, cudnn7.1.2)

torchvision==0.2.0

numpy

scipy

opencv

pyyaml

pycocotools— COCO数据集专用,也可以通过 pip安装。

tensorboardX —可以在Tensorboard上记录losses。

  • 一个 NVIDAI GPU 和 CUDA 8.0 或者更高。一些操作只有gpu 安装。

  • 注意:不同版本的 Pytorch安装包有不同的显存使用量。

编写

编写CUDA代码:

cd lib # please change to this directory

sh make.sh

如果你在使用 Volta GPU, 在lib/mask.sh 文件中取消注释这一句并且记住在上面这行后打上一个反斜杠。CUDA_PATH 路径默认为/usr/loca/cuda 。如果你想要在不同路径下使用CUDA库,根据实际情况改变这行语句。

这条语句将会编译你需要的所有模块,包括NMS、 ROI_Pooing、ROI_Crop 和 ROI_Align模块。 (事实上GPU NMS模块从未被使用过...)

特别注意的是,如果你使用CUDA_VISIBLE_DEVICES 来设置GPU,确保在编译代码的时候至少有一个GPU可见。

数据准备

在repo下创建一个数据文件夹,

cd {repo_root}

mkdir data

  • COCO:下载coco图片数据 以及从coco网站上获得的注释

确保根据下面的文件结构将文件放置好:

coco

├── 注释

| ├── instances_minival2014.json

│ ├── instances_train2014.json

│ ├── instances_train2017.json

│ ├── instances_val2014.json

│ ├── instances_val2017.json

│ ├── instances_valminusminival2014.json

│ ├── person_keypoints_train2014.json

│ ├── person_keypoints_train2017.json

│ ├── person_keypoints_val2014.json

│ └── person_keypoints_val2017.json

└── 图片

├── train2014

├── train2017

├── val2014

└── val2017

下载instances_minival2014.json和instances_valminusminival2014.json的链接

随便将数据集放在任意想放的地方,然后将数据集软连接到data/ 文件夹下:

ln -s path/to/coco data/coco

推荐将图片输入SSD网络来使训练效果更加好。

根据我的经验来看, COCO2014针对相关的图片数据有一些不同尺寸(h,w)的掩码注释。可能 instances_minival2014.jsoninstances_valminusminival2014.json 包含了错误的掩码注释。然而COCO2017 数据集并没有这个问题.。据说 COCO train2017数据集 与 (COCO train 2014 + COCO minival 2014)相当 ,并且 COCO test 2017数据集 与COCO valminusminival 2014数据集相当。 因此,使用 COCO 2017 训练-验证切分集来重做结果是可以的。

预训练模型

我使用ImageNet数据在 Caffe中为骨干网络预训练权重。

  • ResNet50,ResNet101,ResNet152

  • VGG16 (vgg骨干网络现在还没有完成)

下载它们并把它们放在 {repo_root}/data/pretrained_model路径下。

你可以使用下面的命令行语句将它们全部下载下来:

- 额外需要的安装包:argparse_color_formater, colorama

python tools/download_imagenet_weights.py

注: Caffe的预训练权重比Pytorch 预训练的效果要稍好一些。我们使用Caffe 预训练上面链接的模型来重做结果。顺便提一点,Detectron(一个开源目标检测库)也使用Caffe预训练得到的权重。

如果你想用pytorch预训练模型,请记住将图片数据从BGR矩阵转化为RGB矩阵,并且也用pytorch预训练模型过程中相同的数据处理方法(去均值以及标准化)。

训练

  • 基于res50骨干网络从头开始训练mask-rcnn网络

python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}

使用 --bs 来将默认的批处理规模 (例如8)改变为适合你GPU的合适值。类似地还有--nw(数据加载线程在config.py中默认为4)。

使用 —use_tfboard 在Tensorboard上展示损失函数的对数值。

  • 在每个训练期结束的时候,通过完全相同的设置对训练效果进行概括性展示。

python tools/train_net.py --dataset coco2017 --cfg configs/e2e_mask_rcnn_R-50-C4.yml --resume --load_ckpt {path/to/the/checkpoint} --bs {batch_size}

w/ 和 w/o --resume的区别:如果规定了--resume,优化器状态将会被从 checkpoint文件中加载下来,否则将不会加载。

  • 训练 keypoint-rcnn网络

python tools/train_net.py --dataset keypoints_coco2017 ...

  • Detectron预训练权重的调整

python train_net.py --dataset coco2017 --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --bs {batch_size}

注:优化器状态 (SGD的动量) 没有被加载(或被实现)。

推断结果

python tools/infer_simple.py --dataset coco --cfg cfgs/e2e_mask_rcnn_R-50-C4.yml --load_detectron {path/to/detectron/weight} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations}

--output_dir 默认为infer_outputs。

衡量标准

keypoint_rcnn

  • e2e_keypoint_rcnn_R-50-FPN

训练命令行: python tools/train_net.py --dataset keypoints_coco2017 --cfg configs/e2e_keypoint_rcnn_R-50-FPN.yaml --bs 8

以8张图片为一个批训练集,将数据集训练6个周期,从第5个和第6个训练周期开始后学习率以0.1倍速衰减。每个周期迭代 (113198 / 8) (向下取整)= 14149次。

数据集: keypoints_coco_2017_val

任务:框定盒

任务:关键点

表格中的值为Detectron e2e_keypoint_rcnn_R-50-FPN_1x网络得到的AP值,该网络以16张图片为批训练集迭代训练90000次,在第60000次和第80000次迭代开始后学习率以0.1倍速衰减。

可视化

从头开始基于coco_train_2017数据训练 e2e_mask_rcnn_R-50_C4 网络,以4张图片为一批进行处理,训练了1 个训练周期:

Github原址 https://github.com/roytseng-tw/Detectron.pytorch/blob/master/README.md

Pytorch实现的语义分割器的更多相关文章

  1. PyTorch中的MIT ADE20K数据集的语义分割

    PyTorch中的MIT ADE20K数据集的语义分割 代码地址:https://github.com/CSAILVision/semantic-segmentation-pytorch Semant ...

  2. 使用LabVIEW实现基于pytorch的DeepLabv3图像语义分割

    前言 今天我们一起来看一下如何使用LabVIEW实现语义分割. 一.什么是语义分割 图像语义分割(semantic segmentation),从字面意思上理解就是让计算机根据图像的语义来进行分割,例 ...

  3. 【Semantic segmentation Overview】一文概览主要语义分割网络(转)

    文章来源:https://www.tinymind.cn/articles/410 本文来自 CSDN 网站,译者蓝三金 图像的语义分割是将输入图像中的每个像素分配一个语义类别,以得到像素化的密集分类 ...

  4. 语义分割丨PSPNet源码解析「训练阶段」

    引言 之前一段时间在参与语义分割的项目,最近有时间了,正好把这段时间的所学总结一下. 在代码上,语义分割的框架会比目标检测简单很多,但其中也涉及了很多细节.在这篇文章中,我以PSPNet为例,解读一下 ...

  5. DeepLabV3+语义分割实战

    DeepLabV3+语义分割实战 语义分割是计算机视觉的一项重要任务,本文使用Jittor框架实现了DeepLabV3+语义分割模型. DeepLabV3+论文:https://arxiv.org/p ...

  6. 语义分割的简单指南 A Simple Guide to Semantic Segmentation

    语义分割是将标签分配给图像中的每个像素的过程.这与分类形成鲜明对比,其中单个标签被分配给整个图片.语义分段将同一类的多个对象视为单个实体.另一方面,实例分段将同一类的多个对象视为不同的单个对象(或实例 ...

  7. 比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab

    简介 语义分割:给图像的每个像素点标注类别.通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关.利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求.现有算法的主要区 ...

  8. Learning a Discriminative Feature Network for Semantic Segmentation(语义分割DFN,区别特征网络)

    1.介绍 语义分割通常有两个问题:类内不一致性(同一物体分成两类)和类间不确定性(不同物体分成同一类).本文从宏观角度,认为语义分割不是标记像素而是标记一个整体,提出了两个结构解决这两个问题,平滑网络 ...

  9. 语义分割之车道线检测Lanenet(tensorflow版)

    Lanenet 一个端到端的网络,包含Lanenet+HNet两个网络模型,其中,Lanenet完成对车道线的实例分割,HNet是一个小网络结构,负责预测变换矩阵H,使用转换矩阵H对同属一条车道线的所 ...

随机推荐

  1. K 最近邻(k-nearest neighbours,KNN)算法

     KNN用于分类和回归,需要考虑最近的邻居. 分类就是编组. 回归就是预测结果(如数字). 特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字. 能否挑选合适的特征事关KNN算法的 ...

  2. 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST

    目录 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNIST 下载数据集 加载数据集 构建神经网络 反向传播(BP)算法 进行预测 F1验证 总结 参考 数据挖掘入门系 ...

  3. 图解JVM类加载机制和双亲委派模型

    我们都知道以 .java 结尾的 Java 源文件,经过编译之后会变成 .class 结尾的字节码文件.JVM 通过类加载器来加载字节码文件,然后再执行程序. 什么时候加载一个类 那么,什么时候类加载 ...

  4. Collections.sort详解

    Collections.sort(list, new PriceComparator());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序. Com ...

  5. 大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?

    前言 博文地址:https://sourl.cn/URptix 当一个 HTTP 请求到达 Tomcat,Tomcat 将会从线程池中取出线程,然后按照如下流程处理请求: 将请求信息解析为 HttpS ...

  6. 解读windows认证

    0x00 前言 dll劫持的近期忙,没时间写,先给大家写个windows认证的水文. 0x01 windows认证协议 windows上的认证大致分为本地认证,ntlm协议,和Kerberos协议. ...

  7. Face The Right Way POJ - 3276(区间)

    Farmer John has arranged his N (1 ≤ N ≤ 5,000) cows in a row and many of them are facing forward, li ...

  8. 在操作Git Bash时出现的问题

    参考博客:https://blog.csdn.net/weixin_44394753/article/details/91410463 1.问题1 $ git remote add origin gi ...

  9. Spring 中使用 ActiveMQ 笔记

    首先需要在 pom.xml 中添加如下两个 jar 包:spring-jms 与 activemq-core,其依赖的 jar 包会自动下载 接着进行相关配置 @Configuration publi ...

  10. Shell:Day09.笔记

    awk [单独的编程语言解释器]1.awk介绍 全称:Aho Weinberger Kernaighan 三个人的首字母缩写:  1970年第一次出现在Unix机器上,后来在开源领域使用它: 所以,我 ...