目标定位
顾名思义,就是判断object在图片中的位置,假设要定位的对象有行人、汽车、摩托车三种,吴恩达老师给出的做法是将图片输入CNNs,输出8维的值,分别是(表示存在对象的概率)、
、
、
(分别是三种对象的概率)以及
、
、
和
(边框的中点坐标、宽和高)。例如y= [
,
,
,
,
,
,
,
]。
在损失函数方面,可以如下设置,当的真实标签值为1时,
。若
的真实标签为0时,
。通常的做法是对边界框坐标应用平方误差或类似的方法,对
应用逻辑回归函数,
、
、
采用softmax函数应用对数损失函数。
特征点检测
原理上和目标定位类似,只不过网络输出的是多个坐标,如64个点描述面部的轮廓或者眼部的轮廓,用32个点描述人体的行为骨架。
目标检测
滑动窗口目标检测:采用基于滑动窗口的目标检测算法。这样的话,不论汽车在图片的什么位置,总有一个窗口可以检测到它。但这种算法有一个明显的缺点就是计算成本。因为从图片中剪切出的小方框,卷积网络要一个个地处理,若选用比较大的步幅stride,显然会减少输入卷积网络的窗口个数,但是粗粒度会影响性能。
人们通常采用更简单的分类器进行对象检测,如线性分类器,计算成本都很低,所以滑动窗口目标检测算法表现良好,然而若使用卷积网络在单个分类任务中成本高得多,像这样滑动窗口速度太慢。
这类方法除非采用超细粒度或极小步幅,否则无法准确定位图片中的对象。
卷积的滑动窗口
把全连接层换成卷积操作后,我们不需把输入图片分割成若干个子集分别执行向前传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享很多计算。
这个算法还有一个缺点就是边界框的位置可能不够准确。
边界框预测
输入图像,然后经过若干卷积层、池化层等,最后会映射到一个3x3x8的输出尺寸。表示将图片分成3x3个格子,每个格子负责预测一个边框,故就有3x3x8的输出尺寸。若对象的中心位于某个格子中,则这个格子的pc真实标签就为1,这个格子就负责预测这个对象的边框。
优点是神经网络可以输出精确的边界框,可以通过输出y读出哪个边框有对象、对象类别和边框位置,只要每个格子的对象不超过1个。实际上你可能会使用更精细的19x19网格,所以就是19x19x8,这样的网格精细得多,那么多个对象分配到同一个格子的概率就小得多。
即使对象可以横跨多个格子,只把对象分配到其中心对应的格子中,也就只会是多个格子中的一个。
它显示地输出边界框坐标,可以具有任意宽高比,并且能输出更精确地坐标,不会受到滑动窗法分类器步长大小的限制。这是单次卷积的实现,并没有分成19x19次输入。实际上它的运行速度非常快,可以达到实时识别。
预测的坐标bx,by是相对于这个格子来说的,故其大小都会小于1,而bh,bw是相对于单个格子的长和宽来说的,可以大于1。
Intersection over union(IOU)
其定义就是边个边界框交集和并集之比。一般约定IOU>0.5则检测正确。但若是要求更严格,你可以将IOU定得更高,这是衡量定位精确的一种方式。
人们定义IOU这个概念是为了评价你的对象定位算法是否精准,但一般地说,IOU衡量了两个边界框重叠的相对大小。
Non-max suppression(非极大值抑制)
这个方法可以确保你的算法对每个对象只检测一次。当你跑一个算法时,最后可能会对同一个对象做出多次检测,所以非最大值抑制做的就是清理这些检测结果,而不是每辆车都触发多次检测。
要实现非最大值抑制,可以做的第一件事就是去掉所有pc小于或等于某个阈值的边框。取具有最大值pc的边框输出作为预测,删除那些和上一步输出IOU大于0.5的边框,迭代直至所有所有预测的边框完成检测。
如果你尝试同时检测三个对象,比如说行人,汽车、摩托。事实证明,正确的做法是独立地地进行三次非最大值抑制。
Anchor boxer
之前所说的算法都存在一个问题:每个格子只能检测出一个对象,如果想让一个格子检测出多个对象,就是要使用anchor box这个概念。
Anchor box的思路是预定义两个不同形状的anchor box,把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box,可能5个甚至更多。
每个物体在训练分配一个格子和IOU最高的一个anchor box。若格子中只有一个对象,则另外一个anchor box的pc为0,其余不关心。
如果有两个anchor boxes,但同一个格子中有三个对象,这种情况算法处理不好,对于这种情况,我们就引入一些tiebreaker来处理。
还有一种情况就是两个对象都在一个格子中,并且它们的anchor boxes形状也一样,这是算法处理不好的另一种情况,你需要引入一些tiebreaker专门处理这种情况。出现的情况不多,所有对性能的影响应该不会很大。
Anchor box能另你的算法更有针对性,特别是如果你的数据集中有一些很高很瘦的对象,如行人。
RCNN系列和YOLO系列
大多数RCNN系列算法的实现都是比YOLO算法慢很多,相比于先选出候选区域再分类的分两步走分两步走的RCNN系列算法,YOLO算法在长远而言是更有希望的方向。