备注:此实验基于已部署好的环境下实现(ubantu16.04、python3.6、tensorflow1.12)
一、下载 faster_rcnn代码,并解压
下载链接:https://github.com/endernewton/tf-faster-rcnn
data:存放demo测试数据、预训练模型、训练数据(VOC2007数据格式)
docker:cuda文件
experiments:训练测试sh文件、训练测试过程日志文件
lib: 数据读取、训练模型等文件
tools:模型训练、验证等python文件
二、对网络进行编译
1、进入lib文件夹下,建立cypython块,并返回原路径
cd ./lib
make clean
make
cd ../
2、下载res101预训练模型,创建超链接、运行demo.py
1)预训练模型下载
链接:https://pan.baidu.com/s/1zNWzMxBwQ6qVoXXvN89Peg 密码:0rtb 解压至data路径下,文件夹命名为 voc_2007_trainval+voc_2012_trainval
2)创建预训练模型超链接
NET=res101
TRAIN_IMDB=voc_2007_trainval+voc_2012_trainval
mkdir -p output/${NET}/${TRAIN_IMDB}
cd output/${NET}/${TRAIN_IMDB}
ln -s ../../../data/voc_2007_trainval+voc_2012_trainval ./default
cd ../../..
3)运行/tools/demo.py,将结果保存
demo.py文件头添加:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
保存文件:
for im_name in im_names:
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('Demo for data/demo/{}'.format(im_name))
demo(sess, net, im_name)
plt.savefig("./data/demtest/"+im_name)
测试:
GPU_ID=0
CUDA_VISIBLE_DEVICES=${GPU_ID} ./tools/demo.py
三、下载res101、vgg16/训练模型,下载VOC2007数据集
下载vgg16训练模型:https://pan.baidu.com/s/1aD0jlYGHhZQeeTvNJy0GGQ,密码:45ef。
下载res101训练模型:
在data目录下创建一个imagenet_weights文件夹,解压权重数据并把解压后的vgg_16.ckpt重命名为vgg16.ckpt,resnet_v1_101.ckpt重命名为res101.ckpt
下载VOC2007数据集:解压至data文件夹,将文件名VOCdevkit重命名为VOCdevkit2007,trainval解压至VOCdevkit2007中
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
四、使用训练好的模型对数据进行测试
修改 tf-faster-rcnn/lib/datasets/voc_eval.py的第121行的
with open(cachefile,'w') as f
改成:
with open(cachefile,'wb') as f
同时还要把第105行的
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile)
改成:
cachefile = os.path.join(cachedir, '%s_annots.pkl' % imagesetfile.split("/")[-1].split(".")[0])
测试:
GPU_ID=0
./experiments/scripts/test_faster_rcnn.sh $GPU_ID pascal_voc_0712 res101
五、对VOC2007数据集进行训练验证
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
或者./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc res101
六、训练自己的数据集
1、制作标记数据(下载标记工具labelme、部署并标记)
下载标记工具:https://github.com/CSAILVision/LabelMeAnnotationTool
2、标记数据转VOC2007数据集格式
1)下载标记处理数据工具集:https://github.com/CSAILVision/LabelMeToolbox
2) ./LabelMeToolbox/compatibility/labelme2pascal.m文件是对labelme标记数据转VOV2007数据集格式(./xml文件转换、train\val等数据比例分配)
3) 运行./LabelMeToolbox/test.m文件对labelme2pascal.m文件传参,从而进行数据格式转换和数据比例分配
HOMEIMAGES = '/var/www/html/LabelMeAnnotationTool/Images'; //原图像文件路径
HOMEANNOTATIONS = '/var/www/html/LabelMeAnnotationTool/Annotations'; //原XML文件路径
%LMinstall (HOMEIMAGES, HOMEANNOTATIONS);
%D = LMdatabase(HOMEANNOTATIONS);
D = LMdatabase(HOMEANNOTATIONS, {'zly1'}); //XML文件目标名
databasename = '111'; //原图像与保存图像上级目录
folderdestination = '/home/th/test'; //保存路径
labelme2pascal(D, databasename, HOMEIMAGES, folderdestination);
%[mask, class] = LMobjectmask(D(1).annotation, HOMEIMAGES);
%imshow(colorSegments(mask));
4)将生成的文件拷贝至./tf-faster-rcnn-master/data/VOCdevkit2007/下
3、修改代码
注意:如果先前对VOC2007数据集进行训练测试等操作,必须将tf-faster-rcnn-master/data/cache、tf-faster-rcnn-master/data/res101等文件删除或者更名,如果还是出现网络不匹配问题,建议重新配置,直接运行自己的数据
1)在tf-faster-rcnn/lib/datasets目录下的pascal_voc.py里第36行更改自己的类别,
'_background__'切记不可删掉,把后面的原来的20个label换成自己的,不用更改类别数目,也没有地方可以更改。
2) 网络超参数修改
训练迭代次数ITERS修改:/tf-faster-rcnn-master/experiments/scripts/train_faster_rcnn.sh
测试迭代次数ITERS修改:/tf-faster-rcnn-master/experiments/scripts/test_faster_rcnn.sh


学习率、权重等超参修改:/tf-faster-rcnn-master/lib/model/config.py
3)训练:
./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc vgg16
或者./experiments/scripts/train_faster_rcnn.sh 0 pascal_voc res101
参考文献:https://blog.youkuaiyun.com/hitzijiyingcai/article/details/81808091
https://blog.youkuaiyun.com/hitzijiyingcai/article/details/81914200