使用Faster-Rcnn进行目标检测
来源:互联网 发布:淘宝怎样找妹子服务 编辑:程序博客网 时间:2024/06/04 04:50
转载自:http://blog.csdn.net/gavin__zhou/article/details/52052915
原理
上一篇文章,已经说过了,大家可以参考一下,Faster-Rcnn进行目标检测(原理篇)
实验
我使用的代码是Python版本的Faster Rcnn
,官方也有Matlab
版本的,链接如下:
py-faster-rcnn(python)
faster-rcnn(matlab)
环境配置
按照官方的README
进行配置就好,不过在这之前大家还是看下硬件要求吧
For training smaller networks (ZF, VGG_CNN_M_1024) a good GPU (e.g., Titan, K20, K40, …) with at least 3G of memory suffices
For training Fast R-CNN with VGG16, you’ll need a K40 (~11G of memory)
For training the end-to-end version of Faster R-CNN with VGG16, 3G of GPU memory is sufficient (using CUDNN)
我的是环境是Ubuntu 14.04 + Titan X(12GB) + cuda 7.0 + cudnn V3
1 Caffe
环境配置
Caffe环境需要python layer的支持,在你的Caffe的Makefile.config
中去掉以下的注释
- WITH_PYTHON_LAYER := 1
- USE_CUDNN := 1
2 安装python库依赖
cython
,python-OpenCV
和easydict
- 1
- 2
- 3
- 1
- 2
- 3
3 克隆py-faster-rcnn
源代码
- 1
- 1
4 编译cython
模块
- 1
- 2
- 1
- 2
5 编译Caffe
和pycaffe
- 1
- 2
- 1
- 2
-j8的选项是进行多核编译,可以加速编译过程,推荐使用
数据集
参考VOC2007
的数据集格式,主要包括三个部分:
JPEGImages
Annotations
ImageSets/Main
JPEGImages
—> 存放你用来训练的原始图像
Annotations
—> 存放原始图像中的Object的坐标信息,XML格式
ImageSets/Main
—> 指定用来train,trainval,val和test的图片的编号
这部分非常重要,数据集做不好直接导致代码出现异常,无法运行,或者出现奇怪的错误,我也是掉进了很多坑,爬上来之后才写的这篇博客,希望大家不要趟我趟过的浑水!每一个部分我都会细说的!
JPEGImages
这个没什么,直接把你的图片放入就可以了,但是有三点注意:
编号要以6为数字命名,例如000034.jpg
图片要是JPEG/JPG格式的,PNG之类的需要自己转换下
图片的长宽比(width/height)要在0.462-6.828之间,就是太过
瘦长
的图片不要
0.462-6.828是我自己实验得出来的,就我的数据集而言是这个比例,总之长宽比太大或者太小的,你要注意将其剔除,否则可能会出现下面我实验时候出的错:
Traceback (most recent call last):
File “/usr/lib/python2.7/multiprocessing/process.py”, line 258, in _bootstrap
self.run()
File “/usr/lib/python2.7/multiprocessing/process.py”, line 114, in run
self._target(*self._args, **self._kwargs)
File “./tools/train_faster_rcnn_alt_opt.py”, line 130, in train_rpn
max_iters=max_iters)
File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 160, in train_net
model_paths = sw.train_model(max_iters)
File “/home/work-station/zx/py-faster-rcnn/tools/../lib/fast_rcnn/train.py”, line 101, in train_model
self.solver.step(1)
File “/home/work-station/zx/py-faster-rcnn/tools/../lib/rpn/anchor_target_layer.py”, line 137, in forward
gt_argmax_overlaps = overlaps.argmax(axis=0)
ValueError: attempt to get argmax of an empty sequence
Google给出的原因是 Because the ratio of images width and heights is too small or large,这个非常重要
Annotations
faster rcnn
训练需要图像的bounding box
信息作为监督(ground truth),所以你需要将你的所有可能的object使用框标注,并写上坐标,最终是一个XML格式的文件,一个训练图片对应Annotations下的一个同名的XML文件
参考官方VOC的Annotations的格式:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
这里有一个非常好用的工具VOC框图工具,可以自动帮你生成需要的XML格式,实际中发现格式基本无误,只有小的地方需要改动下,大家对比下就知道怎么改了,我是在Linux下借助sed
修改的,这个不难
Imagesets/Main
因为VOC的数据集可以做很多的CV任务,比如Object detection, Semantic segementation, Edge detection等,所以Imageset下有几个子文件夹(Layout, Main, Segementation),我们只要修改下Main下的文件就可以了(train.txt
, trainval.txt
, val.txt
, test.txt
),里面写上你想要进行任务的图片的编号
将上述你的数据集放在py-faster-rcnn/data/VOCdevkit2007/VOC2007
下面,替换原始VOC2007的JPEGIMages
,Imagesets
,Annotations
原始VOC2007下载地址: VOC20007数据集
代码修改
工程目录介绍
caffe-fast-rcnn —> caffe框架
data —> 存放数据,以及读取文件的cache
experiments —>存放配置文件以及运行的log文件,配置文件
lib —> python接口
models —> 三种模型, ZF(S)/VGG1024(M)/VGG16(L)
output —> 输出的model存放的位置,不训练此文件夹没有
tools —> 训练和测试的python文件
修改源文件
faster rcnn
有两种各种训练方式:
Alternative training(alt-opt)
Approximate joint training(end-to-end)
推荐使用第二种,因为第二种使用的显存更小,而且训练会更快,同时准确率差不多,两种方式需要修改的代码是不一样的,同时faster rcnn提供了三种训练模型,小型的ZF
model,中型的VGG_CNN_M_1024
和大型的VGG16
,论文中说VGG16效果比其他两个好,但是同时占用更大的GPU显存(~11GB)
我使用的是VGG model + alternative training,需要检测的类别只有一类,加上背景所以总共是两类(background + captcha)
1 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_fast_rcnn_train.pt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
2 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage1_rpn_train.pt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_fast_rcnn_train.pt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
4 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage2_rpn_train.pt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
5 py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
6 py-faster-rcnn/lib/datasets/pascal_voc.py
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
line 212
- 1
- 1
如果你的标签含有大写字母,可能会出现KeyError的错误,所以建议全部使用小写字母
7 py-faster-rcnn/lib/datasets/imdb.py
将append_flipped_images函数改为如下形式:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
到此代码修改就搞定了
训练
训练前还需要注意几个地方
1 cache问题
假如你之前训练了官方的VOC2007的数据集或其他的数据集,是会产生cache的问题的,建议在重新训练新的数据之前将其删除
(1) py-faster-rcnn/output
(2) py-faster-rcnn/data/cache
2 训练参数
py-faster-rcnn/models/pascal_voc/VGG16/faster_rcnn_alt_opt/stage_fast_rcnn_solver*.pt
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
迭代次数在文件py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py
中进行修改
line 80
- 1
- 1
分别对应rpn第1阶段,fast rcnn第1阶段,rpn第2阶段,fast rcnn第2阶段的迭代次数,自己修改即可,不过注意这里的值不要小于上面的solver里面的step_size的大小,大家自己修改吧
开始训练:
- 1
- 2
- 1
- 2
指明使用第一块GPU(0),模型是VGG16,训练数据是pascal_voc(voc2007),没问题的话应该可以迭代训练了
结果
训练完毕,得到我们的训练模型,我们就可以使用它来进行我们的object detection了,具体是:
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'), #改成你训练得到的model的name
'zf': ('ZF',
'ZF_faster_rcnn_final.caffemodel')
}
- 1
- 1
上几张我的检测结果吧
参考
1 faster rcnn 做自己的数据集
2 faster rcnn 教程
3 使用ZF训练自己的faster rcnn model
4 一些错误的解决方法
- 使用Faster-Rcnn进行目标检测
- 使用faster rcnn进行目标检测
- 使用Faster-Rcnn进行目标检测
- faster rcnn进行目标检测
- 使用Faster-Rcnn进行目标检测(实践篇)
- 使用Faster-Rcnn进行目标检测(实践篇)
- 使用Faster-Rcnn进行目标检测(实践篇)
- 使用Faster-Rcnn进行目标检测的原理
- 使用Faster-Rcnn进行目标检测(实践篇)
- 搭建faster-rcnn进行目标检测的环境
- SqueezeNet运用到Faster RCNN进行目标检测+OHEM
- SqueezeNet运用到Faster RCNN进行目标检测
- 【图像目标检测】Faster-RCNN
- 目标检测 RCNN, SPPNet, Fast RCNN, Faster RCNN 总结
- 目标检测:rcnn-->sppnet-->fast rcnn-->faster rcnn
- 用于目标检测的rcnn,fast-rcnn,faster-rcnn
- 【目标检测】Faster RCNN算法详解
- 【目标检测】Faster RCNN算法详解
- 蓝桥杯 历届试题 回文数字
- Caffe源码中Pooling Layer文件分析
- Design Pattern(2)-Strategy Pattern
- mybatis中的#和$的区别
- item图片 打开新的activity
- 使用Faster-Rcnn进行目标检测
- Hibernate表关系映射之一对一映射
- 个人作业1——四则运算题目生成
- swift开发中的一些小方法
- 正则详解及实战(JavaScript)
- Mysql 数据库(九)配置utf8编码集
- android系统UID定义
- 3-9遇到的一些概念 以及CNN相关概念2
- eclipse内存分配