FAIR的detectron平台官方demo是基于MSCOCO数据集训练的,小白从faster rcnn一路走来,用的都是voc2007数据集格式,呕心沥血标注了voc2007格式的自建数据集,不能用了?不可以!
我没找到detectron官方给出的voc转coco代码,幸好MCOCO有官方的cocoapi,支持多种数据集转coco格式,伸手党福利。小白关注的是目标识别,按照本文的方法keypoint和segmention都会一并转换成json格式,但是我只测试了目标识别功能。
matlab新建脚本文件,输入以下代码,并将cocoapi下MatlabAPI添加到路径。
首先编译下gason解析器,然后调用matlab CocoUtils类中的convertPascalGt function转换VOC数据集标签为coco数据集:
mex('CXXFLAGS=\$CXXFLAGS -std=c++11 -Wall','-largeArrayDims',...
'private/gasonMex.cpp','../common/gason.cpp',...
'-I../common/','-outdir','private');
CocoUtils.convertPascalGt( 'D:/datasets', '2007', 'trainval', 'D:/datasets/pascal_trainval2007.json')
CocoUtils.convertPascalGt( 'D:/datasets', '2007', 'test', 'D:/datasets/pascal_test2007.json')
注意这里是调用函数格式:CocoUtils.convertPascalGt( dataDir, year, split, annFile ),dataDir是voc2007路径,year是voc年份,split写val或train或test,最后输出的json文件路径与文件名.
转换过程很快,转换结束后,把生成的json文件标签按照如下的文件夹结构放入到annotations下:
VOC
|_ JPEGImages
| |_ .jpg
| |_ ...
| |_ .jpg
|_ annotations
| |_ pascal_trainval.json
| |_ ...
|_ VOCdevkit
VOCdevkit
1. VOCopts.classes={...
2. '你的标签1'
3. '你的标签2'
4. '你的标签3'
5. '你的标签4'};
wget https://s3-us-west-2.amazonaws.com/detectron/ImageNetPretrained/MSRA/R-50.pkl /tmp/detectron/detectron-download-cache/ImageNetPretrained/MSRA/R-50.pkl
wget https://s3-us-west-2.amazonaws.com/detectron/36225732/12_2017_baselines/mask_rcnn_R-50-FPN_2x.yaml.08_43_08.gDqBz9zS/output/train/coco_2014_train%3Acoco_2014_valminusminival/generalized_rcnn/model_final.pkl
在detectron路径下新建experiment,把configs/getting_started/tutoria_1gpu_e2e_faster_rcnn_R-50FPN.yaml复制到experiment下,并重命名为e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml:
cd $DETECTORN
mkdir experiments && cd experiments
cp ../configs/getting_started/tutorial_1gpu_e2e_faster_rcnn_R-50-FPN.yaml e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml
打开e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml,修改第三行 NUM_CLASSES: 后面数字为自建数据集标签种类+1,例如10种标签,那么就写11.
同时在40行TRAIN中修改WEIGHTS为预训练 模型路径,指向步骤2中下载的model_final.pkl
修改DATASATS为:
'voc_2007_train'
同时修改TEST中DATASETS为:
'voc_2007_test'
'voc_2007_train': {
IM_DIR:
_DATA_DIR + '/VOC2007/JPEGImages',
ANN_FN:
_DATA_DIR + '/VOC2007/annotations/pascal_trainval2007.json',
DEVKIT_DIR:
_DATA_DIR + '/VOC2007/VOCdevkit2007'
},
'voc_2007_test': {
IM_DIR:
_DATA_DIR + '/VOC2007/JPEGImages',
ANN_FN:
_DATA_DIR + '/VOC2007/annotations/pascal_test2007.json',
DEVKIT_DIR:
_DATA_DIR + '/VOC2007/VOCdevkit2007'
},
lib/modeling/fast_rcnn_heads.py, 修改所有的cls_score 为cls_score_voc, 以及bbox_pred 为bbox_pred_voc.
注意在训练结束后inferece时,需要将cls_score_voc以及bbox_pred_voc改回。不然会报错
python2 tools/train_net.py --cfg experiments/e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml OUTPUT_DIR experiments/output
训练速度比py faster rcnn或matlab版的faster rcnn都快
python2 tools/infer_simple.py --cfg experiments/e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml \
--output-dir /tmp/detectron-visualizations --wts /训练结果路径/model_final.pkl \
demo2
detectron根目录下,新建demo2文件夹,并将测试图像放在demo2中
python2 tools/test_net.py \
--cfg experiments/e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml \
TEST.WEIGHTS /训练结果路径/model_final.pkl \
NUM_GPUS 1
PS:若对训练结果不满意,可以尝试修改训练配置文件,然后删除output里面内容,再次训练。
2-9步骤参考了github开源项目,并修订了其中的 bug