faster-rcnn:Fast Region-based Convolutional Neural Networks基于区域的卷积神经网络

http://blog.csdn.net/column/details/ym-alanyannick.html

先感谢敖川学长给我提供练手的电脑!
前面都学习CNN在图像分类上的巨大优势和应用,但是要把CNN用作目标检测改怎么实现,困扰了我很久。学了几天先作个笔记。
在Faster R-CNN之前还有R-CNN和Fast R-CNN。既然Faster R-CNN是前面的改进,我就先学Faster R-CNN。

如有错误请指正!

理论部分

在学习目标检测之前,我就想象CNN怎么用作目标检测。第一想法是将图像切割送入网络中。RCNN就是类是滑动窗的东西进行操作:
1.提取建议区域
2.利用CNN对建议区域进行分类
- 提取建议区域方法的发展:1.滑动窗口 2.select search/edge box 3.rpn(Region Proposal Network)
- 其他深度学习检测策略,利用CNN强大表述能力直接对目标位置进行回归,例如YOLO

R-CNN、Fast R-CNN、Faster R-CNN三者关系

SPP Net

一般CNNs后解full-connect layer或者classifier,他们都需要固定的输入尺寸。因此不得不对输入数据进行crop(修剪)或warp(弯曲),这些预处理会造成数据丢失或几何学上的失真。SPP Net的第一个贡献是将空间金字塔的思想加入到CNNs中,实现了数据的多尺度输入。


如图,在卷积层和全连接层之间加入SPP layer。此时网络的输入可以是任意尺寸,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺寸始终是固定的。
在R-CNN中,每个proposed region先rescale成统一大小,然后分别作为CNNs的输入,这样是很低效的。
在SPP Net中,只对原图进行一次卷积得到整张图的feature map,然后找到每个proposed region在feature map上的映射patch,将此patch作为每个proposed region的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间,比R-CNN有一百倍左右的加速。

Fast R-CNN整体结构


如图,Fast R-CNN的网络有两个输出层,一个softmax,一个bbox regressor(相对的R-CNN,SPP Net中分类和回归是两个部分,这里集成在了同一个网络中)。而且加入了一个RoI pooling layer(类似于一个尺度的SPP layer)。注意:Fast R-CNN提取建议区域的方法依然是select search。
- RoI pooling layer
这是SPP pooling的一个简化版本,可以看做是只有一个尺度 filter的‘金字塔’。输入是N个整幅图的feature map和一组R个RoI(proposed region)。每个特征映射都是H*W*C,每个RoI是一个元组(n,r,c,h,w),n是特征映射的索引,r,c,h,w分别是RoI的左上角坐标和高与宽。输出是max-pooling过得特征映射H’xW’xC,如上图中红色框线。

Faster-RCNN整体框架


Faster R-CNN的主要贡献是设计了提取建议区域的网络Region Proposal Network(RPN)。代替了费时的select search,使检测速度大为提高。下图为Faster R-CNN的结构图,黄色部分为RPN,可以看出除了RPN,其它部分继承了FR-CNN的结构

RPN整体结构


RPN的网络结构类似于FR-CNN,连接与最后卷基层输出的feature map,有一个RoI层,两个输出层,一个输出滑窗为建议区域的概率,另一个输出bbox回归的offset。其训练方式也类似于FR-CNN。注意:RPN与FR-CNN共用卷积层。

RPN通过一个滑动窗口(图中红色框)连接在最后一个卷积层输出的feature map上,然后通过全连接层调整到256-d的向量,作为输出层的输入。同时每个滑动窗对应k个anchor boxes,在论文中使用3个尺寸和3个比例的3*3=9个anchor。每个anchor对应原图上一个感受野,通过这种方法提高scale-invariant。

Multi-task loss

FR-CNN的有两个网络输出层,将原来与网络分开的bbox regression的操作整合在了网络中。并设计了一个同时优化两个输出层的loss函数。

RoI-centric sampling与Image-centric sampling
  • RoI-centric sampling:从所有图片的所有RoI中随机均匀取样,这样每个SGD的mini-batch中包含了不同图像中的样本(SPP Net采用)。SPP Net的反向传播没有到SPP pooling之前的层,因为反向传播需要计算每一个RoI感受野的卷基层,通常会覆盖整幅图像,又慢又耗内存。FR-CNN想要解决这个限制。
  • Image-centric sampling:mini-batch采用分层采样,先对图像采样,再对RoI采样。将采样的RoI限定在个别图像内,这样同一图像的RoI共享计算和内存。通过这种策略,实现了端到端的反向传播,可以fine-tuning整个网络。

为了使共用的卷积层在训练RPN和FR-CNN时都会收敛,论文里设计了一个四步训练的策略:
- (1):对RPN进行end-to-end的训练,这里网络使用ImageNet pre-trained model进行初始化。
- (2):使用第一步RPN生成的建议区域训练FR-CNN,这里也使用ImageNet pre-trained model进行初始化。
- (3):使用上一步FR-CNN的参数初始化RPN,固定卷基层,只fine-tune RPN独有的层。(在此步已共享卷积层)
- (4):固定卷基层,只fine-tune FR-CNN独有的层。

训练时采用的一些策略与参数设置

训练样本选择方法与其参数设置

Fast-RCNN中参数的设置ims_per_batch 1或2batch_size 128每个batch中正样本占得比率。  fg_fraction 0.25与GT的IOU大于阈值0.6的ROI作为正样本。  fg_thresh=0.6与GT的IOU在阈值0.1到0.5之间的ROI作为负样本。bg_thresh_hi=0.5、bg_thresh_lo=0.1

实现部分

参考:http://blog.csdn.net/u012177034/article/details/52288835

1.下载py-faster-RCNN源码
2.编译lib库
cd $FRCN_ROOT/lib
make
3.编译caffe

这部分巨恶心,由于py-faster-rcnn编写时的caffe版本很老无法直接编译,可以直接下载我提供的连接链接:http://download.csdn.net/download/zefan7564/10148990 我的配置为:GTX1070,CUDA8.0,cuDNN6.5,i7

cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge caffe/master
4.运行demo
cd $FRCN_ROOT
./tools/demo.py
4.修改为视频流demo

faster-rcnn的确实不能满足实时性要求,fps在这配置下为8,延迟为0.5s左右
由于原代码使用了matplotlib绘图模块,每次显示需要手动关闭。如果要处理视频还是使用opencv,但是opencv的参数与matplotlib不同需注意。
demo_vedio.py
需要改的地方在vis_detections()这个函数里
我直接把关键代码贴上来,工程会分享链接

def demo(net, im):"""Detect object classes in an image using pre-computed object proposals."""# Load the demo image#im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)#im = cv2.imread(im_file)# Detect all object classes and regress object boundstimer = Timer()timer.tic()scores, boxes = im_detect(net, im)timer.toc()print ('Detection took {:.3f}s for ''{:d} object proposals').format(timer.total_time, boxes.shape[0])# Visualize detections for each classCONF_THRESH = 0.8NMS_THRESH = 0.3for cls_ind, cls in enumerate(CLASSES[1:]):cls_ind += 1 # because we skipped backgroundcls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)]cls_scores = scores[:, cls_ind]dets = np.hstack((cls_boxes,cls_scores[:, np.newaxis])).astype(np.float32)keep = nms(dets, NMS_THRESH)dets = dets[keep, :]vis_detections(im, cls, dets, thresh=CONF_THRESH)def parse_args():"""Parse input arguments."""parser = argparse.ArgumentParser(description='Faster R-CNN demo')parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',default=0, type=int)parser.add_argument('--cpu', dest='cpu_mode',help='Use CPU mode (overrides --gpu)',action='store_true')parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',choices=NETS.keys(), default='vgg16')args = parser.parse_args()return argsif __name__ == '__main__':cfg.TEST.HAS_RPN = True  # Use RPN for proposalsargs = parse_args()prototxt = os.path.join(cfg.MODELS_DIR, NETS[args.demo_net][0],'faster_rcnn_alt_opt', 'faster_rcnn_test.pt')caffemodel = os.path.join(cfg.DATA_DIR, 'faster_rcnn_models',NETS[args.demo_net][1])if not os.path.isfile(caffemodel):raise IOError(('{:s} not found.\nDid you run ./data/script/''fetch_faster_rcnn_models.sh?').format(caffemodel))if args.cpu_mode:caffe.set_mode_cpu()else:caffe.set_mode_gpu()caffe.set_device(args.gpu_id)cfg.GPU_ID = args.gpu_idnet = caffe.Net(prototxt, caffemodel, caffe.TEST)print '\n\nLoaded network {:s}'.format(caffemodel)# Warmup on a dummy imageim = 128 * np.ones((300, 500, 3), dtype=np.uint8)for i in xrange(2):_, _= im_detect(net, im)videoCapture = cv2.VideoCapture('/home/noneland/PycharmProjects/Train0707/BR2.avi') success, im = videoCapture.read()while success :demo(net, im)success, im = videoCapture.read() if cv2.waitKey(10) & 0xFF == ord('q'):breakvideoCapture.release()cv2.destroyAllWindows()

很好的一张原理图:

目标检测 Faster R-CNN运行及实时性DEMO测试相关推荐

  1. 目标检测——Faster R-CNN论文阅读

    论文阅读--Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks 文章目录 论文阅读--Faste ...

  2. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  3. 目标检测Faster RCNN 批量标记数据集,生成xml,csv以及record文件

    目标检测Faster RCNN 批量标记数据集,生成xml,csv以及record文件 0.将png图片转换为jpg import os from PIL import Image# dirname_ ...

  4. 目标检测——Faster R_CNN使用smooth L1作为bbox的回归损失函数原因

    目标检测--Faster R_CNN使用smooth L1作为bbox的回归损失函数原因 前情提要-- 网上关于目标检测框架--faster r_cnn有太多太好的博文,这是我在组会讲述faster  ...

  5. 重温目标检测--Faster R-CNN

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks NIPS2015 https://gith ...

  6. 深度学习和目标检测系列教程 7-300:先进的目标检测Faster R-CNN架构

    @Author:Runsen Faster R-CNN 由于Fast R-CNN 过程中仍然存在一个瓶颈,即ROI Projection.众所周知,检测对象的第一步是在对象周围生成一组潜在的边界框.在 ...

  7. 目标检测--Faster R-CNN

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks NIPS 2015 Matlab code ...

  8. 【目标检测系列】CNN中的目标多尺度处理方法

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]本篇博文我们一起来讨论总结一下目标检测任务中用来处理目标多尺度的一些算法. ...

  9. 遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

    我国高分辨率对地观测系统重大专项已全面启动,高空间.高光谱.高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源.未来10年全球每天获取的观测 ...

最新文章

  1. sklearn网格搜索
  2. VS Code 1.29 发布,众多新功能有没有你想要的?
  3. 简单文件系统的实现_300来行代码带你实现一个能跑的最小Linux文件系统
  4. P5956-[POI2017]Podzielno【数学】
  5. 1.the linux device model--kobject kset学习笔记
  6. 导出参考文献是ciw格式_使用 EndNote 9 引用参考文献
  7. uds帧格式_UDS诊断帧
  8. Struts2之初识篇(一)——与struts的区别和基本配置
  9. 使用HTML5创建和播放声音
  10. vue canvas动效组件插件库制作
  11. iOS开发之字典(NSDictionary)和JSON字符串(NSString)之间互转
  12. 锐起无盘服务器优化,(锐起无盘系统制作系统优化教程.doc
  13. 正则表达式的语法汇总
  14. 如何购买银行理财子公司的理财产品?
  15. GSK消费保健品推出首款碳中和牙刷;雀巢“可持续发展列车”驶入瑞士驻华大使馆 | 知消...
  16. 小萝莉五子棋(高能绕行)
  17. redis管理工具rdm安装;另一个管理工具medis
  18. 11_04_第六阶段:大前端进阶||07-Vue详解||P6:Vue绑定事件【观看狂神随笔】
  19. LWN: iproute2和libbpf如何打包!
  20. Java 四种访问权限

热门文章

  1. 来了来了,阿里p9整理的Netty速成笔记,应有尽有
  2. 如何选择适合你的兴趣爱好(三十一),围棋
  3. ISO14064简介
  4. 转 IE 下载docx xlsx 文件另存为zip文件
  5. 二叉树的周游(c++实现)
  6. MSDN中的收藏夹备份或导出
  7. 《配置办公室共享打印机,型号HP LaserJet 1020》
  8. 优化器-RBO 的规则转化
  9. 百度脑图json数据导出并保存数据库
  10. 继KB3035583后微软再发恶意补丁KB3123862、千万不要打!!!