DETECTRON Mask_RCNN训练及使用

这个还可以关联pascal voc等等,但pascal voc主要是分割等,关键点的话就coco,posetrack

COCO数据集

下载:https://blog.csdn.net/u014734886/article/details/78830713

Setting Up Datasets

This directory contains symlinks to data locations.

Creating Symlinks for COCO

1.COCO 数据集文件结构如下

coco
|_ coco_train2014
|  |_ <im-1-name>.jpg
|  |_ ...
|  |_ <im-N-name>.jpg
|_ coco_val2014
|_ ...
|_ annotations
   |_ instances_train2014.json
   |_ ...

Symlink the COCO dataset:

ln -s /path/to/coco detectron/detectron/datasets/data/coco

2.否则,大概是这样。

mkdir -p detectron/detectron/datasets/data/coco
ln -s /media/vivian/资料/datesets/coco_train2014 detectron/detectron/datasets/data/coco/
ln -s /media/vivian/资料/datesets/coco_val2014 detectron/detectron/datasets/data/coco/
ln -s /media/vivian/资料/datesets/annotations detectron/detectron/datasets/data/coco/annotations
ln -s a/ b/      创建软连接 
rm -fr xxxx/ 加了个/ 这个是删除文件夹 
rm -fr xxxx 没有/ 这个是删除软链接

COCO Minival Annotations

Our custom minival and valminusminival annotations are available for download here. Please note that minival is exactly equivalent to the recently defined 2017 val set. Similarly, the union of valminusminival and the 2014 train is exactly equivalent to the 2017 train set. To complete installation of the COCO dataset, you will need to copy the minival and valminusminival json annotation files to the coco/annotations directory referenced above.

我们的自定义minival and valminusminival 注释可在[此处下载]。 请注意,minival与最近定义的2017年val set完全相同。 同样,valminusminival和2014 train的联合完全相同于2017 train set。 要完成COCO数据集的安装,您需要将minival和valminusminival json注释文件复制到上面引用的coco / annotations目录。

注意:这个官网给的格式不是上面的文件结构,我也不知道作者啥意思。不过有个汇总的(官网加这个):

1.注意更改输出文件地址,先新建文件夹outputs,
--output-dir /tmp/detectron-visualizations 为outputs/detectron-visualizations  是测试图片的结果
OUTPUT_DIR outputs/detectron-output 即训练的输出文件夹
2.缓存文件(预训练模型(训练)+PROPOSAL_FILES(Using Precomputed RPN Proposals训练和测试用到)的地址:
detectron/core/config里面的__C.DOWNLOAD_CACHE = '/tmp/detectron-download-cache' 改成'/detectron/pretrained_models'。如果下载好了,在配置文件更改相关地址。

3.关于测试。

1) 自动下载的文件可能不完整。

2) 测试 TEST.WEIGHTS 是train得到的.pkl文件。
3) 用预先训练的rpn来训练时(非端对端),有两种DATASETS和PROPOSAL
DATASETS: ('keypoints_coco_2014_train', 'keypoints_coco_2014_valminusminival')

这个应该就是上面说的valminusminival和2014 train的联合完全相同于2017 train set。即上面数据集相当于2017 train set了
PROPOSAL_FILES: ('.../rpn_person_only_R-50-FPN_1x.yaml.08_10_08.0ZWmJm6F/output/test/keypoints_coco_2014_train/generalized_rcnn/rpn_proposals.pkl','.../test/keypoints_coco_2014_valminusminival/generalized_rcnn/rpn_proposals.pkl')
用来测试/验证的权重时候,rpn模型有两种
DATASETS: ('keypoints_coco_2014_minival',)
PROPOSAL_FILES: ('.../test/keypoints_coco_2014_minival/generalized_rcnn/rpn_proposals.pkl',)

测试出现的问题:
 

INFO json_dataset.py: 253: Loading proposals from: /home/vivian/HelloWorld/detect_and_track_new/detectron/pretrained_models/35998996/12_2017_baselines/rpn_person_only_R-50-FPN_1x.yaml.08_10_08.0ZWmJm6F/output/test/keypoints_coco_2014_minival/generalized_rcnn/rpn_proposals.pkl

  File "/home/vivian/HelloWorld/detect_and_track_new/detectron/detectron/utils/io.py", line 60, in load_object
    return pickle.load(f)
EOFError

EOFError是文件找不到 故重新下一个。
我之前是下载完了之后,改了TEST.PROPOSAL_FILES: 的地址,删除未下载完整的,把相应地址改成原来的链接,让其下载

  • 训练

这些参考https://blog.csdn.net/whz1861/article/details/78783597  

  • 样本生成:
    • 正样本:RoI(IoU>0.5)
    • 负样本:其他
  • Mask Loss
    • 只计算postive roi上的loss
    • mask的真值ground-truth:为RoI和ground-truth的交集
  • 参数
  • mini-batch为2
  • 每张图像产生N个RoI区域,其中正负样本的比例为1:3
    • N=64 for C4
    • N=256 for FPN
    • 学习率:0.02/120k –> 0.002
    • 迭代次数:160k
    • momentum:0.9
    • decay:0.0001
    • RPN参数:
    • 5 scales
    • 3 aspect ratios
  • 测试
  • proposal
    • 300 for C4
    • 1000 for FPN
    • 在这些候选区域上进行box reg,然后进行nms操作
    • mask只运行在最高的100个检测框中,输出K masks【只用第k-th mask】
      • 这点和训练不同,但是可以有效提高运行效率

1、与之前相同,当IoU与Ground Truth的IoU大于0.5时才会被认为有效的RoI,L{_{mask}}只把有效RoI计算进去。

2、采用image-centric training,图像短边resize到800,每个GPU的mini-batch设置为2,每个图像生成N个RoI,对于C4,backbone的N=64,对于FPN作为backbone的,N=512。作者服务器中使用了8块GPU,所以总的minibatch是16,迭代了160k次,初始lr=0.02,在迭代到120k次时,将lr设定到 lr=0.002,另外学习率的weight_decay=0.0001,momentum = 0.9。如果是resnext,初始lr=0.01,每个GPU的mini-batch是1。

3、RPN的anchors有5种scale,3种ratios。为了方便剥离、如果没有特别指出,则RPN网络是单独训练的且不与Mask R-CNN共享权重。但是在本论文中,RPN和Mask R-CNN使用一个backbone,所以他们的权重是共享的。(Ablation Experiments 为了方便研究整个网络中哪个部分其的作用到底有多大,需要把各部分剥离开)

Inference:在测试时,使用C4 backbone情况下proposal number=300,使用FPN时proposal number=1000。然后在这些proposal上运行bbox预测,接着进行非极大值抑制。mask分支只应用在得分最高的100个proposal上。顺序和train是不同的,但这样做可以提高速度和精度。mask 分支对于每个roi可以预测k个类别,但是我们只要背景和前景两种,所以只用k-th mask,k是根据分类分支得到的类型。然后把k-th mask resize成roi大小,同时使用阈值分割(threshold=0.5)二值化

改进分析

  • Backbone Architecture
    • 网络越深,效果越好
  • Multinomial vs. Independent Masks
    • 分割任务与分类任务解耦合后,效果更好
  • class-Specific vs. Class-Agnostic Masks:
    • 输出K个m×m
  • 个分割mask和输出1个m×m
    • 个分割mask【不区分类别信息】进行对比,发现区别类别分割后,效果更好
    • AP从29.7升到了30.3
  • RoIAlign
    • 通过上述的图c,d可以看出,该操作能提高大概3points
    • RoiWarp采用双线性插值,但是没有对input和feature层坐标进行对齐,从而效果比RoIAlign差很多
  • Mask Branch
    • 进行分割的时候,FCN要好于MLP

姿态估计实验:

  • 类别数量:Human Pose中的keypoints个数
  • 将m×m分割mask的label/target变成one-hot形式
    • target:只有一个pixel标记为前景
    • 对m×m个输出计算交叉熵,作为loss【这样可以激励网络学习只检测单个点】
  • 输出仍然是K个m×m个mask
  • 采用ResNet-FPN作为基础网络,
    • 然后通过一系列的3x3 512-d的卷积进行特征融合,
    • 之后,通过解卷积deconv进行上采样到56x56【原始的是28x28】像素越高,效果越好
  • 训练
  • 数据集:COCO trainval35k
  • randomly scales from [640, 800]测试的时候,固定为800
  • 迭代次数:90K
  • 学习率:0.02/60k–>0.002/8k–>0.0002
  • NMS:0.5

举例ResNet50 Multi-GPU 训练步骤:https://blog.csdn.net/zziahgf/article/details/79022490

ResNet50 模型训练主要包括:

采用 brew 创建训练网络和测试网络;
采用 model helper的 CreateDB 来创建图片数据集读取器(database reader);
创建训练函数来基于一张或多张 GPU 进行 ResNet50 模型训练;
创建并行化(parallelized)模型;
循环训练多个 epoches,每个 epoch 中,包括: 
对其每个 batch 图片进行模型训练;
运行测试模型;
计算时间,精度,并显示结果.
--------------------- 

3. 模型创建与训练
3.1 创建 CNN 网络
采用 Caffe2 Operators - ModelHelper 创建CNN网络:
3.2 从 DB 读取数据
reader = catos_model.CreateDB(name, db, db_type)
3.3 图片变换
Caffe2 编译时需要有 opencv
在实际场景中,图片可能有不同的尺寸(size),长宽比(aspect ratios) 以及旋转角度(orientations),因此训练时需要尽可能的使图片包含更多的情况.
3.4 创建 Residual 网络
Caffe2 提供了 resnet 的创建函数:from caffe2.python.models import resnet
3.5 网络初始化
Caffe2 model helper 对象提供了内在函数,用于采用 BP 算法进行网络学习
3.6 梯度优化
如果不采用内存优化,可以减少 batch size,但这里进行了内存优化.

Caffe2 提供了 memonger函数来进行内存优化,重用计算的梯度.
3.7 单 GPU 网络训练

3.8 多 GPU 并行化
Caffe2 的 data_parallel_model及函数 Parallelize_GPU 来实现多 GPU 并行化.
3.9 创建测试模型
类似于训练网络的创建:

ModelHelper - 创建 model helper object,命名为 “test”;
CreateDB - 创建数据读取 reader,命名为 “test_reader”;
Parallelize_GPU - 并行化模型,设置 param_update_builder_fun=None,以跳过 BP;
workspace.RunNetOnce和 workspace.CreateNet - 启动测试网络

3.10 显示过程信息
在每个 epoch 结束后,对网络表现进行检查,记录训练模型和测试模型的精度.
3.11 Multi-GPU 训练及测试
 

猜你喜欢

转载自blog.csdn.net/m0_37644085/article/details/84962718
今日推荐