RRC(Accurate Single Stage Detector Using Recurrent Rolling Convolution)是商汤科技关于目标检测的在CVPR 2017发布的一篇论文,直观的理解就是对SSD 嵌入 contextual information 使其可以同时检测大目标和小目标,在KITTI car数据集上的hard样本检测取得了排名第一。
这里 single stage detectors 就是一个过程就搞定了检测,相对于 R-CNN 系列的 two stage: 候选区域提取+分类 。
Code: https://github.com/xiaohaoChen/rrc_detection
RRC的安装配置是在配置好Caffe环境的基础上进行的,如果还没配置caffe环境,请看之前的博客进行Caffe配置。
系统:Ubuntu16.04
GPU: NVIDIA GTX1070
CUDA8.0+cuDNN5.1
在要安装RRC代码的目录下(我这里是~/learning/),打开终端运行:
https://github.com/xiaohaoChen/rrc_detection.git
cd rrc_detection
得到~/learning/rrc_detection-master。
后面的部分以 $CAFFE_ROOT 代表 ~/learning/rrc_detection-master 路径。
注意:这里如果你还没有安装caffe,按照教程安装。如果你已经安装好来caffe,那么复制系统caffe下的Makefile.config到rrc_detection-master下。
在开始编译前,首先要打开~/.bashrc文件把$CAFFE_ROOT的python接口添加到自己的PYTHONPATH,即在~/.bashrc文件底部修改PYTHONPATH为:
export PYTHONPATH=/home/yanting/learning/rrc_detection-master/python:$PYTHONPATH
然后编译 $CAFFE_ROOT的 caffe:
cd $CAFFE_ROOT
make -j8
make py
make test -j8
make runtest -j8
编译时可能遇到的错误:
No rule to make target '/usr/local/include/google/protobuf/stubs/common.h', needed by '.build_release/cuda/src/caffe/solvers/adadelta_solver.o'。 停止。
Makefile:576: recipe for target '.build_release/src/caffe/common.o' failed
这可能是由于protobuf的版本或者路径导致的。经查看,我的/usr/local/include/下并没有对应的文件夹,对应的文件夹是放在了/usr/include/下。
经分析,实际上系统中存在多个protobuf版本,一个是annaconda中的,一个是/usr/bin/中的,而系统默认查找的是在annaconda中的,因此尝试过在rrc_detection-master的Makefile文件中修改caffe查找protoc的路径为/usr/bin/,又出现了protobuf版本太旧的错误,尝试升级protobuf,却显示已经是最新版本。后来把Makefile文件恢复到原来,make clean后重新编译,却发现没有错了,因此不了了之,最终没发现是什么原因。
错误解决办法参考博客:
http://blog.csdn.net/elysion122/article/details/64523339
https://www.jianshu.com/p/74e9c8697372
RRC与SSD使用同样的预训练模型,通过链接:https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6 下载VGG16预训练模型。解压后放在$CAFFE_ROOT/models/VGGNet/目录下。
(1)数据下载
通过链接:http://www.cvlibs.net/datasets/kitti/eval_object.php 在KITTI数据集官网下载数据集。
仅下载image_2和label_2,这是KITTI给出的7481张包含label的图像,可用于模型训练和测试;而image_3包含7518张图像,没有给出label,可以把代码上传到KITTI官网上使用image_3对自己的代码进行评分。这里我们只需要image_2就可以了。
下载完成后数据解压,放在$HOME/data/KITTI/training/下。
(2)提取车辆标注
我们最后只评价车辆检测结果,因此需要从label_2提取出仅含car标注的label文件。
在$CAFFE_ROOT/data/KITTI-car/里,修改extract_car_label.sh文件里对应的数据路径,然后终端运行:
cd $CAFFE_ROOT/data/KITTI-car/
./extract_car_label.sh
在$HOME/data/KITTI/training/下生成label_2car文件。
(3)标注转化成VOC格式
作者提供了matlab 代码把KITTI的txt格式标注转化成VOC格式,在$CAFFE_ROOT/data/convert_labels/里,需要修改converlabels.m里的相应路径:
line 4: root_dir = '/your/path/to/KITTI/';
运行,生成的VOC格式文件在$HOME/data/KITTI/training/labels_2car/xml/下。
(4)生成LMDB文件
cd $CAFFE_ROOT/data/KITTI-car/
./create_list.sh
注意:这里train和test的划分是根据同目录下的main文件夹进行划分的,可通过修改main的内容来修改train和test的划分。
KITTI-car_training_lmdb/
KITTI-car_testing_lmdb/
(在$CAFFE_ROOT/data/KITTI-car/lmdb下生成相应的软链接)
可以根据需要修改create_data.sh的参数。
./data/KITTI-car/create_data.sh
(1)训练
在训练前,需要先修改rrc_kitti_car.py,因为我们只有一个1070 GPU,
line 118: gpus = "0,1,2,3" 修改为 gpus = "0"
line 123: batch_size = 4 修改为 batch_size = 1
运行:
python examples/car/rrc_kitti_car.py #训练
60k次迭代后,训练完成,
在 - $CAFFE_ROOT/models/VGGNet/KITTI/RRC_2560x768_kitti_car/生成模型定义文件和模型快照,
在- $CAFFE_ROOT/jobs/VGGNet/KITIIT/RRC_2560x768_kitti_car/生成job文件和log文件。
(2)测试
在测试前需要修改rrc_test.py,
line 10: img_dir 修改为 想要测试的kitti testing images
line 25: num_img 修改为测试的图片数
运行:
python examples/car/rrc_test.py #测试
通过链接: https://pan.baidu.com/s/1c2H0NxY 下载作者训练好的模型。
解压至$CAFFE_ROOT/models/VGGNet/KITTI/,然后如第5部分一样运行rrc_test.py进行测试。
cd $CAFFE_ROOT #注意:工作目录应该在$CAFFE_ROOT下
python models/VGGNet/KITTI/RRC_2560x768_kitti_4r4b_max_size/rrc_test.py
可能遇到的错误:
ImportError: No module named Image (或 ImageDraw )
解决办法:修改rrc_test.py,
import Image 修改为 from PIL import Image
import ImageDraw 修改为 from PIL import ImageDraw
若报错 No module named PIL ,则想办法安装PIL库。
测试完成后,测试图片的’分类、坐标、得分’结果以txt格式存放在result-txt文件夹下,修改rrc_test.py也可以保存画框后的图片。
注意:rrc_test.py不提供与ground truth比较结果,也不提供map计算,不能对RRC算法进行评估。
可用来测试外部数据集。