FPN(Feature Pyramid Networks for Object Detection)安装与训练

FPN主要使用特征金字塔网络来融合多层特征,改进了CNN特征提取。其在小目标上取得了很大的进步。更多细节可以阅读论文。
下面分两个内容介绍:

1. 安装
2. 训练测试

1.安装

对于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 

如果没有错误到了这里就完成编译了,但事实并没有那么顺利,下面列举出几个遇到的错误(附:如果是用本文的代码,有些问题可能不会出现,仅供参考)


> Error 1


 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

> Error 2

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')}  

> Error 3

#对于下面的错误是直接修改配置文件的
Unsupported gpu architecture 'compute_61'
makefile.config中有cuda版本限制,设置的参数有可能cuda不支持。
可以参考本文代码的配置文件

> Error 4

Check failed: error == cudaSuccess (10 vs. 0)  invalid device

#可能命令中GPU 的 ID 不对,0写成1 或者1写成0

> Error 5

#这个原因是由于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)

> Error 6

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. 训练测试

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

参考文献:

  1. https://github.com/unsky/FPN-caffe
  2. https://github.com/rbgirshick/py-faster-rcnn
  3. http://blog.csdn.net/mydear_11000/article/details/70241139

你可能感兴趣的:(caffe,目标检测)