参考:https://blog.csdn.net/samylee/article/details/52860038
https://zhuanlan.zhihu.com/p/29971657
第一部分:下载并编译pvanet
1、终端输入:
git clone --recursive https://github.com/sanghoon/pva-faster-rcnn.git
2、建立Cython模块:
cd pva-faster-rcnn/lib
gedit setup.py
此处需要根据GPU 计算能力(查看地址)修改lib下的setup.py第135行 'nvcc': ['-arch=sm_35'
如果是TX2,计算能力为6.2,则修改为'nvcc': ['-arch=sm_62',如果是TITAN V,计算能力为7.0,则修改为'nvcc': ['-arch=sm_70',然后开始编译
make –j4
考虑到TX2有四核CPU,因此选择make -j4
根据自己机器的实际情况设置j后边的参数,网上有人建议选择CPU核数的两倍,也有人说等于核数,实测对比了一下效果,对于同一个编译任务,make很慢,用时32分钟,make -j4 用时11分钟,make -j8也是用时11分钟,make -j16用时11.5分钟。因此对于TX2而言,make -j4即可发挥其最大性能,-j8和-j16多了也不会有明显的改善。
3、编译caffe及pycaffe
cd pva-faster-rcnn/caffe-fast-rcnn
cp Makefile.config.example Makefile.config
sudo gedit Makefile.config
修改Makefile.config文件:去掉第5行cudnn前面的#
USE_CUDNN := 1
如果使用的OPENCV3以上的版本,去掉第21行OPENCV_VERSION前面的#
OPENCV_VERSION := 3
BLAS=atlas(我测试的库,mkl没有试过)(sudo apt-get install libatlas-base-dev即可安装)
去掉87行WITH_PYTHON_LAYER前面的#,注意一定要去掉,不然无法训练数据(测试的时候不需要)
在第90行,添加 /usr/include/hdf5/serial/ 到 INCLUDE_DIRS
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
修改后保存退出,打开Makefile文件,在第181行,把 hdf5_hl 和hdf5修改为hdf5_serial_hl 和 hdf5_serial
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
然后开始编译
make –j4
make pycaffe –j4
第二部分:下载预训练模型
链接:http://pan.baidu.com/s/1kVRRPDd 密码:1cdt
2、将test(1).model重命名为test.model放入$pva-faster-rcnn/models/pvanet/comp/目录下
第三部分:下载voc07数据
打开终端输入:
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
解压(严格按照此顺序):
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
将生成的VOCdevkit文件夹更名为VOCdevkit2007移动至$pva-faster-rcnn/data/目录下面
第四部分:voc07测试预训练模型
终端输入:
cd pva-faster-rcnn
1、full/test.model测试:
./tools/test_net.py --gpu 0 --def models/pvanet/full/test.pt --net models/pvanet/full/test.model --cfg models/pvanet/cfgs/submit_160715.yml
需要注意的是如果缺少test.pt,则将models/pvanet_obsolete下的对应文件复制过来即可
如果运行报错 ImportError: No module named 'yaml'
则运行如下命令进行安装
sudo pip install pyyaml
如果运行报错 ImportError: No module named 'easydict'
则运行如下命令进行安装
sudo pip install easydict
2、Comp/test.model测试:
./tools/test_net.py --gpu 0 --def models/pvanet/comp/test.pt --net models/pvanet/comp/test.model --cfg models/pvanet/cfgs/submit_160715.yml
此测试会得到系列类别的AP值
第五部分:预训练model训练并测试voc07数据
1、训练:
cd pva-faster-rcnn
./tools/train_net.py --gpu 0 --solver models/pvanet/example_finetune/solver.prototxt --weights models/pvanet/full/test.model --iters 100000 --cfg models/pvanet/cfgs/train.yml --imdb voc_2007_trainval
--gpu 序号,单GPU为0
--solver 训练参数文件
--weight 预训练模型,使用Imagenet的预训练模型,若没有,开始训练时很难收敛,loss=nan
--cfg 配置
--imdb 训练数据集名字(需要按照voc或者Coco的命名规则,亦可修改程序来打破规则!详见/lib/datasets/factory.py)
由于程序结构问题,训练的数据集需要覆盖至VOC数据集的文件夹下
~/data/VOCdevkit2007/VOC2007/Annotations和ImageSets和JPEGImages三个文件夹
ImageSets/Main文件中用到的只有trainval.txt这个文件,里面保存所有图片的名字(无后缀),需用程序生成,训练结果会在pva根目录生成output文件夹,模型就在里面
可用find命令、通配符加重定向符快速获取标注文件列表
cd data/VOCdevkit/mydataset/Annotations
find -name "*.xml">/home/yourname/data/VOCdevkit/ImageSets/Main/trainval.txt
然后修改trainval.txt,用替换指令删除掉后缀即可
2、测试:
./tools/test_net.py --gpu 0 --def models/pvanet/example_finetune/test.prototxt --net output/faster_rcnn_pavnet/voc_2007_trainval/pvanet_frcnn_iter_100000.caffemodel --cfg models/pvanet/cfgs/submit_160715.yml
第六部分:预训练model训练并测试自己数据
1、数据制作:还记得fasterrcnn数据如何制作的吗?参考博客
Tips:参考voc07的数据格式,我们可发现,生成的数据最后只需保留Annotations、ImageSets和JPEGImages三个文件夹即可,ImageSets/Main文件中用到的只有trainval.txt和test.txt这两个文件(数据分布:trainval=train+val训练集+验证集,all_data=trainval+test训练集+验证集+测试集),多类别如果增加负样本或模糊样本可以考虑1、0及-1操作(其中1表示有目标,0表示模糊目标,-1表示没有目标)
数据集制作完成后将这三个文件夹复制至一个文件夹(命名为VOC2007)当中,再移动至$pva-faster-rcnn/data/VOCdevkit2007中,替换原来的VOC2007
2、类别设置:
1)打开文件/models/pvanet/example_finetune/train.prototxt
1>搜索num_classes,修改成自己数据集的类别数n(比如我只识别people这一类,怎修改为2,因为包含背景:1+背景类)
2>搜索name: “cls_score”,inner_product_param参数,修改下面的num_output为实际的类别数n,同上一样
3>搜索name: “bbox_pred”,inner_product_param参数,修改下面的num_output为实际的类别数n×4
对于test.prototxt
1>搜索name: “cls_score”,修改下面的num_output为实际的类别数
2>搜索name: “bbox_pred”,修改下面的num_output为实际的类别数×4
若修改错误,会出现参数不匹配错误
2)修改lib/datasets/pascal_voc.py
self._classes = ('__background__', # always index 0
'people')
在里边添加要识别的类别,比如上边添加了要识别people,然后搜索
x1 = float(bbox.find('xmin').text) -1
y1 = float(bbox.find('ymin').text) -1
改为
x1 = float(bbox.find('xmin').text)
y1 = float(bbox.find('ymin').text)
这是为了防止标注数据的box中含有坐标为0的情况,造成训练loss=nan。faster-rcnn 系列在处理生成pascal voc数据集时,为了使像素以0为起点,每个bbox的左上和右下坐标都减一
3)修改lib/datasets/imdb.py
数据整理,在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1 下加入代码:
for b in range(len(boxes)):
if boxes[b][2]< boxes[b][0]:
boxes[b][0] = 0
4)修改完pascal_voc.py和imdb.py后进入lib/datasets目录下删除原来的pascal_voc.pyc和imdb.pyc文件,重新生成这两个文件,因为这两个文件是python编译后的文件,系统会直接调用。
终端进入lib/datasets文件目录输入:
python
import py_compile
py_compile.compile(r'imdb.py')
py_compile.compile(r'pascal_voc.py')
3、训练数据:
cd pva-faster-rcnn
./tools/train_net.py --gpu 0 --solver models/pvanet/example_finetune/solver.prototxt --weights models/pvanet/full/test.model –iters 100000 --cfg models/pvanet/cfgs/train.yml –imdb voc_2007_trainval
4、测试模型:
./tools/test_net.py --gpu 0 --def models/pvanet/example_finetune/test.prototxt --net output/faster_rcnn_pavnet/voc_2007_trainval/pvanet_frcnn_iter_100000.caffemodel --cfg models/pvanet/cfgs/submit_160715.yml