FAIR的Detectron平台是facebook基于coco数据集训练的,虽然官方建议使用coco格式数据集训练模型,但很多人习惯于用voc格式标记数据,也有现成的xml不知如何使用Detectron。本博文假设已经做好voc格式数据,稍做转换使其能够在Detectron上训练。本博文主要以resnet-50-fpn-faster-rcnn训练为例,只测试目标检测,说明如何使用自己的voc数据训练模型,关于FAIR训练好的模型demo部分不再叙述。
参考blog: https://blog.csdn.net/meccaendless/article/details/79457330
准备工作:
1、安装caffe2
参考blog: https://blog.csdn.net/yan_joy/article/details/70241319
(1) 安装caffe2依赖库
sudo apt-get update sudo apt-get install -y --no-install-recommends \ build-essential \ cmake \ git \ libgoogle-glog-dev \ libprotobuf-dev \ protobuf-compiler \ python-dev \ python-pip sudo pip install numpy protobuf
其他可选依赖项:
sudo apt-get install -y --no-install-recommends \ libgtest-dev \ libiomp-dev \ libleveldb-dev \ liblmdb-dev \ libopencv-dev \ libopenmpi-dev \ libsnappy-dev \ openmpi-bin \ openmpi-doc \ python-pydot sudo -H pip install --upgrade pip
(2) 安装cuda和cudnn
参考blog: https://blog.csdn.net/yggaoeecs/article/details/79163789
(3) 安装caffe2
git clone --recursive https://github.com/caffe2/caffe2 cd caffe2 make
安装不用管makefile,它会根据你电脑里的库自行编译
cd build sudo make install python -c 'from caffe2.python import core' 2>/dev/null && echo "Success" || echo "Failure"
出现"Success"表示安装成功!
测试GPU
python -m caffe2.python.operator_test.relu_op_test
(4) caffe2环境变量
sudo vim /etc/profile
export PYTHONPATH=/usr/local:$PYTHONPATH export PYTHONPATH=$PYTHONPATH:/your/path/to/caffe2/build export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
2、安装Detectron
(1) 依赖库安装
pip install numpy>=1.13 pyyaml>=3.12 matplotlib opencv-python>=3.2 setuptools Cython mock scipy
(2) COCOAPI安装
# COCOAPI=/path/to/clone/cocoapi git clone https://github.com/cocodataset/cocoapi.git $COCOAPI cd $COCOAPI/PythonAPI # Install into global site-packages make install # Alternatively, if you do not have permissions or prefer # not to install the COCO API into global site-packages python2 setup.py install --user
(3) Detectron安装
# DETECTRON=/path/to/clone/detectron git clone https://github.com/facebookresearch/detectron $DETECTRON
编译python模块lib:
cd $DETECTRON/lib && make
测试:
python2 $DETECTRON/tests/test_spatial_narrow_as_op.py
出现"OK"则安装成功!
准备数据:
可以使用cocoapi在MATLAB脚本转换数据标签xml到json格式
参考blog: https://blog.csdn.net/meccaendless/article/details/79457330
matlab新建脚本,将cocoapi中的MatlabAPI添加到路径,调用matlab CocoUtils类中的convertPascalGt function转换VOC数据集标签:
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/voc_2007_trainval.json') CocoUtils.convertPascalGt( 'D:/datasets', '2007', 'test', 'D:/datasets/voc_2007_test.json') CocoUtils.convertPascalGt( 'D:/datasets', '2007', 'train', 'D:/datasets/voc_2007_train.json') CocoUtils.convertPascalGt( 'D:/datasets', '2007', 'val', 'D:/datasets/voc_2007_val.json')
三行代码搞定,其中'D:/datasets'改成你的voc格式数据所在路径,'D:/datasets/pascal_test2007.json'改成你要写到的json格式标签路径。
你也可以用我们写的python脚本转换,将代码中相应路径更改即可。
之后,将数据与标签连同原版的VOCdevkit2007除JPEGImages以外的文件按如下文件夹结构放入:
VOC2007 |_ JPEGImages | |_ <im-1-name>.jpg | |_ ... | |_ <im-N-name>.jpg |_ annotations | |_ pascal_trainval2007.json | |_ ... |_ VOCdevkit2007 |_ VOC2007 |_ ImageSets |_ Annotations |_ VOCcode |_ local |_ results |_ ...
为什么需要加入原版ImageSets和Annotations后面会讲到,将VOCcode里VOCinit.m文件中标签名称按自己数据集更改:
VOCopts.classes={...
'你的标签1'
'你的标签2'
...};
训练模型:
1、下载预训练模型
下载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
网不好的可以用迅雷等下载工具离线下载很快。
detectron下新建文件夹pre-trained_model把R-50.pkl模型文件放在该文件夹下。
2、建立数据软链接
cd $Detectron/lib/dataset/data ln -s /your/path/to/VOC2007 VOC2007
3、修改配置文件
detectron下新建文件夹experiments/cfgs,将配置文件复制到该文件夹下:
cd $DETECTRON cd experiments/cfgs 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: 81
为自己数据集类别数+1
修改
WEIGHTS: https://s3-us-west-2.amazonaws.com/detectron/ImageNetPretrained/MSRA/R-50.pkl
为/pre-trained_model/R-50.pkl
修改
DATASETS: ('coco_2014_train',)
DATASETS: ('coco_2014_minival',)
为
DATASETS: ('voc_2007_trainval',)
DATASETS: ('voc_2007_test',)
在
OUTPUT_DIR:
OUTPUT_DIR:
下增加你需要输出模型的路径
说明:参考blog(https://blog.csdn.net/meccaendless/article/details/79457330)中说需要更改lib/modeling/fast_rcnn_heads.py中所有的cls_score和bbox_pred,这是因为Detectron中测试voc的文件还是faster rcnn中的方法读取Annotations,但训练需要的是json格式,这就导致训练模型对应不上模型层的名字。所以我们需要把原voc中的ImageSets和Annotations也放入数据集文件夹中,就可以保证训练和测试不出问题。
4、开始训练
python2 tools/train_net.py --cfg experiments/e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml OUTPUT_DIR experiments/output
5、测试结果
python2 tools/test_net.py \
--cfg experiments/e2e_faster_rcnn_resnet-50-FPN_pascal2007.yaml \
TEST.WEIGHTS /your/path/to/model_final.pkl \
NUM_GPUS 1
修改yaml配置文件中scale, lr, iter等参数反复训练达到最好效果。