同r做一个窗口_目标检测(Object Detection):R-CNN/SPPnet/R-FCN/Yolo/SSD
这篇文章我是Survey目标检测(Object Detection)系列论文的一个总结。
包括R-CNN系列、SPP-net、R-FCN、YOLO系列、SSD、DenseBox等。
基本概念
- 目标识别:对给定图像做分类,比如输入一张动物的图片,让算法判断是某种动物或者含有多种动物。
- 目标检测:目标检测通常包括判断物体的位置和大小(Bounding box)、及判断物体的类别。
- Bounding Box:输出边界,以(x, y, 宽,高) 的形式呈现,其中x、y为Bounding Box的左上角坐标。
- IOU:对于两个矩形的Bounding box A和B,IOU = (A∩B)/(AUB),也就是A和B重叠的面积,除以A和B并集的面积。
- ROI:Region of Interest,目标区域,通常指待处理的图像子区域。
目标检测的难点
目标检测最大的难点在于无法提前判断输入图片中有多少目标(Objects),以及每个目标的 Bounding Box。一个粗暴的办法是在图像上选择不同的ROI,针对每个ROI用CNN网络来分类。但是,取多少个ROI,取多大?这是一个有巨大搜索空间的问题。如果暴力解决,将会消耗巨大算例,从时间复杂度上来讲是不现实的。
这个搜索空间到底是多少?
对于一个 m * n 像素的图像,有 m(m+1)n(n+1)/4 种可能,例如一个500 * 500像素的图像。Bounding box可能性的值将是15,687,562,500,不用数了,超过156亿。
此外,一个标准的全连接CNN网络没法直接应用到目标检测。原因是输出层的大小是不固定的,因为不同的图像可能含有不同数量的目标。
为了解决上述问题,在传统目标检测算法的基础上,近些年出现了众多的目标检测新算法,例如R-CNN系列、YOLO系列。下面具体介绍。
常见检测算法分类
- 传统的目标检测算法
- 候选区域生成+深度学习分类算法:
- 通过提取候选区域,并将每个区域交由以CNN为主的深度学习分类方案
- 如R-CNN / Fast-RCNN / Faster-RCNN / SPP-net / R-FCN 等系列方法;
- 深度学习的回归算法:
- YOLO / SSD / DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等
本文重点介绍类别2和3中的方法。上述分类参考文献[1]。
基于候选区域生成+深度学习分类的方法
这类方法的一个前提是需要算法先计算出候选区域(Bounding Boxes),之后是把候选区域交给由深度学习为主的分类模型做分类。
候选区域生成算法
对于候选区域生成,传统的方法包括滑动窗口,但是由于效率问题用的已经不多,目前常见的有Region Proposal系列的方法。
滑动窗口
在待识别的图像上设定一个窗口,将窗口内的图像交给算法识别;在图像上以设定的步长滑动此窗口,并将窗口内图像给算法识别;重复上述过程,直到将所有图像的区域检测完。之后,缩放窗口(改变窗口的大小)并重复上述步骤。
- Andrew Ng曾在Machine Learning课程中介绍过此技术,请看这里。
- 从滑动窗口的定义上可以看出,它的计算代价取决于图像大小、设定的滑动步长和窗口缩放的次数。因此,滑动窗口是一个计算密集型(Computing-intensive)的算法。
Region Proposal
Region Proposal对输入图像生成候选区域,通常比传统的滑动窗口方法获取的质量要更高。常用的方法包括下面几种。
(1)Selective Search [11]
核心思想:使用自底向上的聚类方法,把图像子区域合并为更大区域(同时维护层级结构)。
第1步:使用Felzenszwalb的方法[12]对输入图像做分割,分割为许多小区域,每个区域属于一个物体。
一个完整的Felzenszwalb方法的Demo请见这个GitHub Repository。
第2步:递归合并相似的区域为更大的区域。
使用贪心算法:
- 对于一个图像区域集合,选择最相似的两个区域
- 合并上述两个区域为一个更大的区域
- 重复上述过程,知道仅剩一个区域
第3步:使用上一步生成的区域生成候选物体的位置(Bounding box)
关于如何计算相似度等问题这里不介绍,请见文件[11]。
(2)Edge Boxes [14]
不需要学习参数,结合滑窗,通过计算窗口内边缘个数进行打分,最后排序。
主要思想:一个Bounding box里轮廓的数量体现了这个Bounding box含有一个物体的可能性。
第1步:计算Edges(如上图第二行)
- 采用论文Structured Forests for Fast Edge Detection [15]中的方法。
第2步:计算Edge groups(如上图第三行)
第3步:计算Edge groups之间的相似度
第4步:计算Edge groups的权值(取值0或1,表示是否完全被包含在Box中)
第5步:给Boxes打分(如上图第四行),基于被Box完整包含的轮廓(里的Edges)。
第6步:根据Boxes的分数,排序,选出Top N的Boxes作为候选区域。
Edge Boxes方法属于“Window scoring methods”,此类别中表现不错的算法还有Objectness、Bing等。这里不做介绍。
下面看一看历年来常见的Object Detection方案。
R-CNN (CVPR 2014)
R-CNN[16] 最核心的思想是,应用Selective Search方法从图像中提取2000张候选区域(Region proposals)。
R-CNN有如下步骤(如上图):
- 候选区域生成: 对输入的图像,采用Selective Search 方法生成约2K个候选区域
- 特征提取: 对每个候选区域,使用深度卷积网络(CNN)提取特征,特征向量为4096个维度
- 类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
- 位置精修: 根据区域的位置和分类信息,使用回归器(Bounding-box regression)修正候选框位置
R-CNN的不足:
- 每张图有2000个候选区域需要分类,窗口之间重复的部分导致了重复的卷积计算
- Selective Search非常耗时,导致每张图的预测时间需要47秒,没法应用到有实时预测的需求场景
- 选择搜索算法是一个固定算法,没有学习过程,可能会生成很差的候选区域
Fast R-CNN (ICCV 2015)
R-CNN的作者接着解决了部分R-CNN中的问题,极大的提升了识别速度,这个新的目标检测方法叫做Fast R-CNN [18]。
Fast R-CNN有如下步骤(如上图):
- 候选区域生成: 对输入的图像,采用Selective Search 方法生成候选区域
- 生成一个卷积特征映射(Feature map):输入为整幅图像
- 对于每个候选区域,利用ROI Pooling从feature map中提取一个定长的feature vector
- 一方面Feature vector被Softmax分类器用来预测类别
- 另一方面Feature vector被用来预测修正的Bounding box位置
Fast R-CNN比R-CNN更快的一个原因是不必每次都向卷积神经网络提供2000个候选区域。相反,每个图像只进行一次卷积运算,并从中生成特征映射。
从下图中的数据可以看出,Fast R-CNN相对R-CNN有明显的速度提升。在右侧的“测试时间”里可以看出,Fast R-CNN的大部分时间都用在了候选区域生成这一环节。因此,这一步也成了Fast R-CNN的性能瓶颈。
引用一段文献[1]的评论:
Fast-RCNN中,作者巧妙的把Bounding box regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。
关于ROI Pooling和Bounding Box Regression的具体讲解,请见参考文献[17]
Faster R-CNN (NIPS 2015)
Fast-RCNN的问题非常明显,基于Selective Search的Region proposal方法相对非常耗时。于是作者提出了Faster-RCNN [20],使用RPN代替Selective Search,而且这是一个端到端的CNN目标检测模型。
和Fast R-CNN类似,在Faster R-CNN中:
- 生成一个卷积特征映射(Feature map):输入为整幅图像
- 使用一个Region Proposal Network (RPN)生成候选区域
- 对于每个候选区域,利用ROI Pooling从feature map中提取一个定长的feature vector
- 一方面Feature vector被Softmax分类器用来预测类别
- 另一方面Feature vector被用来预测修正的Bounding box位置
这篇文章最大的贡献是发现网络中的各卷积层特征可以用来预测类别相关的Region proposal,不再需要Selective search。因此可以把Region proposal提取和分类、Bounding Box Regression融合进了一个网络模型。相对Fast R-CNN,其检测速率大幅提升(见下图),准确率也与原来的Fast-RCNN接近。
虽然如此,Faster R-CNN最快也仅能达到5 FPS的检测速率,用在高实时要求的场景是很牵强的。
关于RPN和Faster R-CNN训练的具体讲解,请见参考文献[17]
R-CNN/Fast R-CNN/Faster R-CNN对比总结
整理上述三节,总结R-CNN、Fast R-CNN、Faster R-CNN的架构和优劣如下[4]:
SPP-net (ECCV 2014)
SPP-net [19] 是针对R-CNN做的优化。此前的模型要求输入固定尺寸的图片。那么在做目标检测时,需要将候选区域做crop或者warp(如R-CNN用到warp)。上述操作会导致图片的变形和信息的丢失,限制识别精度。下图展示了此前的目标检测和SPP-net的架构区别。
SPP-net通过在卷积特征层上的空间金字塔池化以避免对图片必须固定大小这条限制。SPP-net生成一个固定长度的特征。下面是金字塔池化的原理图:
黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4 * 4,2 * 2,1 * 1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。[21]
R-FCN (NIPS 2016)
R-FCN[22] 是一篇对标Faster R-CNN的目标检测论文。其主要贡献在于解决了“分类网络的位置不敏感性(translation-invariance in image classification)”与“检测网络的位置敏感性(translation-variance in object detection)”之间的矛盾,在提升精度的同时利用“位置敏感得分图(position-sensitive score maps)”提升了检测速度。[23]
基于深度学习的回归方法
[今天先Survey这么多,以下三部分待更新]
YOLO
SSD
DenseBox
不同AI框架的Object Detection
TensorFlow
TensorFlow提供TensorFlow Object Detection API用于目标检测。
- 支持的Detector包括Faster R-CNN、SSD、PPN、RetinaNet等
- 其中Feature extractor包括MobileNet V2 、ResNet 101 FPN、ResNet V2
- 支持GPU和TPU
- 支持在Mobile Devices(e.g., Android,with TensorFlow Lite)
此Repository提供了Quick Start Demos和Guidances,建议访问Repo里看详细的说明。
PyTorch
PyTorch中似乎没有(也可能是我没发现)集成的Object Detection API,但是有众多GitHub Repo实现了流行的的算法:
- Faster R-CNN:https://github.com/ruotianluo/pytorch-faster-rcnn
- RetinaNet:https://github.com/kuangliu/pytorch-retinanet
- Yolo V3:https://github.com/ayooshkathuria/pytorch-yolo-v3
- SSD:https://github.com/amdegroot/ssd.pytorch
参考文献
- 视觉目标检测和识别之过去,现在及可能
- Selective Search for Object Detection
- RCNN- 将CNN引入目标检测的开山之作
- Faster R-CNN论文笔记
- R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms
- YOLO: Real-Time Object Detection - Yolo Official Site
- Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3
- 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
- Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition:SPP-net/何凯明/TPAMI 2015
- R-FCN: Object Detection via Region-based Fully Convolutional Networks:R-FCN/代季峰.何凯明/NIPS 2016
- Uijlings, Jasper RR, et al. "Selective search for object recognition." International journal of computer vision 104.2 (2013): 154-171. (Slides)
- Felzenszwalb, Pedro F., and Daniel P. Huttenlocher. "Efficient graph-based image segmentation." International journal of computer vision 59.2 (2004): 167-181.
- Object Detection for Dummies Part 1: Gradient Vector, HOG, and SS
- Zitnick, C. Lawrence, and Piotr Dollár. "Edge boxes: Locating object proposals from edges." European conference on computer vision. Springer, Cham, 2014.
- Dollár, Piotr, and C. Lawrence Zitnick. "Structured forests for fast edge detection." ICCV. 2013.
- Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." CVPR. 2014.
- RCNN, Fast-RCNN, Faster-RCNN的一些事
- Girshick, Ross. "Fast r-cnn." ICCV. 2015.
- He, Kaiming, et al. "Spatial pyramid pooling in deep convolutional networks for visual recognition." IEEE transactions on pattern analysis and machine intelligence 37.9 (2015): 1904-1916.
- Ren, Shaoqing, et al. "Faster r-cnn: Towards real-time object detection with region proposal networks." NIPS. 2015.
- SPP-Net论文详解
- Dai, Jifeng, et al. "R-fcn: Object detection via region-based fully convolutional networks." NIPS. 2016.
- 详解R-FCN
同r做一个窗口_目标检测(Object Detection):R-CNN/SPPnet/R-FCN/Yolo/SSD相关推荐
- 同r做一个窗口_怎样在触摸屏上做一个自定义的弹出窗口?
在触摸屏的应用中,一些故障.警告等提示信息通常是使用系统的报警窗口来实现.系统的报警窗口通常只有故障/警告的编号.日期时间及报警信息等内容,并且可以被折叠.这种千篇一律的报警窗口有时候并不能满足项目的 ...
- 用PaddleDetection做一个完整的目标检测项目(上)
文章转载自:微信公众号:飞桨PaddlePaddle的微信文章 原文章中由于排版问题,导致文字遮挡,不便阅读,因此对文章格式稍作更改,增加了一些关键词加粗,便于后续阅读. PaddleDetectio ...
- [Intensive Reading]目标检测(object detection)系列(九) YOLOv3:取百家所长成一家之言
目标检测系列: 目标检测(object detection)系列(一) R-CNN:CNN目标检测的开山之作 目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享 ...
- CV之OD:计算机视觉之目标检测(Object Detection)方向的简介、使用方法、案例应用之详细攻略
CV之OD:计算机视觉之目标检测(Object Detection)方向的简介.使用方法.案例应用之详细攻略 目录 OD目标检测的简介 1.Selective Search for Object Re ...
- 深度学习目标检测(object detection)系列(一) R-CNN
原文链接 R-CNN简介 R-CNN提出于2014年,应当算是卷积神经网络在目标检测任务中的开山之作了,当然同年间还有一个overfeat算法,在这里暂不讨论. 在之后的几年中,目标检测任务的CNN模 ...
- 快速目标检测--Object detection at 200 Frames Per Second
Object detection at 200 Frames Per Second 本文在 Tiny Yolo 的基础上设计了一个目标检测网络,在 Nvidia 1080ti 上可以达到 100帧每秒 ...
- 什么是目标检测--Object Detection
目标检测,也叫目标提取,是一种基于目标几何和统计特征的图像分割.它将目标的分割和识别合二为一,其准确性和实时性是整个系统的一项重要能力.目标检测不仅要用算法判断图片中物品的分类, 还要在图片中标记出它 ...
- 目标检测--Object Detection via Aspect Ratio and Context Aware
Object Detection via Aspect Ratio and Context Aware Region-based Convolutional Networks https://arxi ...
- rcnn 回归_基础目标检测算法介绍:CNN、RCNN、Fast RCNN和Faster RCNN
每次丢了东西,我们都希望有一种方法能快速定位出失物.现在,目标检测算法或许能做到.目标检测的用途遍布多个行业,从安防监控,到智慧城市中的实时交通监测.简单来说,这些技术背后都是强大的深度学习算法. 在 ...
最新文章
- mysql 清理host文件_如何删除mysql 数据库里面的host
- mysql游标遍历修改_mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答...
- 在 Linux 中使用动态磁盘
- iOS 转盘动画效果实现
- 乐高科技系列搭建指南 pdf_玩转乐高创意亲子搭建系列(4)小颗粒作品
- KeyPass密码管理软件使用说明
- srcnn+matlab版本,实现SRCNN
- 全国计算机等级考试怎么卸载,教你三种方法卸载Windows7SP1Beta
- 转载:ultraiso制作超过4G的系统U盘启动盘教程
- iOS 获取手机的ip地址 并传给后台(三步搞定)
- win 10 安装visual studio 2010
- 获取dom元素的方法
- mysqladmin命令用法
- 【应用随机过程】03. 马尔可夫链的状态
- 决策树模型算法研究与案例分析
- NX安装cuda和cudnn
- C/C++ 假币问题
- HP笔记本 no bootable device insert boot disk and press any key
- NC开发软件的错误以及改正
- USB/TTL/RS232/RS485
热门文章
- log analysis Werzeug aus Deutschland Dr
- git diff 常见用法
- linux5 多用户模式,centos7设置以多用户模式启动
- 点到曲线的距离公式_推导点到直线的距离公式到底有多少种方法?
- 继爱奇艺后,腾讯视频会员也要涨价了
- 不下载APP就不能看全文?工信部出手了...
- 特斯拉拦不住蔚来取代BBA的心
- “秃如其来”的90后,造就了一个蒸蒸日上的产业
- 别人家的公司!Facebook向每位员工发放1000美元,鼓励远程办公
- 已走过8年时间!百度这一重要产品正式宣布停止服务