4.3 目标检测概览与R-CNN家族

1.从认出是什么,到框出在哪里

4.1 节我们聊过图像分类,那只需要回答这张图里主要是什么。可现实中很多任务不止要认出物体,还得说清楚它到底在画面的哪个位置,用一个框把它圈出来。这类任务叫目标检测。你想象一下自动驾驶,光知道画面里有车、有行人远远不够,还得知道每辆车、每个行人具体在哪个位置、占多大一块,才能决定怎么避让。所以检测模型吐出来的,是一组带位置的框,每个框配一个类别和一个置信度。和分类比,检测难就难在它既要分类、又要定位,还得应付一张图里有多个物体、大小各异的情况。

2.检测里几个绕不开的概念

要把检测讲清楚,几个基本概念得先弄明白。第一个是边界框(bounding box),就是框住物体的那个矩形,通常用它的左上角和右下角坐标,或者中心点加宽高来表示。第二个是IoU(交并比),衡量预测框和真实框重合得好不好,算法是两个框的交集面积除以并集面积。IoU等于1表示完全重合,等于0表示完全不沾边。举个数感受一下,假设一个真实框和一个预测框的交集面积是40、并集面积是50,那IoU就是40除以50等于0.8,重合得相当好,妥妥算预测对了。要是交集只有10、并集是90,IoU才约0.11,那就基本算没框上。评判一个框算不算预测对了,一般要求IoU超过某个阈值,比如0.5。

第三个是mAP(平均精度均值),把每个类别的精度在不同置信度阈值下算出来再综合平均,是检测任务最常用的整体评价指标,2.14 节讲评估时提过精度的思路,这里是把它推广到带框的检测上。检测圈常用的数据集有Pascal VOC和COCO,其中COCO类别多、场景杂、小物体多,评价起来也更讲究,除了mAP在IoU阈值0.5下的值,还会算一系列不同IoU阈值(从0.5到0.95)下的平均,记作mAP@.5:.95,更全面地衡量一个检测模型。

还有两个概念常和检测搭在一起。一个是anchor(先验框),预先设定好一堆不同大小、长宽比的参考框,模型去预测怎么把这些参考框微调成真正的物体框,比让模型凭空从零画框容易得多。另一个是NMS(非极大值抑制),因为同一个物体往往会被预测出好几个重叠的框,NMS的做法是保留置信度最高的那个,把和它IoU太大的其余框删掉,确保一个物体只留一个框。

3.两阶段检测的开端:R-CNN

早期的深度学习检测,走的是两阶段的路子,R-CNN是这条路的起点,2014年提出。它的思路分两步:先用一个叫选择性搜索的传统方法,从图里找出两千个左右可能含有物体的候选区域,然后把每个候选区域单独裁出来、放缩成同样大小,分别送进一个CNN去提特征,最后用一组SVM来判断每个区域是什么类别、再用回归微调框的位置。

现在看这套流程挺笨重,但在当年,它第一次证明了深度学习的特征用在检测上效果远超传统方法,把检测的精度带上了一个新台阶,是两阶段检测的思想源头。所谓两阶段,就是先把可能含物体的区域挑出来,再对这些区域逐个判断类别和精修位置,分两步走。R-CNN能用,但慢得让人头疼,因为它要对两千个候选区域各跑一次CNN,重复计算太多。小明第一次跑R-CNN,等一张图的结果等得快睡着了,就是这个原因。

4.Fast R-CNN和Faster R-CNN:越来越快、越来越端到端

接下来两代,主线就是把R-CNN的毛病一个个修掉。Fast R-CNN的关键改进,是整张图只过一次CNN,得到一张特征图,然后那些候选区域直接到这张特征图上去取对应位置的特征,再也不用每个区域单独跑一遍网络了。这一下重复计算省掉了大半,速度和精度都上来了,而且把分类和框回归也合到了一起做多任务训练。

可Fast R-CNN还留了个尾巴,那两千个候选区域仍然得靠选择性搜索这个慢吞吞的传统方法来找,它不在网络里。于是Faster R-CNN干脆引入了一个区域提议网络(RPN),让网络自己学会怎么提候选框,把选择性搜索也搬进了神经网络里。具体说,RPN在特征图上铺一堆anchor,对每个anchor预测两样东西,一是它这里是不是物体(一个二分类),二是它的坐标该怎么微调,这样就能端到端地学会自己提候选框。到这一步,从提候选框、提特征、到分类和回归框,全都合进了一个网络,第一次做到了真正意义上的端到端训练,速度也快了一大截。Faster R-CNN成了两阶段检测的经典范本,后来很多检测模型都借鉴它的思路。

5.Mask R-CNN:顺便把每个物体的形状抠出来

Mask R-CNN在Faster R-CNN基础上又加了一个分支,让模型除了给出框和类别,还预测框里每个像素是不是属于这个物体,相当于在检测的同时做了一点实例分割,把物体的精确轮廓也抠了出来。它做实例分割的效果很好,应用面也广,比如医学图像里把病灶区域精确标出来,就是这类活儿。

6.两阶段的脾气:准,但快不起来

把R-CNN这一串放一起看,两阶段检测的特点很鲜明:先提候选区域,再逐个精修分类,所以它框得准、小物体也照顾得到,精度一直很高。代价是流程长、两步走,速度天然快不起来,实时场景里就吃力了。两阶段检测因为准,在一些不追求实时、但追求精度的场合仍然是首选,比如医疗影像里的病灶检测、卫星图里的小目标识别。而在安防、自动驾驶、工业流水线这些要实时出结果的场合,一阶段的YOLO就更吃香。所以这两条路子各有各的场,看任务要精度还是要速度。

这几年检测还有个趋势是往anchor-free(无先验框)走,不再依赖预设的anchor,直接预测物体的关键点或中心,代表作有CenterNet、FCOS,思路更简洁。但万变不离其宗,框、IoU、mAP、NMS这些基本功,哪条路子都得用。小张当时做项目要实时检测,试了两阶段觉得太慢,转头就奔YOLO去了。把两阶段吃透,再去理解一阶段和anchor-free,就会顺畅很多。

实际工程里,一个检测流程往往是这样:先备好带框标注的数据(标注成本不低,框要人工一个个画),训练一个检测模型,然后在测试图上跑出框,过NMS去重,再按置信度阈值筛掉不靠谱的框,最后把留下来的框画出来,或者喂给下游做跟踪、计数。小张做的是一个校园人流统计的小项目,靠检测模型把画面里的人都框出来,再配上简单的跟踪计数,就能大致估出各个时段的人流量,效果还挺像模像样。当然真要追求高精度,标注和调参还得再下一番功夫。

练习

Q1. 检测里 IoU 和 NMS 分别是干什么的?

IoU(交并比)是预测框和真实框的交集面积除以并集面积,衡量两者重合得好不好,等于 1 是完全重合,一般要求超过 0.5 才算预测对了。NMS(非极大值抑制)是后处理:同一个物体往往被预测出好几个重叠的框,NMS 保留置信度最高的那个,把和它 IoU 太大的其余框删掉,确保一个物体只留一个框。

Q2. 一个预测框和真实框的交集面积是 40、并集面积是 50,IoU 是多少?按 0.5 阈值算预测对了吗?

IoU=40/50=0.8=40/50=0.8,重合得相当好,远超 0.5 阈值,妥妥算预测对了。如果交集只有 10、并集是 90,IoU 才约 0.11,那就基本算没框上。

Q3. R-CNN 要对两千个候选区域各跑一次 CNN,慢得要命。Fast R-CNN 和 Faster R-CNN 分别怎么把速度提上去的?

Fast R-CNN 的关键改进是整张图只过一次 CNN 得到一张特征图,候选区域直接到这张特征图上去取对应位置的特征,省掉了每个区域单独跑网络的重复计算;它还把分类和框回归合到一起做多任务训练。Faster R-CNN 则把生成候选区域也搬进了网络,引入区域提议网络(RPN),在特征图上铺 anchor 来预测是否是物体和坐标微调,端到端学会自己提候选框。到这一步从提框、提特征到分类回归全合进了一个网络。

Q4.(面试题) 两阶段检测(R-CNN 家族)和一阶段检测(YOLO)各有什么脾气?什么场景该选哪个?

两阶段先提候选区域、再逐个精修分类,所以框得准、小物体也照顾得到,精度一直很高;代价是流程长、两步走,速度天然快不起来,实时场景吃力。一阶段一刀切,从原图一次性回归出所有框和类别,速度能跑到每秒几十上百帧,但精度(尤其早期版本)比两阶段差一截,小物体也不太友好。所以追求精度的场合(医疗影像病灶检测、卫星图小目标识别)首选两阶段;要实时出结果的场合(安防、自动驾驶、工业流水线)选一阶段的 YOLO 更吃香。这几年还有往 anchor-free(CenterNet、FCOS)走的趋势,但框、IoU、mAP、NMS 这些基本功哪条路都得用。

相关标签
深度学习目标检测R-CNN计算机视觉