FPN主要使用特征金字塔网络来融合多层特征,改进了CNN特征提取。其在小目标上取得了很大的进步。更多细节可以阅读论文。
下面分两个内容介绍:
1. 安装
2. 训练测试
对于FPN有好几个框架实现的版本,如:caffe,mxnet 等。本文是对caffe 版本的FPN安装。
1.1 安装环境
Ubuntu 16.04
Python 2.7
opencv 3.3.0
由于之前安装过caffe,所以很多caffe的依赖都已经安装好,这里不一一叙述,具体问题具体分析。可以参考caffe的ubuntu 安装方法安装必要的依赖。
1.2 下载源码并且编译
#下载源码, 第一个是最原始的代码,由于版本问题,一些依赖升级,导致了编译出现很多错误,所以这里直接fork 作者的代码到自己的工程,修改编译的Makefile 和 Makefile.config文件。
#git clone https://github.com/unsky/FPN-caffe.git
$ git clone https://github.com/abner2015/FPN-caffe.git
#编译
#这里的编译方法其实是使用py-faster-rcnn的编译方法,和原作者的代码略有不同。如果你的编译出现了各种问题,不妨参考一下py-faster-rcnn的编译
$ cd caffe-FP_Net
$ make -j8 && make pycaffe
$ cd lib
$ make
如果没有错误到了这里就完成编译了,但事实并没有那么顺利,下面列举出几个遇到的错误(附:如果是用本文的代码,有些问题可能不会出现,仅供参考)
Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python
在使用caffe的python层时经常容易出现如下错误:
Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python
其原因是没有开启对python的支持,需要在Makefile.conf文件中开启如下开关:
WITH_PYTHON_LAYER=1
然后再
make && make pycaffe
#http://blog.csdn.net/lanyuxuan100/article/details/70231173
EnvironmentError: The CUDA lib64 path could not be located in /usr/lib64
gedit 打开 setup.py 改成以下:
cudaconfig = {'home':home, 'nvcc':nvcc,
'include': pjoin(home, 'include'),
'lib64': pjoin(home, 'lib')}
#对于下面的错误是直接修改配置文件的
Unsupported gpu architecture 'compute_61'
makefile.config中有cuda版本限制,设置的参数有可能cuda不支持。
可以参考本文代码的配置文件
Check failed: error == cudaSuccess (10 vs. 0) invalid device
#可能命令中GPU 的 ID 不对,0写成1 或者1写成0
#这个原因是由于numpy 版本问题,所以修改源码
#参考教程:http://blog.csdn.net/mydear_11000/article/details/70241139
TypeError: 'numpy.float64' object cannot be interpreted as an index
lib/roi_data_layer/minibatch.py
将:
fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改为:
fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)
lib/datasets/ds_utils.py
将:
hashes = np.round(boxes * scale).dot(v)
改为:
hashes = np.round(boxes * scale).dot(v).astype(np.int)
lib/fast_rcnn/test.py
将:
hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v)
改为:
hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v).astype(np.int)
lib/rpn/proposal_target_layer.py
将:
fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改为:
fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)
TypeError: slice indices must be integers or None or have an __index__ method
#改成以下
for ind in inds:
ind = int(ind)
cls = clss[ind]
start = int(4 * cos)
end = int(start + 4)
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
return bbox_targets, bbox_inside_weights
2.1 训练
首先下载预训练模型VGG16.v2.caffemodel,可以从py-faster-rcnn中下载
#训练
./experiments/scripts/FP_Net_end2end.sh 1 VGG16 pascal_voc
# VGG16.v2.caffemodel 路径可以在FP_Net_end2end.sh 修改
time ./tools/train_net.py --gpu ${GPU_ID} \
--solver models/${PT_DIR}/${NET}/FP_Net_end2end/solver.prototxt \
--weights model/VGG16.v2.caffemodel \
--imdb ${TRAIN_IMDB} \
--iters ${ITERS} \
--cfg experiments/cfgs/FP_Net_end2end.yml \
${EXTRA_ARGS}
2.2 测试
./test.sh 1 VGG16 pascal_voc
参考文献: