Faster-rcnn在caffe的实践操作+VOC2007(在自己电脑花了4天时间)完整版

文件夹介绍
py-faster-rcnn
–caffe-fast-rcnn:caffe框架文件
–data:预训练模型、faster-rcnn模型、数据集链接
–experiments:存放配置文件以及运行的log文件
–lib:存放Python接口文件
----datasets:数据库的读取
-------修改读写数据的接口主要是datasets目录下
---------factory.py
---------imdb.py
---------pascal_voc.py
---------voc_eval.py
----rpn:RPN的核心代码
-------generate_anchors.py:生成多尺度和多比例的锚点
-------proposal_layer.py:用来将RPN的输出转变为object proposals
-------anchor_target_layer.py:生成每个锚点的训练目标和标签,将其分类为1(object),0(not object),-1(ignore).
-------proposal_target_layer.py:对于每一个object proposal生成训练的目标和标签,分类标签从0-k,对于标签>0的box进行回归。
-------generate.py:使用一个rpn生成object proposals。
----nms做非极大抑制的部分,有gpu和cpu两种实现方式
-------py_cpu_nms.py:核心函数
----fast_rcnn:主要存放的是python的训练和测试脚本,以及训练的配置文件config.py
-------config.py
-------nms_wrapper.py
-------test.py
-------train.py
----roi_data_layer:主要是一些ROI处理操作
-------layer.py
-------minibatch.py
-------roidb.py
----utils:
-------blob.py
-------timer.py
----transform
–models:存放模型文件
–output:训练完成后的输出目录
–tools:存放的是训练和测试的Python文件
----_init_paths.py:用来初始化路径的,也就是之后的路径会join(path,*)
----compress_net.py:使用了SVD来压缩参数的
----demo.py:测试自己的模型和数据
----eval_recall.py:评估函数
----reval.py:re-evaluate
----rpn_genetate.py:调用了rpn中的genetate函数。这里,主要是一个封装调用的过程,在这里调用配置的参数、设置rpn的test参数,以及输入输出等操作。
----test_net.py:测试fast rcnn网络。主要就是一些参数配置。
----train_faster_rcnn_alt_opt.py
------训练faster rcnn网络使用交替的训练,其包括的步骤为:
--------RPN 1,使用imagenet model进行初liangzhangtupian始化参数,生成proposal,这里存储在mp_kwargs
--------fast rcnn 1,使用 imagenet model 进行初始化参数,使用刚刚生成的proposal进行fast rcnn的训练
--------RPN 2使用 fast rcnn 中的参数进行初始化(这里要注意哦),并生成proposal
--------fast rcnn 2,使用RPN 2 中的 model进行初始化参数,
----train_net.py:使用fast rcnn,训练自己数据集的网络模型。
----train_svms.py:使用最原始的RCNN网络训练post-hoc SVMs。

一、制作自己的数据集(跑该项目时未实现,下载的公共数据集voc)
1.获取图片
2.打好标签
3.分为训练和测试类
4.完备数据集
二、训练模型
1.安装相关依赖项
$ sudo pip install cython ---------------Successfully installed cython-0.28.5
$ sudo pip install easydict--------------Successfully installed easydict-1.8
$ sudo apt-get install python-opencv
2.编译相关文件和配置文件的修改
$ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
$ cd Wen/py-faster-rcnn/caffe-fast-rcnn
$ cp Makefile.config.example Makefile.config
$ gedit Makefile.config

修改makefile.config文件
若使用cudnn,则将# USE_CUDNN := 1 修改成: USE_CUDNN := 1
若使用的opencv版本是3的,则将# OPENCV_VERSION := 3 修改为: OPENCV_VERSION := 3
需要使用python来编写layer,将# WITH_PYTHON_LAYER := 1 修改为 WITH_PYTHON_LAYER := 1
重要的一项 将# Whatever else you find you need goes here.下面的
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:
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 /usr/lib/x86_64-linux-gnu/hdf5/serial

$ gedit Makefile

将:NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC (COMMONFLAGS):NVCCFLAGS+=DFORCEINLINESccbin=(COMMON_FLAGS) 替换:NVCCFLAGS += -D_FORCE_INLINES -ccbin=(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

3.编译
~/Wen/py-faster-rcnn/lib$ make
~/Wen/py-faster-rcnn/caffe-fast-rcnn$ make -j8 && make pycaffe
----------error--------
./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’:
./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING’ not handled in switch [-Wswitch]
switch (status) { …

-------reslove--------
这是因为当前版本的caffe的cudnn实现与系统所安装的cudnn的版本不一致引起的。
a.将./caffe-fast-rcnn/include/caffe/util/cudnn.hpp 换成最新版的caffe里的cudnn的实现,即相应的cudnn.hpp.
b. 将./caffe-fast-rcnn/include/caffe/layers里的,所有以cudnn开头的文件,例如cudnn_conv_layer.hpp,都替换成最新版的caffe里的相应的同名文件。
c.将./caffe-fast-rcnn/src/caffe/layer里的,所有以cudnn开头的文件,例如cudnn_lrn_layer.cu,cudnn_pooling_layer.cpp,cudnn_sigmoid_layer.cu,都替换成最新版的caffe里的相应的同名文件。

---------error--------
src/caffe/layers/cudnn_conv_layer.cu(85): error: identifier “cudnnConvolutionBackwardFilter_v3” is undefined

---------reslove----------------------------
打开cudnn_conv_layer.cu,删除V3

---------error------------------------------
python/caffe/_caffe.cpp:11:31: fatal error: numpy/arrayobject.h: No such file or directory
compilation terminated.
Makefile:489: recipe for target ‘python/caffe/_caffe.so’ failed
make: *** [python/caffe/_caffe.so] Error 1

--------reslove---------------------------
将Makefile.config中相应位置加一个local:
即,将原来的:
PYTHON_INCLUDE := /usr/include/python2.7
/usr/lib/python2.7/dist-packages/numpy/core/include
修改为:
PYTHON_INCLUDE := /usr/include/python2.7
/usr/local/lib/python2.7/dist-packages/numpy/core/include

4.下载Pascal Voc 2007
$ 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
在data目录下,新建一个VOCdevkit2007文件夹,将这三个文件解压至此
5.下载ImageNet预训练模型
在py-faster-rcnn根目录下执行脚本:
$ ./data/scripts/fetch_imagenet_models.sh
由于无法连接到国外网址,一直下载不下来换了一个网址下载http://pan.baidu.com/s/1hsxx8OW
6.运行
aibc@aibc:~$ ./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc
#./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [–set …]
GPU_ID is the GPU you want to train on
NET in {ZF, VGG_CNN_M_1024, VGG16} is the network arch to use
–set … allows you to specify fast_rcnn.config options, e.g.
–set EXP_DIR seed_rng1701 RNG_SEED 1701

---------error------------
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/config.py”, line 259, in cfg_from_file
import yaml
ImportError: No module named yaml

----------reslove----------
$ sudo apt-get install python-yaml

------------------error-----
Check failure stack trace: ***
./experiments/scripts/faster_rcnn_end2end.sh: line 57: 19081 Aborted (core dumped)
./tools/train_net.py --gpu GPUIDsolvermodels/{GPU_ID} --solver models/{PT_DIR}/NET/fasterrcnnend2end/solver.prototxtweightsdata/imagenetmodels/{NET}/faster_rcnn_end2end/solver.prototxt --weights data/imagenet_models/{NET}.v2.caffemodel --imdb ${TRAIN_IMDB} --iters ${ITERS} --cfg
experiments/cfgs/faster_rcnn_end2end.yml ${EXTRA_ARGS}

----------------reslove---------------
修改ImageNet_model的路径,确保在./data下。
------------error---------------------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 157, in train_net
pretrained_model=pretrained_model)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 51, in init
pb2.text_format.Merge(f.read(), self.solver_param)
AttributeError: ‘module’ object has no attribute ‘text_format’
------------reslove-------------------
解决办法1:sudo pip install protobuf==2.5.0
解决方法2:在文件./lib/fast_rcnn/train.py增加一行import google.protobuf.text_format 即可解决问题

-------------error----------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 161, in train_net
model_paths = sw.train_model(max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 102, in train_model
self.solver.step(1)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 66, in forward
rois_per_image, self._num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 191, in _sample_rois
_get_bbox_regression_labels(bbox_target_data, num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 127, in _get_bbox_regression_labels
bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
TypeError: slice indices must be integers or None or have an index method

----------------reslove-------------
百度了一下说是numpy版本高,用了sudo pip install -U numpy==1.11.0,又出现了问题然后回到了上述问题
修改 /home/lzx/py-faster-rcnn/lib/rpn/proposal_target_layer.py,转到123行:
for ind in inds:
cls = clss[ind]
start = 4 * cls
end = 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
这里的ind,start,end都是 numpy.int 类型,这种类型的数据不能作为索引,所以必须对其进行强制类型转换,如下:
for ind in inds:
ind = int(ind)
cls = clss[ind]
start = int(4 * cls)
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

---------------error-----------------------------------------------------------------------------------
Traceback (most recent call last):
File “./tools/train_net.py”, line 112, in
max_iters=args.max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 161, in train_net
model_paths = sw.train_model(max_iters)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/fast_rcnn/train.py”, line 102, in train_model
self.solver.step(1)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 66, in forward
rois_per_image, self._num_classes)
File “/home/aibc/Wen/py-faster-rcnn/tools/…/lib/rpn/proposal_target_layer.py”, line 167, in _sample_rois
fg_inds = npr.choice(fg_inds, size=fg_rois_per_this_image, replace=False)
File “mtrand.pyx”, line 1192, in mtrand.RandomState.choice
TypeError: ‘numpy.float64’ object cannot be interpreted as an index

---------------reslove------------------------------------------------------
a. /home/xxx/py-faster-rcnn/lib/roi_data_layer/minibatch.py
将第26行: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)

b. /home/xxx/py-faster-rcnn/lib/datasets/ds_utils.py
将第12行:hashes = np.round(boxes * scale).dot(v)
改为:hashes = np.round(boxes * scale).dot(v).astype(np.int)

c. /home/xxx/py-faster-rcnn/lib/fast_rcnn/test.py
将第129行: hashes = np.round(blobs[‘rois’] * cfg.DEDUP_BOXES).dot(v)
改为: hashes = np.round(blobs[‘rois’] * cfg.DEDUP_BOXES).dot(v).astype(np.int)

d. /home/xxx/py-faster-rcnn/lib/rpn/proposal_target_layer.py
将第60行: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)

三、测试模型
1.将py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel,拷贝到py-faster-rcnn/data/faster_rcnn_models下
2.将你需要进行test的images放在py-faster-rcnn/data/demo下
3.修改py-faster-rcnn/tools/demo.py文件
CLASSES = (‘background’, ‘captcha’) #参考你自己的类别写

NETS = {‘vgg16’: (‘VGG16’,
‘VGG16_faster_rcnn_final.caffemodel’),
‘zf’: (‘ZF’,
‘ZF_faster_rcnn_final.caffemodel’) #改成你训练得到的model的name

im_names = [‘1559.jpg’,‘1564.jpg’] # 改成自己的test image的name
-------------error----------------------------------------------------
Traceback (most recent call last):
File “./tools/demo.py”, line 119, in
prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],
KeyError: ‘vgg16’

-----------reslove--------
$ ./tools/demo.py --net zf

参考链接:
http://lib.csdn.net/article/deeplearning/61652
https://blog.csdn.net/sinat_30071459/article/details/51332084
https://blog.csdn.net/sinat_30071459/article/details/50723212

python版本faster-rcnn训练过程看:
http://blog.csdn.net/sinat_30071459/article/details/51332084
https://www.cnblogs.com/zjutzz/p/5983160.html

发布了22 篇原创文章 · 获赞 16 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章