代码地址:https://github.com/smallcorgi/Faster-RCNN_TF
软件要求:tensorflow 和python包:cpython、python-opencv、easydict
python包安装命令行:sudo apt-get install cython python-opencv
sudo pip install easydict
硬件要求:For training the end-to-end version of Faster R-CNN with VGG16, 3G of GPU memory is sufficient (using CUDNN)
demo运行步骤
1、获取代码
git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git
2、建立cyphon模块
cd $FRCN_ROOT/lib
make (在下载的faster rcnn根目录下的lib文件下执行make)
3、 下载在PASCAL VOC 2007上训练的模型去测试
模型地址:https://drive.google.com/open?id=0ByuDEGFYmWsbZ0EzeUlHcGFIVWM或
https://www.dropbox.com/s/cfz3blmtmwj6bdh/VGGnet_fast_rcnn_iter_70000.ckpt?dl=0
4、运行demo
cd $FRCN_ROOT (在faster rcnn根目录下运行)
python ./tools/demo.py --model model_path
运行demo过程中遇到的错误
1、g++: error: roi_pooling_op.cu.o: No such file or directory
解决:Setting the following should make it work (it worked at least for me)
(1) export PATH=$PATH:/usr/local/cuda-8.0/bin/ (or your corresponding cuda path) for your terminal
(2) In make.sh file inside lib directory, do CXXFLAGS='-D_MWAITXINTRIN_H_INCLUDED'
2、importerror: no module named gpu_nms
解决:I have solved the problem of generating gpu_nms.so by revising cudaconfig = {'home':home, 'nvcc':nvcc, 'include': pjoin(home, 'include'), 'lib64': pjoin(home, 'lib64')}
as cudaconfig = {'home':home, 'nvcc':nvcc, 'include': pjoin(home, 'include'), 'lib64': pjoin(home, 'lib')}
3、ensorflow.python.framework.errors.NotFoundError: /home/Projects/Faster-RCNN_TF/tools/../lib/roi_pooling_layer/roi_pooling.so: undefined symbol: _ZN10tensorflow7strings6StrCatB5cxx11ERKNS0_8AlphaNumE
解决: revise the CUDA_PATH
and add -D_GLIBCXX_USE_CXX11_ABI=0
in /lib/make.sh
update as:
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc -D_GLIBCXX_USE_CXX11_ABI=0 \ roi_pooling_op.cu.o -I $TF_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \ -lcudart -L $CUDA_PATH/lib64
训练模型步骤:
1、下载 VOCdevkit的训练验证和测试集
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
2、解压上面下载的三个压缩包
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
严格按照命令解压,这样解压后的文件嵌套形式不会变。
三个压缩文件解压后文件存储在一个文件夹VOCdekit下,这个文件夹下包含VOCcode和VOC2007等文件夹,结构如下:
$VOCdevkit/ # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...
3、手动将下载的数据集文件夹VOCdevkit修改名字为VOCdevkit2007放入faster rcnn目录下的Data文件夹里。也可以通过以下代码实现,改名字是因为代码中是VOCdevkit2007
cd $FRCN_ROOT/data
ln -s $VOCdevkit VOCdevkit2007
4、下载预训练模型,即将其参数作为我们训练模型的初始化参数
下载地址:https://drive.google.com/open?id=0ByuDEGFYmWsbNVF5eExySUtMZmM或
https://www.dropbox.com/s/po2kzdhdgl4ix55/VGG_imagenet.npy?dl=0
并在faster rcnn目录下的data文件夹下新建文件夹pretrain_model,将下载好的预训练模型VGG_imagenet.npy放进去。
5、训练和测试模型
cd $FRCN_ROOT
./experiments/scripts/faster_rcnn_end2end.sh $DEVICE $DEVICE_ID VGG16 pascal_voc
其中$device要换成自己的硬件,即gpu 。 $device_id换成自己的硬件号,级0或者1或者......
训练和测试模型中遇到的错误:
1、训练完模型后会出现如下错误
Wrote snapshot to $Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt
grep: experiments/logs/faster_rcnn_end2end_VGG16_.txt.2017-09-14_21-36-10: No such file or directory
+ python ./tools/test_net.py --device gpu --device_id 0 --weights --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test
test_net.py: error: argument --weights: expected one argument
这是因为tensorflow问题并没有在/output/faster_rcnn_end2end/voc_2007_trainval 中生成VGGnet_fast_rcnn_iter_70000.ckpt文件
解决方法:
Tensorflow has been updated and is saving 3 types of check points (instead of only 1). You will need to change the line in the FASTER-RCNN_TF/fast_rcnn/train.py
:
self.saver = tf.train.Saver(max_to_keep=100)
to:self.saver = tf.train.Saver(max_to_keep=100,write_version=saver_pb2.SaverDef.V1)
And add this in the same train.py
file preamble:from tensorflow.core.protobuf import saver_pb2
重新训练完成后在$Faster-RCNN_TF/output/faster_rcnn_end2end/voc_2007_trainval中生成VGGnet_fast_rcnn_iter_70000.ckpt文件,然后运行python ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test测试模型
训练自己的数据集(这里我以检测一类物体为例n_classes = 2)
1、制作数据集
简单起见,我把自己的数据集整理成和Pascal voc一样的数据格式。VOC2007下应该有Annotations、ImageSets和JPEGImages三个文件夹,其中:Annotations是标注数据xml文件,JPEGImages是和Annotations中的xml文件一一对应的图片文件,两个文件除了后缀分别是.xml和.jpg,其他部分应该一样,都应该是六位数字,比如:000001.jpg和000001.xml。ImageSets下有一个Main文件夹,文件夹内有trainval.txt、train.txt、val.txt和test.txt四个文件,文件中是图片名称,不带后缀.jpg和.xml,单纯的数字。
对数据集图片进行标注,每张图片均可得到相应的xml文件,参考这里http://blog.csdn.net/jesse_mx/article/details/53606897安装标注工具LabelImg,安装完成后,./labelImg.py打开标注工具,标注并生成xml文件。下面将文件名存为txt格式,首先将xml文件或者jpg文件夹中的内容分为四部分这里以xml文件为例,分为train、val、trainval和test四个文件夹,里面是相应的xml文件。这里我按照作者的数据集比例来训练数据,其中trainval和test基本上为1:1,两个加起来是总的数据集。trainval中train和val数目基本也是1:1。下面利用这四个文件夹生成相应的 trainval.txt、train.txt、val.txt和test.txt四个文件。参照这里https://jingyan.baidu.com/article/656db918a7e848e381249c0e.html,其中公式"ren "&A1&" "&B1 用于批量修改文件名,公式=left(文件全名,find(".",文件全名)-1) 文件全名即是A1,用于只保留文件名不带后缀,即可生成txt文件。
2、修改部分文件
lib/pascal_voc.py --> change the classes n_classes = 2
tools/demo.py --> change the classes
VGGnet_train.py --> change the classes
VGGnet_test.py --> change the classes
如果修改的.py文件有相应的.pyc文件,一定要再次编译生成新的.pyc文件。
import py_compile py_compile.compile('/path/to/foo.py')
3、训练完成后用上述的测试脚本得出正确率
运行python ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test测试训练好的模型
4、运行demo看看实际框出的图
python ./tools/demo.py --model output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_70000.ckpt