您的位置:首页 > 大数据 > 人工智能

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

2018-03-06 16:58 1081 查看
FAIR的detectron平台官方demo是基于MSCOCO数据集训练的,小白从faster rcnn一路走来,用的都是voc2007数据集格式,呕心沥血标注了voc2007格式的自建数据集,不能用了?不可以!我没找到detectron官方给出的voc转coco代码,幸好MCOCO有官方的cocoapi,支持多种数据集转coco格式,伸手党福利。小白关注的是目标识别,按照本文的方法keypoint和segmention都会一并转换成json格式,但是我只测试了目标识别功能。

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

从github下载cocoapimatlab新建脚本文件,输入以下代码,并将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<year>
|_ JPEGImages
|  |_ <im-1-name>.jpg
|  |_ ...
|  |_ <im-N-name>.jpg
|_ annotations
|  |_ pascal_trainval<year>.json
|  |_ ...
|_ VOCdevkit<year>
VOCdevkit<year>文件夹是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[/code]
 

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 $DETECTORNmkdir experiments && cd experimentscp ../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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: