一、概述Object Detection
最早深度学习只支持一张图片包含单个目标时,对该图片进行classification或对图片中的单个物体进行classification with localization:
- classification : 适用于一张图片中只有一个目标,以三分类为例 y = [ c1, c2, c3],直接使用softmax即可;
- classification with localization: 是指在softmax给出分类结果的同时,同时期望给出目标的位置,需添加bounding box的4个参数(bx, by, w, h), 让网络回归出目标的具体位置,即 y = [pc, bx, by, bh, bw, c1, c2, c3]
pc的作用:如果包含目标,则pc设为1,再去设定其他参数;如果不是目标,则pc设为0 。这样,对于常见的误检图片(负样本)也可以加入到数据中,降低误检)。
在此基础上,逐渐发展为支持一张图片有多个目标时给出每个目标的类型和位置,即我们现在说的目标检测object detection问题。
object detection: 基于上述classification with localization发展而来的最直观的目标检测算法是滑移窗口+classification算法:在图片内选择窗口,假设是一个窗口内只有一个object的假设,从而将窗口内的问题转化为Classification问题。滑移窗口相当于暴力搜索法,在空间滑移窗口以覆盖不同空间位置,同时,还需要选择不同尺度的窗口以覆盖不同尺度的目标。该方法的缺点是:
- 计算量大,且涉及很多冗余计算;
- 选择的窗口的位置肯定不能保证准确贴合目标位置的,但是也不适合使用滑移窗口+Classification and localization的方法,一方面由于目标有可能不是全部落在窗口中的,另一方面,增加回归bounding box的4个参数会使得计算量更大。
在实际发展中,逐渐发展了很多更简洁、快速、有效的算法。总体而言,根据是否先使用Region Proposal,分为Two-stages和One-stage;根据是否依赖预选框进行正负样本的定义和归一化,分为Anchor based和Anchor free的方法。Anchor based可以是Two stages,也可以是One stage的;Anchor free的方法一般属于One-stage。注意,这些方法中其实出现了3种box,不要混淆它们的概念:
- Anchor box是一些预定义尺寸的box,实质是一些regression reference;
- Region Proposal是基于Anchor box进行了一次Regression获得的class-independent的区域box,随后在该区域提取feature再进行class-dependent的Regression;
- bbox是最终检测结果的框,无论是Anchor based还是Anchor free,无论是Two stages还是One stage,都会产生最终的bbox结果。
在之前的博客中我讲述了CNN网络的Backbone网络的发展历程很大程度地依赖于2010~2017年ImageNet数据集CNN:经典Backbone和Block_yly的博客-CSDN博客 的比赛(主要体现在分类任务),本文讲述的目标检测Head的优化发展更依赖于另一个数据集PASCAL VOC 2005-2012(数据集到2012年就不更新了,但评分网站一直开放,所以到今天为止不断有模型刷榜,算法排名可参见http://host.robots.ox.ac.uk:8080/leaderboard/main_bootstrap.php )上,本文我们主要使用其中的comp4的进行排名http://host.robots.ox.ac.uk:8080/leaderboard/displaylb_main.php?challengeid=11&compid=4。
二、Two-stages & Anchor based算法
先利用传统算法或CNN网络给出候选框,再在候选框上运行classification以及进一步回归优化候选框的精确位置。Girshick等人的一些列工作引出了anchor box方法和两阶段模型。
R-CNN (2014,Rich feature hierarchies for accurate object detection and semantic segmentation,VOC2007 mAP=49.6)中,使用三步完成目标检测:
A. 使用传统方法做Region proposals;
B. 将候选框Resize到固定尺寸后放入CNN网络中提取feature,并输出一个固定长度的feature vector;
C. 使用了传统的机器学习方法对提取的feature vector进行分类。
图片引自Rich feature hierarchies for accurate object detection and semantic segmentation
这里,只用CNN网络提取特征,对于每一个Region proposal都需要送进一次CNN网络,每张图片对应着~2k个Region proposal,这使得处理一张图片非常慢,无法做到实时;另外,由于最后只是使用了机器学习的方法对之前的Region proposal的候选框做了分类,检测框的定位取决于Region proposal的精度,一般不太不准确。
在2015年的两篇论文中,先后对步骤C和步骤A进行了优化。
Fast R-CNN (2015,VOC2007 mAP=68.4),论文中针对上述问题,对步骤B和C进行了优化。针对步骤B,这里利用了数据共享,不再是把每一个Region proposal分别送进同一个CNN网络,而是先对整幅图像送入CNN网络提取feature map,随后,把该Region proposal区域投影到feature map,并把提取的feature map的RoI区域送入RoI pooling layer获得到固定尺度的feature map (在2017,Mask R-CNN中改为ROIAlign去除RoI pooling过程中带来的两次量化误差,以获得更准备的预测框位置);针对步骤C,使用网络的方法代替传统的机器学习,使得网络可以端到端地进行训练,使用Fully connected layers,并在softmax分类的基础上增加了bbox regressor头,使得检测框的定位更加准确。
图片引自Fast R-CNN
该方法中,Region proposal还是使用传统机器学习方法。
Faster R-CNN (2015, Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,VOC2007 mAP=70.4)中,针对步骤A进行了优化,直接使用CNN网络获得Region proposal,进一步做到Region proposal与提取特征共享计算。即在CNN输出的feature maps基础上加了一个RPN(Region Proposal Network)的头,随后,使用输出的Region proposal进行和上面Fast R-CNN类似的RoI pooling + Classifer(包括softmax分类和bbox regressor)。
图片引自Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
其中,RPN网络的结构如下图所示,使用的sliding window是固定尺寸的3x3的feature送入Intermediate layer,reg layer中通过k个不同regressor来来保证分别优化回归k个anchor box。head的参数包括是否包含物体的二分类(2k个参数:属于物体,不属于物体的两分类softmax层;若使用logistic regression则可变为k个参数)和anchor bbox的参数回归获得Region proposals(4k个参数:box中心点的坐标和长宽(x,y,w, h))。RPN网络中正式提出了使用anchor boxes,anchor boxes是指在每一个3x3的window的feature中回归k个不同尺度和纵横比的boxex的参数(这里在每一个3x3的window中都使用了Anchor boxex,实质是滑移窗口的卷积实现,充分利用GPU的并行计算,并不是依次地进行滑移window)。在原论文中,作者使用了面积为128^2,256^2,512^2三种面积和1:1,2:1, 1:2三种比例分别配对,共9中anchor boxes(即k=9)。
图片引自Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
anchor box有两个作用:
第一,定义正负样本,即建立与标注的目标框真值的关系。
为了让Region Proposal这部分头输出propose的目标框,需要要确定标注的目标框真值与待预测量的对应关系,论文中,是通过anchor box建立和标注目标框真值的关系的,即把标注真值目标框与anchor box进行对应关联。具体实现是把所有与标注真值框有最高IoU的Anchor box以及与标注真值的IoU>0.7的Anchor box都作为positive label, 因此,一个标注真值框可能给多个Anchor box分配positive label。
“For training RPNs, we assign a binary class label (of being an object or not) to each anchor. We assign a positive label to two kinds of anchors: (i) the anchor/anchors with the highest Intersection-overUnion (IoU) overlap with a ground-truth box, or (ii) an anchor that has an IoU overlap higher than 0.7 with any ground-truth box. Note that a single ground-truth box may assign positive labels to multiple anchors. Usually the second condition is sufficient to determine the positive samples; but we still adopt the first condition for the reason that in some rare cases the second condition may find no positive sample. We assign a negative label to a non-positive anchor if its IoU ratio is lower than 0.3 for all ground-truth boxes. Anchors that are neither positive nor negative do not contribute to the training objective”
Anchor与标注真值框之间进行match的代码在Detectron2/detectron2/modeling/matcher.py中的实现如下:
class Matcher(object): """ This class assigns to each predicted "element" (e.g., a box)