CNN:目标检测算法

一、概述Object Detection

支持一张图片中有多个目标,并给出每个目标的位置。

二、算法

1. 滑移窗口+classification

滑移窗口+classification算法是最直观的算法,在图片内选择窗口,假设是一个窗口内只有一个object的假设,从而将窗口内的问题转化为Classification问题。滑移窗口相当于暴力搜索法,在空间滑移窗口以覆盖不同空间位置,同时,还需要选择不同尺度的窗口以覆盖不同尺度的目标。

缺点:

  • 计算量大,且涉及很多冗余计算;
  • 选择的窗口的位置肯定不能保证准确贴合目标位置的,但是也不适合使用滑移窗口+Classification and localization的方法,一方面由于目标有可能不是全部落在窗口中的,另一方面,增加回归bounding box的4个参数会使得计算量更大。

备注:

  • Classification:适用于一张图片中只有一个目标,以三分类为例 y = [ c1, c2, c3],直接使用softmax即可;
  • Classification and localization:是指在softmax给出分类结果的同时,同时期望给出目标的位置,需添加bounding box的4个参数(bx, by, w, h), 让网络回归出目标的具体位置,y=[Pr, bx, by, w, h, c1, c2, c3]。

2. 候选框+classification(R-CNN) 

先利用传统算法或CNN网络给出候选框,再在候选框上运行classification。

3. 滑移窗口的卷积实现(one-stage detector)

3.1 YOLO

在卷积层尺寸为S*S的feature map上的每一个cell上回归一个或多个bounding box。与feature map的尺寸S*S对应,可以将原图划分成S*S的grid cell,以建立标注真值与预测值的对应关系,从而建立loss function。

                                                                  图1. 原图bounding box与feature map中tensor对应关系

先以在S*S的feature map上的每一个cell上每个cell回归一个bounding box为例。设计CNN网络最后一层的feature map为S*S*length[ y' ]的tensor,每个feature map中的小cell的结果为y'=[Pr, bx, by, w, h, c1, c2, c3]。将原图中的bounding box真值y=[Pr, bx, by, w, h, c1, c2, c3]关联到bounding box中心点所在的grid cell空间位置对应的feature map中的cell的预测值y'=[Pr, bx, by, w, h, c1, c2, c3],如图1所示。其中,(bx,by)为bounding box的中心点在原图grid cell中的相对位置(偏移量offset),(w,h)是相对于整幅图像的长宽(图像归一化后,w和h都在0~1之间),bounding box的长和宽可以超过grid cell大小(因为卷积的时候也通过卷积核建立了不同grid cell的联系)。

  • 标注:每个真实目标仅标注了一个框;
  • 训练:训练loss时将目标框分配给其中心点落在的grid cell中;
  • 推理:每一个grid cell都会propose一个bounding box,当一个目标覆盖多个grid cell时,会被多个grid cell都propose出;最后,对于IOU超过一定阈值的候选框通过NMS进行过滤,仅保留可能性最大的。

看CNN把一个任务formulate成什么问题主要看loss function是怎么设计的。YOLO中将每个feature map中的小cell的预测值与各自空间几何上对应位置上原图的大grid cell上负责的bounding box真值做比较计算loss, 而原图大grid cell负责的bounding box是指bounding box的中心点落在该grid cell中的bounding box,将原图划分为S*S个grid cell正是为了建立这种对应关系。

注意:不要误解成原图中的大grid cell进行卷积直接缩小到了feature map中的小cell (这是看YOLO论文时直观上看示意图最容易造成误解的地方)。最后一层的feature map也是S*S*length[y]的tensor,每个feature map中的小cell的结果y=[Pr, bx, by, w, h, c1, c2, c3]分别关联原图中大grid cell中propose的bounding box,事实上,feature map中的小grid cell对应的感受野是整幅原图(网络中使用了全连接层或全连接层的卷积实现),因此,每个grid cell预测出来的bounding box的(w,h)才能超过原图中grid cell的尺寸。至于原图中划分的S*S的大grid cell和feature map中的S*S个向量之间的对应关系,即每个feature map中的向量y = [Pr, bx, by, w, h, c1, c2, c3]与原图中大grid cell一一对应的关系,是通过网络求loss时建立的关联。也就是说,把原图标注的bounding box所对应的参数y=[Pr, bx, by, w, h, c1, c2, c3]与该bounding box的中心点所落在的大grid cell的空间位置相对应的的feature map中小grid cell的上的向量 y^ = [Pr, bx, by, w, h, c1, c2, c3]求loss.换而言之,如果做loss时保持让feature map中的左上的grid cell的bounding box向量对应原图中右下角的grid cell标注的bounding box,那么在推理时也是能给出正确的预测结果的,只需要保持原图分割的大grid cell与feature map中的小grid cell对应关系始终一致即可。

以上方法另每个feature map的cell中预测了一组y=[Pr, bx, by, w, h, c1, c2, c3]与原图大grid cell中所负责的bounding box对应。但如果多个bounding box的中心点落在一个大grid cell中,设计loss function时应该让feature map中cell的这组参数[Pr, bx, by, w, h, c1, c2, c3]与哪个bounding box真值对应呐?为了解决多个目标框的中心点可能落在原图中一个grid cell中的问题,直观的解决方案是可以在每个feature map的小cell中回归多个bounding box参数。

以两个目标框为例讲解在cell中propose多个bounding box的方法:y = [ Pr1, bx1, bx2, w1, h1, c11, c12, c13, Pr2, bx2, by2, w2, h2, c21,c22, c23]),这样就可以覆盖两个目标框中心点落在一个原图大grid cell中的情况。为了覆盖更复杂的重叠情况可以在每个feature map中覆盖更多组bounding box参数,方法与两个bounding box的方法相同。为了区分将一个grid cell内的bounding box分配给第一组参数[Pr1, bx1, bx2, w1, h1, c11, c12, c13]还是第二组参数[Pr2, bx2, by2, w2, h2, c21,c22, c23],引入Anchor box的概念, 每个anchor box的比例不同,将bounding box的ground truth与Anchor box求IoU,分配给IoU较大的。Anchor box实质就是在选择分配bounding box真值与y中具体的第几组参数求loss时引入一个固定的顺序,保证每组参数更适合预测特定比例的bouding box。

  • 标注:每个真实目标仅标注了一个框;
  • 训练:训练loss时将目标框分配给其中心点落在的grid cell中,并且IoU与ground truth最近的Anchor box;
  • 推理:每一个grid cell都会propose多个bounding box,当一个目标覆盖多个grid cell时,会被多个grid cell都propose出;最后,对于IoU超过一定阈值的候选框通过NMS进行过滤,仅保留可能性最大的。

注意:Anchor box不是bounding box, anchor box只是对多目标的排序,bounding box才是最终给出的目标框。不要误解成预测的bounding box就是从Anchor box中选了一个最合适的。事实上,最终预测出来的bounding box大小和形状是与设定的anchor box一般都是不相同的,只是由于回归时我们根据anchor box的比例选择将bounding box分配在对应的一组参数上做回归,会使得bounding box的比例与对应的anchor box的比例类似,但也绝对不是1:1的比例,最终bounding box的大小和位置都是回归出来的变量。

YOLO缺点:bounding box的框(中心点以及长宽)不够精确。其背后的原因有两点:

  • a. 在YOLO中使用最后一层feature map负责预测所有尺度的目标,这可能使得预测效果不好,训练也不易收敛;
  • b. YOLO中只让一个feature map中的cell对应bounding box的真值(即bounding box中心点对应的cell),然而,实际上一个bounding box可能跨越很多cell,这些cell和bounding box的标注真值也是关联的,但YOLO中忽略了这些关联,可能也会造成训练不易收敛、预测效果不好。

3.2 SSD

为解决上述YOLO的两个问题,SSD提出如下方法:

  • a. 一方面引入多尺度的概念,在不同尺度的多个feature map中预测bounding box,这样训练出的模型会让不同尺度的feature map更适合准确预测出相应尺度的bounding box;(每一层feature map预测的向量直接与对应的原图划分的grid cell对应的bounding box的真值建立对应关系)
  • b. 另一方面,不再让bounding box真值仅关联其中心点对应的feature map中的cell,凡是anchor box与bounding box标注真值之间的jaccard overlap>0.5的anchor box都参与标注真值求loss。

采用以上两个措施使得训练更易收敛,预测bounding box的结果更加准确。


4. Anchor free method

4.1 FCOS

YOLO中每个标注真值bounding box仅分配给其中心点对应的feature map的cell中;SSD根据anchor box和标注真值bounding box的overlap设定阈值,让overlap大于阈值的anchor box都与bounding box对应计算loss。以上两种将anchor box与标注真值bounding box建立对应关系的方法都忽略了很多与标注真值bounding box关联的候选框,使得训练也不易收敛或预测效果不好。为了解决以上问题,FCOS让feature map的每个cell预测[l', t', r', b'],即到标注真值bounding box的左、上、右、下的距离,将feature map中的cell映射到原图,直接确认其真值[l, t, r, b]。这样feature map的cell中预测的bounding box时不再要求该cell在bounding box的中心点,从而保证所有关联的bounding box都参与到与标注真值bounding box合理计算loss。同时,由于去除了bounding box中心点与cell预测值之间的对应关系,所以也无需anchor box的概念。

Polarmask

4.2 Corner Net

令feature map中的每一个channel负责预测一个或一类点,直接利用heatmap找corner 。其核心思想来自于人姿态检测中的关键点检测:Convolutional pose machines中人体每个关键点在其中一个feature map的channel中预测,loss function是各个channel上误差的加和。

问题:既然feature map也可能是S*S的,最终预测的tensor也是S*S*length[ y' ],那么它和YOLO有什么区别?这源于设计loss function时是逐channel地设计对应关系的。

在标注真值处使用unnormalized 2D Gaussian作为真值,距离真值越远loss function越大。

针对目标检测的corner实际往往落在目标之外,因此,不能直接用局部特征确定corner的问题,创新地使用corner pooling,在corner pooling 后的层上寻找corner。

并且,针对每个corner预测一组embedding vector(embedding vector可以理解成以前的点和描述子),embedding vector相近的两个corner组成一个bounding box的两个角点。

4.3 CenterNet

基于CornerNet的改进:

猜你喜欢

转载自blog.csdn.net/Cxiazaiyu/article/details/108333954