title:Rich feature hierarchies for accurate object detection and semantic segmentation
arxiv: http://arxiv.org/abs/1311.2524
github:https://github.com/rbgirshick/rcnn
slides:http://www.image-net.org/challenges/LSVRC/2013/slides/r-cnn-ilsvrc2013-workshop.pdf
slides::http://www.cs.berkeley.edu/~rbg/slides/rcnn-cvpr14-slides.pdf
1、整体思路
- 在图像中确定约1000-2000个候选框(使用选择性搜索)
- 每个候选框内图像块缩放至相同大小,并输入CNN内进行特征提取
- 对候选框提取的特征,使用分类器判别是否属于一个特定类
- 对于某一特征的候选框,用回归进一步调整其位置
2、具体步骤
步骤一:训练(或者下载)一个分类模型(比如AlexNet)
步骤二:对该模型做fine-tuning
- 将类别数从1000改为20
- 去掉最后一个全连接层
步骤三:特征提取
- 提取图像的所有候选框
- 对于每一个区域:修正区域大小以 适合CNN的输入,做一次前向运算,将第五个池化层的输出存到硬盘
步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别
- 每一个类别对应一个SVM,判断是否属于这个类别
- 是就是positive,反之nagative,比如下图就是狗分类的SVM
步骤五:使用回归器精细修正候选框位置
- 对于每一个类,训练一个线性回归模型判定是否框得完美
3、创新点
- 经典的目标检测算法使用滑动窗一次判断所有可能的区域,R-CNN则提取预先提取一系列较可能是物体的候选区域,之后尽在这些区域上进行特征提取、判断,大大加快的速度
- 经典的目标检测算法在区域中提取人工设定的特征(Haar,HOG),RCNN则通过深度网络提取特征,可供使用的有两个数据库:
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片的中物体的类别,1000w张,1000类
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置,1w张,20类
本文使用识别库进行预训练,而后用检测库调优参数
4、不足
- 即使使用了selective search等预处理步骤来提取潜在的bounding box作为输入,仍然会有严重的速度瓶颈,因为计算机对所有region进行特征提取时会有重复计算
- 一般CNN后接全连接层或分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者wrap,这些预处理会造成数据的丢失或几何的失真
5、实践
作为一个技术控,是不会那么满足的,总想着自己动手实现一下,于是就决定跑一下RCNN的模型,在搭建环境的时候真的差不多把所有的问题都过了一遍,虽然花费了一些时间,不过,结果是好的,总算把模型成功的跑了起来。这里给和我一样想要实践一下的博友们一些建议,希望能有所帮助:
- 一定要严格按照官网的要求来做,不然会遇到各种各样的问题,特别需要注意的就是caffe的版本、CUDA的版本
- 遇到问题不用慌,尽量在github上找答案,因为你遇到的所有问题,应该都有人曾经遇到过,并且已经解决
- 按官网上的方法已经不能下载预处理模型,这是因为中国已经把dropbox墙了,大家点击r-cnn-release1-data.tgz、r-cnn-release1-selective-search.tgz进行下载,关注下方的二维码回复RCNN获取密码
- 常见的错误可见https://blog.csdn.net/sinat_29089097/article/details/52702246
- 最后附上RCNN预处理模型处理的结果图
6、参考文献
- https://www.cnblogs.com/skyfsm/p/6806246.html
- https://blog.csdn.net/jiachen0212/article/details/82496401
- https://blog.csdn.net/qq_35451572/article/details/80273088
7、期待你的关注