最近在进行视频行人检测优化的课题,需要进行相关领域的技术和背景调研,完成开题同时,了解相关技术,为后面的队伍的proposal和项目做准备,技术调研报告如下:
1、概述
Faster-RCNN相关技术发展简图所谓目标检测,实则是从属于计算机视觉中的一项任务。它的目标是定位出图像中的物体,并且给出其具体类别。在自动驾驶车辆,智能监控中,目标检测的意义十分重大。而作为评判一个目标检测系统的标准,我们有三个重要的指标。
第一,IOU,也即判别预测的方框和真实的方框有多接近的一个指标。
第二,是 mAP(mean Average Presion),在多个类别的检测中,每一个类别都可以调整阈值,算出召回率从0到1时的准确率(同一召回率取最高的准确率),计算准确率的平均值,而后再对于所有类求平均得到 mAP。这个值介于0到1之间,且越大越好。
第三,是 fps,用于评判系统速度有多快。
目标检测算法的目标即为:定位更准、速度更快、分类更精确。有了这些指标,还需要有数据集来对算法进行评估。这里介绍一下两类最常用的通用数据集:
1、PASCAL VOC 数据集。这个数据集中有20个类别,如person,bird,cat,bicycle等。
2、微软的 COCO 数据集,这个数据集中一共有80个类别,面向于室内,室外。
它们大多面向于这类生活中的场景。在目标检测的特定领域应用中,也有特定的数据集。如,加州理工行人检测数据集,KITTI 自动驾驶算法数据集,可以看到它们的场景都是用车辆在实际的路口中拍摄的。
左为加州理工行人数据集,右为KITTI丰富而巨大的数据集极大地推动了目标检测领域的发展。与之对应的,还有不停提升的计算力和算法的更新。随着 2012 年 AlexNet 卷积神经网络赢得 ImageNet 分类赛的冠军,应用了深度学习的计算机视觉取得了一系列重大突破,其中最亮眼之一目标检测领域,一系列优秀的框架被提出,不少已经投入商用。
从图像识别的任务本质上就是两个问题:一:图像识别,二:定位。整个的目标检测框架也分为两大类。第一是 two-stage 两步走的框架,先进行区域推荐,再进行目标分类;另一个是 one-stage 端到端的框架,应用一个网络把所有事情都做了,一步输出结果。除此之外,还有free anchor,联级分类等。
目标检测框架的两种分类2、one_stage框架
2014 年 R-CNN 框架的提出是最早将卷积网络应用到目标检测上的方法之一。R-CNN 首先利用选择性搜索这类图像分割的算法进行区域推荐,而后将这些区域分别裁剪下来,缩放送入卷积网络,来做判定。在 VOC 数据集上,它一下就提升了 20% 多的 mAP。但是这样就会造成速度慢,因为给出的推荐区域通常有 2000 多个。
RCNN相关技术发展图示其基础上改进的 Fast R-CNN 通过在卷积层的最后一层添加一个区域池化层,使得推荐区域能够直接映射到这里来提取特征,减少了数千次重复的卷积运算,大大提升了速度。但它的区域推荐方法还是使用的选择性搜索,不能和 CNN 共享计算,速度瓶颈仍然存在。而 Faster R-CNN 则推出了区域建议网络 RPN,将这一步也用 CNN 来做,并且让区域建议网络和分类网络共享卷积特征,使得目标检测框架几乎达到实时,并且 mAP 达到了极高。还有2018年的mask R_CNN,把原有的Faster-RCNN进行扩展,添加一个分支(FPN)使用现有的检测对目标进行并行预测,可以有效地目标检测的同时完成了高质量的语义分割,但是速度较慢,在现实应用方面还需要优化。
2、one_stage框架
两种one_stage目标检测方法在YOLO中,它将图像分成 S*S 个单元,每个单元分别去预测方框,利用网络对这些方框直接去学习真实方框和所属类别。YOLO 非常快,小型的模型可以达到 155 fps ,但是随之而来的是 mAP 的降低,以及定位不准的问题。而 SSD 则有点像 Faster R-CNN 中的多类别 RPN 网络,是一个十分成功的检测框架。它采用特征金字塔的多层预测方法,在不同的卷积层上设置前景方框,在不同大小的特征图上考虑不同的尺度,相当于每个层分开预测,最后一起得到结果。
1、基于候选窗和深度学习的目标检测方法发展,即one-stage
RCNN
(1).在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
(2).每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
(3).对候选框中提取出的特征,使用分类器判别是否属于一个特定类
(4).对于属于某一类别的候选框,用回归器进一步调整其位置
许多候选框(如两千个)-->CNN-->得到每个候选框的特征-->分类+回归
Fast R-CNN
(1).在图像中确定约1000-2000个候选框 (使用选择性搜索)
(2).对整张图片输进CNN,得到feature map
(3).找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
(4).对候选框中提取出的特征,使用分类器判别是否属于一个特定类
(5).对于属于某一类别的候选框,用回归器进一步调整其位置
一张完整图片-->CNN-->得到每张候选框的特征-->分类+回归
Faster R-CNN
(1).对整张图片输进CNN,得到feature map
(2).卷积特征输入到RPN,得到候选框的特征信息
(3).对候选框中提取出的特征,使用分类器判别是否属于一个特定类
(4).对于属于某一类别的候选框,用回归器进一步调整其位置
一张完整图片-->CNN-->RPN-->得到候选框的特征-->分类+回归
Mask R-CNN
(1).对整张图片输进CNN,得到feature map
(2).卷积特征输入到RPN,得到候选框的特征信息
(3).对候选框中提取出的特征(通过ROI),使用分类器判别是否属于一个特定类,进一步调整候选框位置。
(4)与第(3)步同时进行,利用FPN,输出物体掩膜(object mask
),完成语义分割。
2、算法比较
Faster-RCNN通过交叉训练方式,共享卷积特征,从而大幅缩减了训练参数,除了CNN网络架构本身具有的权值共享,通过交替训练两个类型的网络达到cost free。
首先,Fast-RCNN:与典型的RCNN不同的是,典型的RCNN使用Selective Search;而Fast-RCNN使用EdgeBoxes。直接取得性能上的优势,论文给出的数据是,Selective Search:2 seconds per image,而使用EdgeBoxes是0.2 seconds per image,也就是Fast-RCNN提高了十倍的速度。
然后,Faster-RCNN( 可以看做是对 Fast-RCNN 的再次改进版):主要解决的是如何在RPN网络中快速获得 proposal,卷积后的特征图其实是可以用来生成 region proposals 。 所以,作者通过增加两个独立平行的全连接层来实现 Region Proposal Networks (RPN) , 一个用来以回归方式生成推荐区域(region bounds),另一个则是objectness score。为了面对平移(缩放)不变性,经典做法有:对输入图片或者卷积网络里的滤波器进行整体尺度矩形长宽比例的采样;而作者的做法是:对推荐区域(novel “anchor” boxes)进行尺度矩形比例的采样.结果是,对推荐区域采样的模型,不管是速度还是准确率都取得很好的性能.
最后,为了将fully-convolutional network (FCN)的RPN 与 Fast-RCNN 相结合,用一种简单的训练方法:固定 proposals数目, 为训练RPN和Fast-RCNN, 这两个训练的task交替微调网络 ,交替过程实现卷积特征共享。因此不需要重复的卷积计算, 共享卷积特征也让两个网络快速地收敛,所以,大幅地提高了网络的训练和测试(应用)速度。
三、faster-RCNN过程结构分析学习
从上面的过程总结可以看出faster-RCNN的优势在于在候选框的生成方面使用RPN(Region Proposal Networks)代替Selective Search算法。有了一个大致了解后,再根据下图,我们可以将其过程分成几个部分:
(1)、特征提取(CNN):用一串卷积和池化从原图中提取出feature map;
(2)、RPN网络:通过网络训练的方式从feature map中获取多个候选框的大致位置;
(3)、ROI Pooling部分:利用前面获取到的精确位置,从feature map中抠出要用于分类的目标,并pooling成固定长度的数据(将不同大小的输入转换为固定大小的输出);
(4)、分类和回归:这一层的输出是最终目的,输出候选区域所属的类,候选区域在图像中的精确位置。
Faster R-CNN大体结构 Faster R-CNN详细结构下面主要分析RPN网络部分和ROI pooling部分
上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
1.1、Anchor
在RPN中,作者提出了anchor。Anchor是大小和尺寸固定的候选框。论文中用到的anchor有三种尺寸和三种比例,如下图所示,三种尺寸分别是小(蓝128)中(红256)大(绿512),三个比例分别是1:1,1:2,2:1。3×3的组合总共有9种anchor。
各种形式anchor然后用这9种anchor在特征图(feature)左右上下移动,每一个特征图上的点都有9个anchor,最终生成了 (H/16)× (W/16)×9个anchor. 对于一个512×62×37的feature map,有 62×37×9~ 20000个anchor。 也就是对一张图片,有20000个左右的anchor,基本是cover了800x600的各个尺度和形状。
1.2、训练RPN
RPN的总体架构如下图所示:
RPN架构anchor的数量和feature map相关,不同的feature map对应的anchor数量也不一样。RPN在Extractor输出的feature maps的基础之上,先增加了一个卷积,然后利用两个1x1的卷积分别进行二分类(是否为正样本)和位置回归。进行分类的卷积核通道数为9×2(9个anchor,每个anchor二分类,使用交叉熵损失),进行回归的卷积核通道数为9×4(9个anchor,每个anchor有4个位置参数)。RPN是一个全卷积网络(fully convolutional network),这样对输入图片的尺寸就没有要求了。
接下来RPN做的事情就是利用(AnchorTargetCreator)将20000多个候选的anchor选出256个anchor进行分类和回归位置。选择过程如下:
1)对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本。
2)对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
3)随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256。如下图所示。
softmax判定positive与negative其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已
对于每个anchor, gt_label 要么为1(前景),要么为0(背景),而gt_loc则是由4个位置参数(tx,ty,tw,th)组成,这样比直接回归座标更好。
计算分类损失用的是交叉熵损失,而计算回归损失用的是Smooth_l1_loss. 在计算回归损失的时候,只计算正样本(前景)的损失,不计算负样本的位置损失。
1.3、RPN生成RoIs
Proposal Layer负责综合所有候选框变换量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。RPN生成RoIs的过程(ProposalCreator)如下:
1)对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。
2)选取概率较大的12000个anchor
3)利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
4)利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs
注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300。RPN的输出:RoIs(形如2000×4或者300×4的tensor)
RPN网络结构总结起来就是:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
而RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:
原始的feature maps
RPN输出的proposal boxes(大小各不相同)
由于RoIs给出的2000个候选框,分别对应feature map不同大小的区域。首先利用ProposalTargetCreator 挑选出128个sample_rois, 然后使用了RoIPooling 将这些不同尺寸的区域全部pooling到同一个尺度(7×7)上。下图就是一个例子,对于feature map上两个不同尺度的RoI,经过RoIPooling之后,最后得到了3×3的feature map。
RoI Pooling 是一种特殊的Pooling操作,给定一张图片的Feature map (512×H/16×W/16) ,和128个候选区域的座标(128×4),RoI Pooling将这些区域统一下采样到 (512×7×7),就得到了128×512×7×7的向量。可以看成是一个batch-size=128,通道数为512,7×7的feature map。
如图所示:
Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。结构流程如下图所示:
暂时粗浅认知,需要继续深入细节以及代码实践。
参考博客:
目标检测参考博客:http://bbs.cvmart.net/articles/238/hou-r-cnn-shi-dai-faster-r-cnn-ssd-yolo-ge-lei-bian-ti-tong-zhi-xia-de-mu-biao-jian-ce-zong-shu-faster-r-cnn-xi-lie-sheng-le-ma
文章标题:从编程实现角度学习Faster R-CNN(附极简实现);文章地址:https://zhuanlan.zhihu.com/p/32404424
https://zhuanlan.zhihu.com/p/31426458
文章标题:从结构、原理到实现,Faster R-CNN全解析;文章地址:https://www.jianshu.com/p/ab1ebddf58b1
参考论文:
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks:
https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
github相关代码地址链接:
https://github.com/endernewton/tf-faster-rcnn
https://github.com/hoya012/deep_learning_object_detection