目标定位
目标检测是计算机视觉中一个热门的应用领域,实现目标检测首先需要实现目标的定位问题。通常一张图片有多个目标,实现目标定位,有助于目标检测,如下例子所示:
对于目标定位问题,首先约定一组符号:
(0,0)表示的是选中方框左上角的坐标,(1,1)表示的右下角坐标。
表示的是红框的中心位置。
分别表示的是边界框的高度和宽度所占的格子的比例。
因此,有监督学习的神经网络不仅包含了神经万络过要预测的对象分类标签,而且还包含了边界框的信息。对应的输出标签则如下所示:
输出标签中的表示的是图片中有车,对于多目标(假设为3)的定位问题,可以用表示,若为1则表示检测到是的是第二个目标。
对于以上示例,如果采用的是平方误差,则损失函数如下所示:
特征点检测
神经网络可以通过对输出图片上的特征点的坐标定位来实现对目标特征的识别,在此情况下,特征点的个数会更多,可以根据自己的需要设定特征点的个数,以人脸检测为例,利用神经网络实现特征点检测的方法如下所示:
- 利用神经网络和一些特征集,将人脸图片输入到卷积网络,输出为0表示没有人脸,否则表示有人脸。
- 假定选定了64个特征点,则通过神经网络输出特征点,用表示一个特征,包含表示是否有人脸的特征,则一共有129个输出单元。
目标检测
目标检测算法中,一种常用的算法是基于滑动窗口的目标检测算法,以一个汽车检测的应用为例,算法是实现步骤如下所示:
- 选定一个特定大小的窗口,将红色小方块选定的数据输入整个卷积神经网络。
-
红色方块按照行列的方式遍历整个图像,将选定的数据依次送入卷积神经网路。
总结以上步骤,即也就是以固定的步幅移动窗口,遍历图像的每个区域,将这些剪切后的图像输入卷积神经网络,并对每个位置进行0,1分类,判断图片中是否出现汽车,如下图所示:
滑动窗口的卷积实现
为了构建滑动窗口的卷积应用,首先需要将神经网络的全连接层转换为卷积层,具体实现如下所示:
以14×14×3的图像为例,通过卷积和池化操作后得到了一个5×5×16的数据,图像分类的操作是接着添加一个连接2个400个单元的全连接层,最后通过softmax函数输出每个类别输出的概率。
将全连接层转换为卷积层时,经过卷积和池化操作后,输入图像的大小是5×5×16,继续用400个5×5的卷积进行卷积操作,输出结果为1×1×400,继续添加一个1×1×1400的卷积层,最后经由1×1的过滤器处理,得到一个softmax激活值。通过卷积网络得到一个1×1×4的输出层。
对输入图片进行滑动卷积操作时,如果每次选定一块输入图像送入卷积神经网络中时,卷积操作中的很多计算是重复的,如下图所示,以步幅为2,对16×16×3的图像,执行卷积操作,每次选定的区域大小是14×14×3,经过卷积和池化操作后,会得到一个2×2×4的输出层,而不是1×1×4,最终,这个2×2×4的输出层中,每个1×1×4的输出代表所选定区域的输出。
在实际运算中,不需要将整个图像分割为四个子集,分别执行前向传播,而是将整个图像输入卷积网络进行计算,公共区域可以共享很多计算。如下所示,对28×28×3的图片应用滑动窗口卷积,以14×14区域滑动窗口,接着以大小为2的步幅不断移动窗口,最终得到一个8×8×4的输出。对大小为28×28×3的图像应用卷积操作,一次得到所有预测值,如果足够幸运,神经网络就可以识别出汽车的位置。
Bounding Box预测
滑动卷积窗口的实现效率很高,但是不能输出最精准的边界框,对于边界框的预测,常用的方法是YOLO算法,即YOU ONLY LOOK ONCE算法,为了方便起见,将一副图像分割为3×3的网格形式,如下图所示:
使用图像分类和定位算法,将这个算法应用到9个网格中,每个格子指定一个标签y,这个标签y是8维的,其说粗话如下所示:
对于3×3的网格,最后输出的是3×3×8,实现边界预测时,需要做的就是输入图像作为,经过卷积神经网络的卷积层,池化层,映射得到一个3×3×8的输出尺寸。即也就是,有一个输入图像,得到3×3×8的目标标签.
即使检测目标覆盖多个格子的区域,在训练中,也只会分配到9个格子中的一个。在算法的实际实现中,输入图像的划分更为精细,如19×19形式的划分,更为精细的划分保证了多个检测目标处于同一个格子的概率会更低。
交并比
交并比函数是计算两个边界框的交集和并集之比,用来评估目标检测任务,对于如下图像,交并比函数的计算可以用如下公式表示,
一般约定,在计算机检测任务中,如果,说明哦检测正确,如果预测器和实际边界完美重叠,则,即也就是交并比越高,边界框越精确。
非极大值抑制
目标检测算法的运行过程可能会对同一目标做出多次检测,而非极大值抑制可以确保算法对每个目标值检测一次。
当运行目标分类和检测算法时,对每个格子都运行一次,目标所覆盖的区域的格子都能检测到目标,每次的检测结果都能出现一个与结果相关的概率,非极大值抑制算法会依次比较剩下的矩形,所有和这个最大概率的边框有很高的交并比边框的输出会被抑制。算法的实现细节如下所示:
如上图所述,就是实现非极大值抑制算法的基本流程图,如果有多个目标需要检测或者定位,需要独立进行多次非极大值抑制算法,也就是对每个输出类别都做一次该算法。
Anchor boxes
如果希望通过一个格子检测出多个目标,需要用到anchor boexes的概念。如下图所示,如果一个3×3的图像,行人和车的中点几乎在同一个位置,可能会无法利用向量输出检测结果。
而利用anchor boxes的算法可以解决上述问题,算法的基本思路如下所述:
预先定义两个不同形状的anchor box,定义的输出标签不再是
而是两个anchor box的输出拼接到一起的矩阵,如下所示:
其中,该向量的前8个元素代表第一个anchor box的输出标签,后8个元素代表第二个anchor box输出的标签。整个算法的实现思路就是训练图像的每个目标被分配到目标中点所在的格子中,并分配到和目标形状交并比最高的anchor box中。具体而言就是,在这种情况下,目标不是被分配到了一个格子中,而是一对格子中,此时输出的标签是3×3×16(或者是3×3×3×2),包含了两个目标的信息。