1、目标定位(Object localization)
目标定位旨在识别图像或视频中的特定目标,并确定其在图像中的具体位置。目标定位的输出通常包括目标所属的类别(如果是分类任务)和一个边界框(Bounding Box),该边界框用于精确地描述目标在图像中的位置。因此先从分类和定位(classification with localization)开始讲起。
如上图,这是图片分类问题,输入一张图片到多层卷积神经网络。这就是卷积神经网络,它会输出一个特征向量,并反馈给softmax单元来预测图片类型。这就是标准的分类过程(classification pipeline),如果你还想定位图片中汽车的位置,可以让神经网络多输出几个单元,输出一个边界框。具体就是让神经网络再多输出4个数字,标记为b_x, b_y, b_h和b_w,这四个数字是被检测对象的边界框的参数化表示。
现在设定图片左上角的坐标为(0,0),右下角标记为(1,1)。要确定边界框的具体位置,需要指定红色方框的中心点(midpoint),这个点表示为(b_x,b_y),边界框的高度为b_h,宽度为b_h。
下面具体看如何为监督学习任务定义目标标签y,如下图:
这有四个分类,神经网络输出的是这四个数字和一个分类标签,或分类标签出现的概率。目标标签y的定义如下:
这是一个向量,第一个p_c表示是否含有对象,在这里如果对象属于前三类(行人(pedestrian)、汽车(car)、摩托车(motorcycle)),则p_c=1,如果是背景(background),则图片中没有要检测的对象,则p_c=0。我们可以认为它表示被检测对象属于某一类的概率,背景分类除外。如果检测到对象,输出被检测对象的边界框参数b_x,b_y,b_h和b_w,同时输出c_1、c_2和c_3,表示该对象属于1-3类中的哪一类(行人、汽车或者摩托车)。
最后看一下神经网络的损失函数(loss function)),参数为网络输出y帽和类别y,采用平方误差策略(squared error),则损失值等于每个元素相应差值的平方和,当y_1=1时,平方误差策略为这8个元素预测值和实际输出结果之间差值的平方。当y_1=0时,y中的后7个元素都不用考虑,只需要考虑神经网络评估yy_1(即p_c)的准确度。
注意一下,这里用平方误差简化了描述过程,实际应用中,通常做法是对边界框坐标应用平方差或类似方法,对p_c应用逻辑回归函数,甚至采用平方预测误差也是可以的。
2、特征点检测(Landmark detection)
神经网络也可以通过输出图片上特征点的(x,y)坐标来实现对目标特征的识别,下面看几个例子。
假设你正在构建一个人脸识别应用(face recognition application),你希望算法可以给出眼角(其他脸部部位也同样)的具体位置。眼角坐标为(x,y),让神经网络的最后一层多输出两个数字l_x和l_y,为眼角的坐标值。选定特征点个数,并生成包含这些特征点的标签训练集(label training set),然后利用神经网络输出脸部关键特征点的位置。
具体做法是,准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出1或0,1表示有人脸,0表示没有人脸,然后输出(l_1x,l_1y)......直到(l_64x,l_64y)。这里一共有129(1+2*64=129)个输出单元,由此实现对图片的人脸检测和定位。
再看一个例子,上图的第三张图,如果你对人体姿态检测(people post-detection)感兴趣,也可以定义一些关键特征点(key positions),如胸部的中点(the midpoint of the chest),左肩(the left shoulder),左肘(left elbow),腰(the wrist)等,从胸部中心点(l_1x,l_1y)一直向下,一直到(l_32x,l_32y)。然后通过神经网络标注人物姿态的关键特征点,再输出这些标注过的特征点,就相当于输出了人物的姿态动作。要明确一点,特征点的特性(identity)在所有图片中必须保持一致,就好比,特征点1始终是右眼的外眼角,特征点2是右眼的内眼角等等。
3、目标检测(Object detection)
学过了目标定位(object localization)和特征点检测(landmark detection),现在来构建一个目标检测算法。我们将学习如何通过卷积网络进行目标检测,采用的是基于滑动窗口的目标检测算法(the sliding windows detection algorithm)。
假如在构建一个汽车检测算法,(1)首先创建一个标签训练集,也就是x和y表示适当剪切的汽车图片样本,前三张图片是正样本,因为它们是汽车图片。(2)然后可以训练卷积网络,输入为这些适当裁剪过的图片,输出为y(0或1表示图片中有汽车或没有汽车)。(3)训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,具体步骤如下:
这种算法叫作滑动窗口目标检测(sliding windows detection),因为以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断里面有没有汽车。滑动窗口目标检测算法有很明显的缺点,就是计算成本。因为你在图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
4、滑动窗口的卷积实现(Convolutional implementation of sliding windows)
为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层。那么为什么要将全连接层转化成卷积层?有以下原因:
以下是神经网络的全连接层转化成卷积层的过程
总结一下滑动窗口的实现过程如下:
在原图上剪切出一块区域,假设它的大小是14×14,把它输入到卷积网络。继续输入下一块14×14区域,重复操作,直到某个区域识别到汽车。我们不能依靠连续的卷积操作来识别图片中的汽车,我们可以对大小为28×28的整张图片进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出汽车的位置。
以上就是在卷积层上应用滑动窗口算法的内容,它提高了整个算法的效率。不过这种算法仍然存在一个缺点(weakness),就是边界框的位置可能不够准确。
5、Bounding Box预测(Bounding box predictions)
在上一个视频中,我们了解了滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框。接下来看看如何得到更精准的边界框。
如上图,在滑动窗口法中,这些边界框没有一个能完美匹配汽车位置,也许右下角的蓝框是最匹配的啦。甚至最完美的框(右下角的红色框)不是正方形,而是长方形。
其中一个能得到更精准边界框的算法是YOLO算法,YOLO(You only look once)意思是你只看一次,把对象分配到一个格子的过程是,将这个对象分配到其中点所在的格子,所以即使对象可以横跨多个格子,也只会被分配到9个格子其中之一,就是3×3网络的其中一个格子,或者19×19网络的其中一个格子。在19×19网格中,两个对象的中点(图中蓝色点所示)处于同一个格子的概率就会更低。
需要注意的是:(1)这和图像分类和定位算法非常像,它显式地输出边界框坐标,能让神经网络输出边界框,可以具有任意宽高比,并且能输出更精确的坐标,不会受到滑动窗口分类器的步长大小限制。(2)这是一个卷积实现,你并没有在3×3网格上跑9次算法,相反,这是单次卷积实现,但你使用了一个卷积网络,有很多共享计算步骤,在处理这3×3计算中很多计算步骤是共享的,所以这个算法效率很高。事实上YOLO算法有一个好处,也是它受欢迎的原因,因为这是一个卷积实现,实际上它的运行速度非常快,可以达到实时(real-time)识别。
6、交并比(Intersection over union)
如何判断目标检测算法运作良好呢?在本视频中,你将了解到并交比(intersection over union)函数,可以用来评价目标检测算法。
交并比(loU)函数做的是计算两个边界框交集和并集之比。两个边界框的并集是这个区域,就是属于包含两个边界框区域(绿色阴影表示区域),而交集就是这个比较小的区域(橙色阴影表示区域),那么交并比就是交集的大小,这个橙色阴影面积,然后除以绿色阴影的并集面积。
一般来说,IoU大于等于0.5,那么结果是可以接受的,就说检测正确。如果预测器和实际边界框完美重叠,loU就是1,因为交集就等于并集。一般约定,0.5是阈值(threshold),用来判断预测的边界框是否正确。loU越高,边界框越精确。
7、非极大值抑制(Non-max suppression)
目前为止的目标检测中可能出现的问题是你的算法可能对同一个对象做出多次检测。非极大值抑制(non-max suppression)这个方法可以确保你的算法对每个对象只检测一次。
当你在所划分的格子上都运行一次图像检测和定位算法,最后可能会对同一个对象做出多次检测,所以非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次,而不是每辆车都触发多次检测。具体做法如下图:
首先看概率最大的那个,这个例子(右边车辆)中p_c是0.9,然后就说这是最可靠的检测(most confident detection),所以我们就用高亮标记,表明这里找到了一辆车。这么做之后,非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,那么这些输出就会被抑制。所以这两个矩形(p_c分别是0.6和0.7),和淡蓝色矩形重叠程度很高,所以会被抑制,变暗,表示它们被抑制了。
接下来,逐一审视剩下的矩形,找出概率最高,p_c最高的一个,在这种情况下是0.8,如上图,我们就认为这里检测出一辆车(左边车辆),然后非极大值抑制算法就会去掉其他loU值很高的矩形。非最大值意味着你只输出概率最大的分类结果,但抑制很接近,但不是最大的其他预测结果,所以这方法叫做非极大值抑制。
8、锚(Anchor Boxes)
到目前为止,目标检测中存在的一个问题是每个格子只能检测出一个对象,如果想检测出多个对象,可以使用anchor box这个概念。锚点框本质上是一些预定义的边界框模板,它们在模型预测过程中提供了一个初始参考框架,用来拟合图像中的目标物体。通过这些锚点框,目标检测模型可以处理同一图像中的多个物体,不同的尺度和长宽比。
对于这张图片,继续使用3×3网格,注意行人的中点和汽车的中点几乎在同一个地方,两者都落入到同一个格子中。在检测这三个类别(行人、汽车和摩托车)时,它将无法输出检测结果,所以必须从两个检测结果中选一个。
现在模型不仅仅根据物体的中心将其分配到某个网格单元,还会进一步通过锚点框的大小和形状来拟合物体的边界框(通过交并比选择)。这种组合(网格单元和锚点框)作为一个整体来对物体进行编码和预测,使得模型能够处理不同大小和形状的物体,更好地完成目标检测任务。最终的输出张量 y 包含多个信息:每个网格单元中的多个锚点框的预测结果。输出的维度取决于网格的大小、每个网格的锚点框数量,以及每个锚点框预测的类别和位置。
以上就是anchor box的概念,anchor box是为了处理两个对象出现在同一个格子的情况,实践中这种情况很少发生,特别是如果你用的是19×19网格而不是3×3的网格时。
最后,你应该怎么选择anchor box呢?人们一般手工指定anchor box形状,你可以选择5到10个anchor box形状,覆盖到多种不同的形状,可以涵盖你想要检测的对象的各种形状。后期YOLO论文中有更好的做法,就是所谓的k-平均算法(k-means),可以将两类对象形状聚类,如果我们用它来选择一组anchor box,选择最具有代表性的一组anchor box,可以代表你试图检测的十几个对象类别,但这其实是自动选择anchor box的高级方法。
标签:输出,边界,卷积,检测,神经网络,目标,算法 From: https://www.cnblogs.com/pgl6/p/18445393