机器学习中物体检测和定位算法的进化
最先进的目标检测软件系统之一刚刚由Facebook AI团队发布。该软件被称为Detectron,该软件包含众多用于目标检测的研究项目,并由Caffe2深度学习框架提供支持。
今天,有很多用于物体检测的预训练模型(YOLO,RCNN,Fast RCNN,Mask RCNN,Multibox等)。因此,只需花费很少的精力来检测视频或图像中的大部分对象。
关于CNN简介
CNN是深度学习时代大部分计算机视觉任务的基本构建模块。
我们想要什么?我们需要一些查看图像的算法,查看图像中的图案并告诉图像中存在哪些类型的对象。例如,是猫还是狗的形象?
什么是电脑图像?只是矩阵的数字。例如参见上面的图1。左边的图像是手写数字2(取自MNIST数据)的28 * 28像素图像,在Excel电子表格中以数字矩阵表示。
我们如何教计算机学习识别图像中的物体?通过让计算机学习模式,如垂直边缘,水平边缘,圆形以及其他很多人类未知的模式。
计算机如何学习模式?卷积!
为什么卷积工作?因为在大多数图像中,物体在相对像素密度(数量的大小)方面具有一致性,可以通过卷积来利用。
计算机视觉任务分类
以图2中的猫和狗图像为例,以下是计算机视觉建模算法最常见的任务:
图像分类:这是最常见的计算机视觉问题,其中算法查看图像并对其中的对象进行分类。图像分类具有广泛的应用范围,从社交网络上的人脸检测到医学中的癌症检测。这些问题通常使用卷积神经网络(CNN)建模。
对象分类和本地化:假设我们不仅想知道图像中是否有猫,但是猫的确切位置。对象定位算法不仅可以标记对象的类别,还可以在图像中围绕对象的位置绘制边界框。
多个物体检测和定位:如果图像中有多个物体(如上图中的3只狗和2只猫),我们想要检测它们全部?这将是一个对象检测和本地化问题。一个众所周知的应用是在自动驾驶汽车中,该算法不仅需要检测汽车,还需要检测车架中的行人,摩托车,树木和其他物体。这些问题需要利用从图像分类和对象本地化中学到的想法或概念。
1.图像分类
图2中的信息图显示了典型的图像分类CNN的样子。
1.用n个滤波器(图3中的n = 4)卷积输入图像的某些高度,宽度和通道深度(在上述情况下为940,550,3)[如果您仍然困惑于卷积意味着什么,请检查这个链接了解深度神经网络中的卷积]。
2.卷积输出用非线性变换处理,通常是Max Pool和RELU。
3.卷积,最大池和RELU的上述3个操作多次执行。
4.最后一层的输出发送到Softmax层,该层将0和1之间的数字进行转换,从而给出图像具有特定类别的概率。我们最大限度地减少损失,从而使最后一层的预测接近实际值。
2.对象分类和本地化
现在,为了让我们的模型绘制对象的边界框,我们只需更改前一算法的输出标签,以便使我们的模型能够学习对象的类别以及对象在图像中的位置。我们在输出层增加4个数字,包括对象的质心位置和边界框在图像中的宽度和高度的比例。
只需添加一堆输出单元来吐出您想识别的不同位置的x,y坐标。这些不同的位置或地标对于我们所有图像中的特定对象都是一致的。例如,对于汽车来说,与图像中的其他点相比,高度将小于宽度并且质心将具有一些特定的像素密度。
3.多个对象检测和本地化
为了检测图像中的各种对象,我们可以直接使用我们从对象本地化中学到的东西。区别在于我们希望我们的算法能够对图像中的所有对象进行分类和本地化,而不仅仅是一个。所以这个想法是,将图像裁剪成多个图像并运行CNN,以便检测所有裁剪后的图像以检测对象。
算法的工作方式如下:
1.制作比实际图像尺寸小得多的窗口。裁剪并将其传递给ConvNet(CNN)并让ConvNet进行预测。
2.继续滑动窗口并将裁剪后的图像传递给ConvNet。
3.使用此窗口大小裁剪图像的所有部分后,再次重复所有步骤以获得更大的窗口大小。再次将裁剪后的图像传递给ConvNet并让它做出预测。
4.最后,您将拥有一组裁剪区域,其中会包含一些对象以及对象的类和边界框。
这种解决方案被称为带滑动窗口的物体检测。这是非常基本的解决方案,它有以下许多警告:
A.计算昂贵:裁剪多个图像并通过ConvNet传递将会在计算上非常昂贵。
解决方案:提高滑动窗口方法的计算能力有一个简单的方法。它将ConvNet中完全连接的图层替换为1x1卷积图层,并且对于给定的窗口大小,仅将输入图像传递一次。因此,在实际的实现中,我们不会一次传递一张裁剪后的图像,但我们会立即传递完整的图像。
B.不准确的边界框:我们在整个图像上滑动方形窗口,也许这个对象是矩形的,也可能没有任何一个正方形与对象的实际大小完全匹配。尽管该算法能够查找和定位图像中的多个对象,但边界框的准确性仍然很差。
更好的解决方案 YOLO
事实证明,YOLO比滑动窗口算法更精确和更快。它只基于我们已经知道的算法的一小部分调整。这个想法是将图像分成多个网格。然后,我们更改数据的标签,以便为每个网格单元实施定位和分类算法。让我再向你解释一下这个信息图。
YOLO简单步骤:
1.将图像分成多个网格。为了说明,我在上图中绘制了4x4网格,但YOLO的实际实现具有不同的网格数。(7x7用于在PASCAL VOC数据集上培训YOLO)
2.如上图所示标记训练数据。如果C是我们数据中唯一对象的数量,S * S是我们将图像分割成的网格的数量,那么我们的输出向量将是长度S * S *(C + 5)。例如在上述情况下,我们的目标向量是4 * 4 *(3 + 5),因为我们将图像分成4 * 4个网格,并且训练3个独特的对象:汽车,轻型和行人。
3.将一个具有损失函数的深度卷积神经网络作为输出激活与标签向量之间的误差。基本上,该模型通过ConvNet在输入图像的一个正向传递中预测所有网格的输出。
4.请记住,网格单元(P.Object)中存在的对象标签由网格中对象质心的存在决定。这对于不允许一个对象在不同网格中被多次计数是很重要的。
YOLO的注意事项及其解决方案:
A.无法检测同一网格中的多个对象。这个问题可以通过选择较小的网格大小来解决。但即使通过选择较小的网格大小,在物体彼此非常接近的情况下,如鸟群的图像,该算法仍可能失败。
解决方案:锚箱。除了每个网格单元具有5 + C标签(其中C是不同对象的数目)之外,锚箱的想法是每个网格单元具有(5 + C)* A标签,其中A是需要的锚箱。如果将一个对象分配给一个网格中的一个锚点框,则可以将其他对象分配给同一网格的另一个锚点框。
B.多次检测一个物体的可能性。
解决方案: 非最大抑制。非最大抑制移除了非常接近高概率边界框的低概率边界框。