FAIR开源目标识别平台Detectron从入门到放弃(二) 使用自己的数据集(voc2007格式)训练Detectron

FAIR的detectron平台官方demo是基于MSCOCO数据集训练的,小白从faster rcnn一路走来,用的都是voc2007数据集格式,呕心沥血标注了voc2007格式的自建数据集,不能用了?不可以!

我没找到detectron官方给出的voc转coco代码,幸好MCOCO有官方的cocoapi,支持多种数据集转coco格式,伸手党福利。小白关注的是目标识别,按照本文的方法keypoint和segmention都会一并转换成json格式,但是我只测试了目标识别功能。

1. 将voc数据集标签转换为json格式

从github下载 cocoapi

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文件夹是voc2007官方数据集解压后文件,需根据自己的数据集目标识别种类修改:

1.	VOCopts.classes={...  
2.	   '你的标签1'  
3.	   '你的标签2'  
4.	   '你的标签3'  
5.	   '你的标签4'};  

2. 下载backbone和预训练模型文件:

公司网络不给力,预先下好了resnet50和预训练模型:

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

3.复制训练配置文件到experiment路径下

在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'

4.修改lib/datasets/dataset_catalog.py中

'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'
    },

5. 修改cls_score and bbox_pred

 lib/modeling/fast_rcnn_heads.py, 修改所有的cls_score 为cls_score_voc, 以及bbox_pred 为bbox_pred_voc.

注意在训练结束后inferece时,需要将cls_score_voc以及bbox_pred_voc改回。不然会报错

6. 开始训练

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都快

7. 测试训练结果

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中

9. 评估训练结果 test_net.py

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




你可能感兴趣的:(机器学习,图像处理,深度学习)