刷脸支付、AI修图靠的是什么?本文帮你解答
点击上方关注,All in AI中国
作者——Alyson Brown
你有没有好奇过为什么刷脸就可以给手机解锁?或者与朋友自拍时,系统自动给你适配滤镜?你是否知道这些很酷的功能是通过一个奇妙的神经网络实现的,它不仅可以识别出照片中的人脸,还可以识别出一些具体特征(比如,耳朵,嘴巴等等)的位置。从某种意义上说,你的手机可以"看到"你,它甚至可以知道你的样子!
帮助计算机"看到"的技术被称为"computer vision"。近年来,由于计算能力的爆炸式增长,使得深度学习模型更好、更可行,计算机视觉应用正变得越来越普遍。亚马逊,谷歌,特斯拉,Facebook和微软等许多公司都在大力投资这项技术及其应用。
计算机视觉任务
我们专注于两个主要的计算机视觉任务 - 图像分类和对象检测。
1. 图像分类专注于将图像分组为预定义的类别。为了实现这一点,我们需要拥有我们感兴趣类的多个图像,并训练计算机将像素数转换为符号。
2. 对象检测利用图像分类器来确定图像中存在的内容和位置。通过使用卷积神经网络(CNN)使这些任务变得更容易,这使得在一次图像的传递中检测多个类成为可能。
计算机视觉很酷!
考虑到未来许多有趣的数据科学应用程序将涉及处理图像,我们新兴数据科学家团队和我决定尝试在Kaggle上举办的Google AI Open Image挑战(https://www.kaggle.com/c/google-ai-open-images-object-detection-track)。我们认为这是一个绝佳的机会,让我们来接触神经网络和卷积,并可能会给我们的教授和同学留下深刻的印象。这一挑战为我们提供了170万个图像,其中包含500个对象类的1200个边界框注释(它们相对于图像的X和Y坐标)。你可以在这里找到数据(https://www.figure-eight.com/dataset/open-images-annotated-with-bounding-boxes/)。
我们强烈建议任何想要阅读有关CNN的人阅读吴恩达关于卷积神经网络的Coursera课程(https://www.coursera.org/learn/convolutional-neural-networks/home/welcome)。
让我们实践!
探索性数据分析——与所有数据分析一样,我们开始探索我们拥有的图像以及我们需要检测的对象类型。
训练数据集中的类频率
快速浏览一下这些训练图像,会发现某些物体在出现的次数方面比其他物体更多。上图显示了前43个类的分布情况。很明显,存在着巨大的差异。我们需要解决这些问题。为了节省时间和金钱(GPU成本很高),我们选择了前面提到的43个对象类和带有这些对象的300K图像的子集。我们在训练数据中为每个对象类提供了大约400个图像。
选择目标检测算法
我们考虑了各种对象检测算法,包括VGG、Inception和YOLO,但最终选择了YOLO算法,因为它的速度、计算能力和丰富的在线文章可以指导我们完成整个过程。面对计算和时间限制,我们做出了两个关键决定:
1. 使用经过训练识别某些物体的YOLO v2模型。
2. 利用迁移学习训练最后一个卷积层,以识别以前不可见的物体,如吉他、房子、男人/女人、鸟等。
YOLO的输入
YOLO算法需要一些特定的输入:
1. 输入图像大小——YOLO网络设计用于处理特定的输入图像大小。我们发送了大小为608 * 608的图像。
2. 类的数量——43。这是定义YOLO输出的维度所必需的。
3. Anchor box——要使用的锚框的数量和尺寸。
4. Confidence和IoU thresholds——用于定义选择哪些锚框以及如何在锚框之间进行选择的阈值。
5. 带有边界框信息的图像名称——对于每个图像,我们需要以特定格式为YOLO提供其中的内容,如下所示
YOLO的示例输入
以下是YOLO输入的代码段:
YOLO v2架构
该体系架构如下所示——它有23个卷积层,每个卷层都有自己的批量标准化、Leaky RELU激活和最大池化。
代表实际的YOLO v2架构
这些层试图从图像中提取多个重要特征,以便可以检测各种类。出于对象检测的目的,YOLO算法将输入图像划分为19 * 19网格,每个网格具有5个不同的锚框。然后,它尝试检测每个网格单元中的类,并将对象分配给每个网格单元的5个锚框之一。锚框的形状不同,旨在为每个网格单元捕获不同形状的对象。
YOLO算法为每个定义的锚框输出一个矩阵(如下所示)
鉴于我们必须训练43个类的算法,我们得到的输出尺寸为:
这些矩阵为我们提供了观察每个锚框的对象的概率,以及该对象的类的概率。要过滤掉没有任何类或与其他框相同的对象的锚框,我们使用两个阈值,IoU阈值来过滤掉捕获相同对象的锚框和置信度阈值,以过滤掉不包含锚框的任何一个类。
下面是YOLO v2架构最后几层的说明:
迁移学习
迁移学习的概念是获得一个神经网络,该神经网络已经经过训练来对图像进行分类并将其用于我们的特定目的。这节省了我们的计算时间,因为我们不需要训练大量的权重——例如,我们使用的YOLO v2模型有大约5000万个权重——训练可能需要4-5天的时间。
为了成功实现迁移学习,我们不得不对我们的模型进行一些更新:
· 输入图像大小——我们下载的模型使用大小为416 * 416的输入图像。由于我们训练的一些物体非常小,我们不想那么大地压缩输入图像。出于这个原因,我们使用了大小为608 * 608的输入图像。
· 网格大小——我们更改了网格大小的尺寸,以便将图像划分为19 * 19网格单元而不是13 * 13,这是我们下载的模型的默认值。
· 输出层——由于我们在不同数量的类43上进行训练,而不是在原始模型的类80上进行训练,因此输出层被更改为输出矩阵维度,如前所述。
我们重新初始化了YOLO最后一个卷积层的权重,以便在我们的数据集上训练它,最终帮助我们识别出独特的类。以下是相同的代码片段:
重新初始化YOLO的最后一个卷积层
成本函数
在任何对象检测问题中,我们希望在图像中具有高置信度的正确位置识别正确的对象。成本函数有三个主要组成部分(https://arxiv.org/pdf/1506.02640.pdf):
1. 分类损失:如果检测到对象,则为类条件概率的平方误差。因此,只有当网格单元中存在对象时,损失函数才会惩罚分类错误。
2. 定位损失:如果真值框负责检测对象,则是预测边界框位置和大小与地面实况框的平方误差。为了惩罚边界框坐标预测的损失,我们使用正则化参数(ƛcoord)。此外,为了确保较大框中的小偏差小于较小框中的小偏差,算法使用边界框宽度和高度的平方根。
3. 置信度损失:它是边界框置信度得分的平方误差。大多数锚盒不负责检测物体,因此方程式分为两部分,一部分用于检测物体的锚盒,另一部分用于其它锚盒。将正则化项λnoobj(默认值:0.5)应用于后一部分以权衡未检测到对象的框。
请随时参考原始的YOlO(https://arxiv.org/pdf/1506.02640.pdf),了解成本函数的详细信息。
YOLO的优点在于它使用易于使用优化函数进行优化的误差,例如随机梯度下降(SGD),带动量的SGD或Adam等。下面的代码片段显示了我们用于优化成本函数的参数。
YOLO训练算法(Adam optimizer)
输出精度——平均精确度(mAP分数):
在对象检测中评估模型有许多度量标准,对于我们的项目,我们决定使用mAP分数,它是不同召回值在所有IoU阈值上最大精度的平均值。为了理解mAP,我们将快速回顾精度,召回和IoU(交叉结合)。
精确和召回
精确度衡量正确预测的百分比。召回是所有可能结果中真阳性的比例。这两个值是反向相关的,也取决于你为模型设置的模型得分阈值(在我们的例子中,它是置信度得分)。数学定义如下:
交叉口联合(IoU)
IoU测量两个区域之间有多少重叠,也就是联合区域上的重叠面积。这可以衡量你的预测(来自你的物体探测器)与地面实况(真实物体边界)的对比情况。总而言之,mAP分数是所有IoU阈值的平均AP。
结果
结论
对象检测不同于其他计算机视觉任务。你可以使用预先训练的模型并根据需要进行编辑以满足你的需求。你将需要GCP或其他允许更高计算能力的平台。
经验教训
最初,我们发现该模型无法预测许多类,因为其中很多类只有少量的训练图像,这导致了数据集训练不平衡。因此,我们决定只使用最受欢迎的43个类,这不是一个完美的方法,但每个类至少有500个图像。然而,我们预测的置信度仍然很低。为了解决这个问题,我们选择了包含目标类的图像。
对象检测是一个非常具有挑战性的主题,但不要害怕,尝试尽可能多地从各种开源来学习,如Coursera,YouTube教学视频,GitHub和Medium。所有这些免费的智慧可以帮助你在这个神奇的领域取得成功!