本文为雷锋字幕组编译的Github项目,原标题A Pytorch Implementation of Detectron,作者为 roytseng-tw。 翻译 | 杨婉迪 陈明霏 整理 | 凡江
使用Detectron预训练权重输出 *e2e_mask_rcnn-R-101-FPN_2x* 的示例
从Detectron输出的相关示例
使用Detectron预训练权重输出 *e2e_keypoint_rcnn-R-50-FPN_s1x*的示例
这个代码是按照Detectron的安装架构来实现的,仅支持部分功能性,你可以通过点击此链接(https://github.com/roytseng-tw/Detectron.pytorch/blob/master/README.md#supported-network-modules)来获取更多相关信息。
通过这个代码,你可以……
这个储存器最早是建在jwyang/faster-rcnn.pytorch上的,但是经过多次的修改,这个结构已经变了很多了而且现在更类似于Detectron。为了直接从正式的预训练权重文件中重新得到结果,我刻意将所有东西弄得和Detectron的运行方法相似或者一致了。
这个工具有以下特征:
除此之外,我提供一个定制化的模型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
注意:这个命名和那个用在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
更多的细节
一些选项是不能使用的因为相关的功能性还没有实现。但是有一些不能被使用的原因是我用不同方法安装了程序。
这里有一些没有影响但值得注意的选项:
--epochs:要训练多少 epochs 。一个 epoch意味着要遍历整个训练集并且将默认值设为6。
--lr_decay_epochs:每一epochs都是衰减学习率的。 衰减是发生在每个 epoch的开始。 Epoch 是 以0索引开始的,默认值是 [4, 5]。
要获得更多地命令行参数,请参考python train_net.py --help
当更多地选项被提供:
TBA
开始
克隆这个仓库:
git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git
命令
在 python3下测试。
pytorch==0.3.1 (cuda80, cudnn7.1.2)
torchvision==0.2.0
numpy
scipy
opencv
pyyaml
pycocotools — COCO数据集专用,也可以通过 pip安装。
tensorboardX —可以在Tensorboard上记录losses。
编写
编写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 ├── 注释 | ├── 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中为骨干网络预训练权重。
下载它们并把它们放在 {repo_root}/data/pretrained_model路径下。
你可以使用下面的命令行语句将它们全部下载下来:
- 额外需要的安装包:argparse_color_formater, colorama
python tools/download_imagenet_weights.py
注: Caffe的预训练权重比Pytorch 预训练的效果要稍好一些。我们使用Caffe 预训练上面链接的模型来重做结果。顺便提一点,Detectron(一个开源目标检测库)也使用Caffe预训练得到的权重。
如果你想用pytorch预训练模型,请记住将图片数据从BGR矩阵转化为RGB矩阵,并且也用pytorch预训练模型过程中相同的数据处理方法(去均值以及标准化)。
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文件中加载下来,否则将不会加载。
python tools/train_net.py --dataset keypoints_coco2017 ...
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
训练命令行: 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