A-Fast-RCNN算法来自论文:A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection。
项目的git地址:https://github.com/xiaolonw/adversarial-frcnn
因为git上对于如何训练模型,如何测试数据介绍得比较简单,因此自己亲自试验了一下,并记录下过程。
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
假设拉取下来后的文件名为$FRCN_ROOT
从A-Fast-RCNN上下载项目,然后把这个项目里的所有东西手动覆盖到$FRCN_ROOT这个目录下的所有文件。
git clone --recursive https://github.com/xiaolonw/adversarial-frcnn
cd $FRCN_ROOT/caffe-fast-rcnn
cp Makefile.config.example Makefile.config
这个Makefile.config需要更改两处地方:
一处是将makefile.config里面的以下两行:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
换成这两行:其实就是加上了hdf5的路径
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
另一处是将makefile.config中的这一行前面的注释符号#去掉
WITH_PYTHON_LAYER :=1
然后编译caffe和pycaffe:
make -j32 && make pycaffe
如果报错:
原因:编译layer_factor.o时候出错,需要将Makefile.config文件中这一行USE_CUDNN := 1注释,默认是注释的,不过一些git上会让开启,如果开启时候编译出错,那么就关闭。
cd $FRCN_ROOT/lib
make
放在$FRCN_ROOT/data/目录下,取名VOCdevkit2007,数据集下载可参考另一篇博客:OHEM算法的Caffe实现
因为Fast RCNN需要用selective search的方式独立生成region proposal,所以需要从网上下载这个文件:selective_search_data.tgz,解压缩后放在$FRCN_ROOT/data/目录下。
下载地址
./train.sh
这个脚本里面主要包含以下四个命令:
7.1、
./experiments/scripts/fast_rcnn_std.sh [GPU_ID] VGG16 pascal_voc
这个fast_rcnn_std.sh表示用标准的Fast-RCNN训练10K次,采用VGG16网络,数据集采用pascal_voc。当然在运行这个命令之前,必须保证你有在ImageNet上预训练的网络,关于预训练模型可以参考:OHEM算法的Caffe实现,因为训练这个Fast RCNN也是在预训练的网络上fine-tuning的。如下图是fast_rcnn_std.sh的主要内容:
这里的weights就是在imagenet上预训练的网络。
所以当你下载了这样的预训练的网络后,你的目录应该类似这样:
$FRCN_ROOT/data/imagenet_models/VGG16.v2.caffemodel
训练的时候可能报错:
解决:主要是和numpy的版本有关。
sudo pip install -U numpy==1.11.0
OK。正常运行了。
训练结束后会生成
$FRCN_ROOT/output/fast_rcnn_adv/voc_2007_trainval/fast_rcnn_std_iter_10000.caffemodel
,也可以从作者的git上下载训练好的Fast RCNN模型并放置在上面这个路径下,然后开始下一步。
7.2、
./experiments/scripts/fast_rcnn_adv_pretrain.sh [GPU_ID] VGG16 pascal_voc
这句话是对抗网络的预训练。对抗网络的预训练也是在前面训练的标准Fast RCNN的基础上进行预训练的,fast_rcnn_adv_pretrain.sh的主要内容如下:也是其中的weights表示7.1步生成的标准Fast RCNN模型。
训练结束后会生成
$FRCN_ROOT/output/fast_rcnn_adv/voc_2007_trainval/train_init.caffemodel
,也可以从作者的git上下载训练好的对抗网络,然后开始下一步。
7.3、
./copy_model.h
这个命令是指拷贝前面训练的两个模型的参数用来初始化联合模型(joint model)
7.4、
./experiments/scripts/fast_rcnn_adv.sh [GPU_ID] VGG16 pascal_voc
这个命令就是训练联合模型
看看fast_rcnn_adv.sh里面的主要内容如下,就是在7.2预训练的对抗模型基础上进行训练。
训练好的模型保存在
$FRCN_ROOT/output/fast_rcnn_adv/voc_2007_trainval/fast_rcnn_adv_iter_40000.caffemodel
可以在命令行输入以下命令(在根目录下):
time sudo ./tools/test_net.py --gpu 0 --def models/pascal_voc/VGG16/fast_rcnn/test.prototxt --net output/fast_rcnn_adv/voc_2007_trainval/fast_rcnn_adv_iter_40000.caffemodel --imdb voc_2007_test --cfg experiments/cfgs/fast_Rcnn_adv_128.yml
下图显示正在依次测试测试集的图像,其中0.229s表示测试一张图像所需的时间。
测试时候遇到过类似这样的错误,本来测试的结果应该写到相应的txt文件中,但是这个错误表示找不到测试结果的txt文件。
解决:可以手动在data目录下新建一个文件目录
~/data/VOCdevkit2007/results/VOC2017/Main/
,然后再测试。
测试的时候还会遇到这样的错误,因为每次测试的时候都会生成
~/output/fast_rcnn_adv/voc_2007_test/fast_rcnn_adv_iter_40000/detections.pkl
,并且会读取这个文件。因此如果你第二次测试的时候还保留第一次测试的这个pkl文件,那么在读取的时候就会报错,因为没有权限。因此在前面的测试命令中要加上sudo。
这是最后的测试结果: