使用faster-rcnn训练自己的模型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011636440/article/details/78062283

参考

faster-rcnn
源码链接
论文链接
一个不错的参考

faster rcnn简介

各文件目录介绍

 caffe-fast-rcnn —> caffe框架
 data —> 存放数据,以及读取文件的cache
 experiments —>存放配置文件以及运行的log文件,配置文件
 lib —> python接口
 models —> 三种模型, ZF(S)/VGG1024(M)/VGG16(L)
 output —> 输出的model存放的位置,不训练此文件夹没有
 tools —> 训练和测试的python文件

提供了两种算法

 alternating optimization training(alt-opt)交替优化训练
 approximate joint training (end-to-end) 近似联合训练:官方指出,对于VGG16而言,end-to-end要比alt-opt快1.5倍,精度是差不多的。

提供了三种模型

 ZF,小型。至少3G显存。
 VGG_CNN_M_1024,中型。至少3G显存。
 VGG16,大型。至少11G显存。不过如果开启CUDNN模式,在end-to-end算法中训练,3G显存也可以跑起来。

安装

安装流程

在caffe-fast-rcnn目录下,像安装caffe一样。

cd caffe-fast-rcnn
cp Makefile.config.example Makefile.config
vim Makefile.config  # 根据自己的需要修改配置文件,如果只使用CPU训练就打开CPU_ONLY := 1;
                     # 如果要使用CUDNN就打开USE_CUDNN := 1;最高支持cudnn4,更高版本会报错

将USE_PKG_CONFIG := 1和WITH_PYTHON_LAYER := 1打开
然后

make -j8
make pycaffe
cd ../lib
make -j4

然后可以测试一下

./tools/demo.py

报错及解决

1.

no module named setuptools

sudo apt-get install python-setuptools

2.

no module named cython.distutils

pip install cython

3.

no module named easydict

pip install easydict

4.

no module named cv2

apt-get install python-opencv

5.

no module named skimage.io

apt-get install gfortran
pip install -U scikit-image

6.

no module named google.protobuf.internal

apt-get install python-protobuf

7.

运行demo的时候,报错Check failed: registry.count(type) == 1 (0 vs. 1) Unknown
layer type: Python。

解决方法:把caffe的包make clean。然后更改Makefile.config文件,设置WITH_PYTHON_LAYER := 1。重新编译就好了。

8.

ImportError: No module named ‘yaml’

pip install pyyaml

9.

打开cudnn加速的方法

在makefile.config中删掉USE_CUDNN := 1的注释。

10.

cudnn.h: no such file or directory

安装cudnn。安装方法:官网下载tar包,解压缩。该目录下的caffe并不是最新的,所以cudnn要下载匹配的版本,太新版本cudnn不支持,会导致编译出错。

11.

ImportError: No module named gpu_nms

在lib目录下make

12.

/include/caffe/util/cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDescriptor

cudnn版本太高,降到cudnn4

13.

ImportError: No module named _caffe

在caffe-fast-rcnn目录下,make pycaffe

VOC

voc全称Visual Object Classes Challenge,是一个竞赛。基础任务是对图片进行分类和物体检测。附加任务是分段预测和人体分布检测。

faster rcnn首先就是应用在voc上的,可以下载voc2007的数据集探索faster rcnn的使用。

voc给出三个集合:训练集(train)、验证集(val)和测试集(test)。共有9963张已经标记好的图片,其中训练集和验证集的图中的标记已经给出,测试集是需要参赛者标注的。图片中有20类物体,包括人、猫、狗、马、羊、汽车、公交车、自行车等。

 分类就是对每个物体,将包含该类物体的所有图片列出来。
 物体检测就是在图片中将每类物体框出来。
 分段检测是给定图中的某个像素点指出该像素点上有哪类物体。
 人体分布检测是将人的头、手、脚框出来。

voc的标注信息中会给出每张图片中的每个物体:物体的类别、边界框、从哪个角度拍摄的(前后左右)、被切去的部分以及该物体是不是难以检测到的(有些物体比较小或者比较模糊或者被切去了很多就是难以检测的)。

在标注时还给出了两种分块信息,基于类别的和基于物体的。基于类别的就是在图中标注背景和各类别的位置(即一张图片中出现多个同类物体只标注类别不区分物体)。基于物体的标准则把每个物体都进行独立的标注。

运行前准备

数据准备与格式调整

因为我要做人脸检测,所以首先要有人脸的图片以及人脸框的位置标记。

参考VOC2007数据集,重要的是数据主要在
 JPEGImages —> 存放用来训练的原始图像(图片要是JPEG/JPG格式的)
 Annotations —> 存放原始图像中的Object的坐标信息,XML格式(参考官方VOC的Annotations的格式中的source和owner不是必须的)
 ImageSets/Main —> 指定用来train,trainval,val和test的图片的编号

我首先选择的用来实验的是汤晓鸥团队的celeba数据集。先用MATLAB进行了格式处理。包括读取每张图片的相关信息并生成对应的xml文件,根据test、train、val的划分给出各数据集中分别有哪些图片。

这里需要指出,

  • 原始数据给出的bbox是左上角坐标和宽高,而voc的数据格式是左上角和右下角坐标,需要对应的计算。
  • 查看VOC2007的数据可以发现,Main文件夹下的各个子类别的txt除了有图片编号,还每张图片对应一个数字{-1,1,0}。

这三个数字的含义为:
-1:图片中没有感兴趣的物体类别
1:图片中包含感兴趣的物体类别
0:图片中包含感兴趣的物体类别,但只包含标记为difficult的物体
(我选择的数据集都是有感兴趣物体的,并且不需要区分是不是difficult的,所以全1)

我在进行实验的时候选择的直接把原来的VOC2007改名为VOC2007-original,把我的数据集改名为VOC2007放在data/VOCdevkit2007文件夹下,这样比较省心。

在VOC2007/ImageSet/Main文件夹下,包括总的训练集train.txt、总的测试集test.txt、总的验证集val.txt以及trainval.txt(如下左图所示,文件中存储各自的图片名称,仅有六位数字,没有文件后缀),还包括包含各个目标的训练集、测试集、验证集,例如,我在做人脸检测,目标只有一类,即face,则包括了face_train.txt、face_test.txt、face_val.txt、face_trainval.txt(如下右图所示,文件中存储图片名称并跟一个数字,0、1或者-1。-1代表该图中不包含目标物体,1代表该图中至少包含一张目标物体,0代表该图中仅包含难以找到的目标物体,难以查找是voc的任务,并且我找到的训练集图片肯定每一个都包含目标物体,所以我把所有图片名称后边写了1)详细说明见devkit_doc.pdf 17页

修改网络配置信息

只需要检测人脸,所以类别只有两类:人脸和背景。

用的是训练好的中型模型VGG_CNN(VGG16大ZF小),如果想要另外两个网络根据下边的介绍做对应修改就好

修改了model/pascal_voc/VGG_CNN_M_1024/faster_rcnn_alt_opt文件夹中的:

  • stage1_fast_rcnn_train.pt——data层param_str: “‘num_classes’:
    2”和cls_score层num_output: 2以及bbox_pred层num_output: 8
  • stage2_fast_rcnn_train.pt——同上,3处
  • stage1_rpn_train.pt——input-data层param_str: “‘num_classes’: 2”
  • stage2_rpn_train.pt——同上,1处
  • faster_rcnn_test.pt——cls_score层num_output: 2以及bbox_pred层num_output: 8
  • lib/datasets/pascal_voc.py修改标签名称

为防止与之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)

!!!注意:如果自己生成xml标记文件,bbox给出的坐标一定是x1,y1,x2,y2的形式,即左上和右下的坐标,不要给宽高。而且一定要x1小于x2,y1小于y2,不然会出很多莫名的错误。

训练

./experiments/scripts/faster_rcnn_alt_opt.sh 0 VGG16_CNN_M_1024 pascal_voc

有一点需要指出:训练过程会经过四个阶段rpn、fast_rcnn、rpn、fast_rcnn。阶段之间的连接需要一段较长的时间载入数据(可能是因为我的数据集比较大,有18万+的训练集),这个过程要耐心等待。

得到的结果在output文件夹下,vgg_cnn_m_1024_rpn_stage1_iter_80000.caffemodel等是过程性文件,得到的最终结果应该是vgg_cnn_m_1024_final.caffemodel。

检验

  1. 将py-faster-rcnn/output/faster_rcnn_alt_opt/voc_2007_trainval/vgg_cnn_m_1024_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,改成自己的数据集标签;im_names,改成自己的测试文件的名称;NETS,如果是使用的VGG16或者ZF就不用改了,其他则需要修改)

猜你喜欢

转载自blog.csdn.net/u011636440/article/details/78062283