作者。 Maxim Skorynin, Evil Martians的iOS工程师和Travis Turner, Evil Martians的技术编辑
物体检测是非常棒的,如今,它被用于许多不同的领域:面部检测、自动驾驶汽车,甚至是在足球比赛中跟踪球。令人高兴的是,对于iOS开发者来说,唯一的限制是我们的创造力,因为苹果的生态系统提供了伟大的本地工具,使我们能够实现物体检测。在本系列的第一部分中,我们将了解这些工具,并为从头开始建立一个完整的演示应用程序打下基础。继续阅读!
那么,究竟什么是物体检测?物体检测分析照片并识别这些照片中的有意义的物体。这几乎总是利用ML技术,而苹果为开发者提供了创建和训练模型的工具,使我们能够在我们的应用程序中使用ML。
我们将自己做这件事,因为我们创建和训练我们的模型,以便在一个演示的iOS应用程序中使用。这个应用程序将能够识别和标记照片中车牌的位置。然后,例如,如果我们有一个停在街上的汽车的视频,我们的应用程序将能够在该视频中的车牌周围画一个方框。在这一部分,我们收集原始数据,对其进行标记,并为创建模型准备我们的数据集。在第二部分,我们训练模型并建立我们的演示应用程序。
但是,在我们太过超前之前,首先要更好地了解苹果为开发者提供的ML能力,以及如何使用它们。接下来的两个部分提供了有价值的背景信息,但如果你已经了解了(或想以后再来),请随意跳过它们,潜心研究数据收集。
目录。
进入Core ML的核心
在WWDC 2017上,苹果展示了以 "神经引擎 "为核心的新A11仿生芯片,它还展示了Core ML框架--苹果所有ML工具的核心(哈)。
Core ML使直接在苹果设备上运行机器学习算法成为可能。它利用CPU、GPU和神经引擎核心优化了性能。计算几乎是即时进行的,更进一步,由于不需要连接到网络,我们能够保持用户数据的保密性。
从训练数据到应用实现的整个流程
该框架利用了计算机视觉(本文后面会有更多介绍!),自然语言用于文本处理,语音用于将音频转换为文本,声音分析用于识别音频中的声音。
Core ML本身是基于两个框架的。
我们的演示应用程序背后的基本框架
Create ML的简要介绍
接下来,让我们来看看Create ML,这是苹果公司用于创建和训练模型的本地工具。Create ML实际上允许我们在不使用代码的情况下训练我们的模型,它被包含在Xcode工具的一部分。有几个模型模板可用于处理不同的资源:图像、视频、声音、文本、动作、姿势和表格。
对于我们的演示,我们将使用物体检测模板
我们的演示应用程序:一个车牌检测器
介绍完这一点背景,让我们继续我们的演示项目,我们将尝试在进行过程中实现其中的一些功能。我们的最终目标是建立一个移动应用程序,检测视频中出现的车牌,然后在画面中突出显示它们。
为了实现这一目标,我们将通过几个阶段进行。
- 寻找和准备用于模型训练的数据
- 对数据进行注释并导出数据集
- 实际训练模型
- 建立一个自定义的相机应用程序
- 使用视觉框架整合模型
了解物体检测模型的要求
物体检测模型可以识别图像中一个或多个物体的位置和类别。在我们的案例中,我们希望算法结果能够返回:一个突出显示所识别物体的矩形区域、该物体的相应坐标、一个物体分类(标签)和一个准确率预测。
那么,我们如何才能真正训练这个模型呢?首先,我们需要一个合适的数据集。在我们的案例中,这应该是一组描述有可见车牌的汽车的图像。推荐的最小数据集大小为30,但这是相当小的,所以,对于我们的例子,我们将使用一组100张图片。
但在我们开始收集数据之前,让我们花点时间来介绍一下注释文件。
什么是注解文件?
为了创建和训练模型,我们需要一个注释文件--这将指定用于训练模型的数据。这些通常可以被格式化为JSON、XML或CSV文件。
在这种情况下,Create ML需要一个格式为JSON文件的注释文件来创建一个物体检测模型。这需要以下结构。
[ { "image": "image1.jpg", "annotations": [ { "label": "car-license-plate", "coordinates": { "x": 160, "y": 108, "width": 190, "height": 200 } } ]
},
{
"image": "image2.jpg",
"annotations": [
{
"label": "car-license-plate",
"coordinates": {
"x": 250, "y": 150, "width": 100, "height": 98
}
}
]
}
]
JSON由一个对象数组组成,包括image
(一个图像文件的名称),和annotations
(一个对象数组)。了解注释文件的构成相当重要,因为我们将用它来指定我们想在数据集中寻找的对象。
让我们把它分解一下。每个注释对象包含以下内容。
label
:分类器名称,在本例中我们使用car-license-plate
,因为那是我们要识别的对象的类别。coordinates
:我们使用x
和y
坐标(这相当于边界框的中心)以及width
和height
来指定我们想要的对象在图像中的确切位置。
下面是一个例子,说明这些JSON值如何对应于一个注释的图像
希望现在已经很清楚,Create ML在训练物体检测模型时需要哪些数据。当然,手工创建这些JSON结构可能相当耗费时间,而且,很无聊。幸运的是,有一些服务可以帮助我们标记我们的数据集。我们将在稍后讨论这些服务;现在是时候找到我们需要的数据了。
寻找数据来训练我们的模型
我们已经介绍了很多背景:物体检测、Core ML、Create ML和注释文件--现在是真正开始的时候了
我们可以采取一些方法来寻找我们需要的数据,以训练我们的模型。例如,我们可以通过谷歌搜索或简单地使用智能手机自己收集必要的照片。也就是说,许多高级数据科学家使用开放的资源来寻找数据。我想推荐两个资源来寻找几乎任何种类的数据。Papers With Code和Kaggle。
但是,在使用这类数据集资源时要注意:要注意许可证类型,因为有些数据集是禁止商业使用的。
对于我们的演示,我已经确定了100张汽车图片。如果你想用同样的资源来组装你的,在Kaggle上打开这个数据集,并在网站上注册(如果你还没有)。一旦你进入,通过导航到这里的 "图像 "文件夹,你就可以预览所选内容。不过,可能最有效的方法是通过下载整个档案,然后将必要的图像提取到一个单独的文件夹中,来组装我们需要的照片。
一旦这样做了,在你开始组装你的图像之前,请确保阅读下面的章节。
收集数据集时需要考虑的关键点
在准备一个数据集时,应该考虑两个关键点:平衡图像的选择,使不同类型的物体得到平等的体现,以及图像本身的独特性。
再解释一下,比如说,你想训练一个模型来识别猫和狗。相应地,为了达到最佳效果,猫和狗的图像比例应该是1:1。当然,在现实世界中,获得这样一个精确的平衡可能很难实现。
那么,这与我们现在有什么关系呢?好吧,在为我们的演示选择图像时,我们需要注意使细长、狭窄的盘子和方形的盘子得到同样好的表现,同样,理想情况下,这将是一个1:1的比例。
同样,我们要注意不要包括两个或多个相同的图像。它们都应该是独一无二的。
这两个细微差别--平衡图像的选择和图像的独特性--都会影响模型的准确性。
一旦你完成了,你就可以像我在这里做的那样收集你的数据集了。
那是很多车...
另外,如果你愿意,我也为你准备了我选择的100张汽车图片--只要点击下载就可以了。
在Roboflow上上传我们的数据
在数据准备的这个阶段,我们将使用一个叫做Roboflow的服务,它提供了一系列的预处理、输出和转换注释的工具。公共计划允许用户处理多达1000张图片--如果有提示,请确保你选择这一点,否则你将无法为这个体验导出你的数据集。
要开始使用,请注册,进入新项目屏幕,然后选择创建新项目。
⚠️对于第一次使用Roboflow的用户来说,重要的是:你会被提示要通过一个教程。请确保选择上传你自己的数据,因为我们不想使用我们的数据。此外,尽管实际的屏幕可能与本文中的图示略有不同--Roboflow会直观地突出你需要选择的内容,但步骤是一样的。
接下来,会出现一个模态窗口,我们需要填写一些数据。
- 项目名称。我们将在这里给我们的项目一个名称。
- 许可证:在这里我们将指定许可证类型--我们将选择公共领域。
- 项目类型。因为这是我们演示的主要目标,让我们选择物体检测。
- 注释组。这个字段为你要在图像中寻找的对象组指定一个名称。如果需要,这个名称可以改变。
项目创建表格已经准备好了!
在你填写完表格后,继续点击创建公共项目。
我们可以在下一个屏幕上选择我们的文件进行上传。虽然在这里也可以立即上传现成的注释,但本文的主要目的之一是展示如何从头开始标记数据集,所以继续添加你的选择。
向项目添加数据后,系统会过滤掉任何相同的图像。在我的案例中,只剩下91张。所以,如果**"所有图像**"显示的数字比你预先设定的要低,这可能就是原因。
接下来,点击 "完成上传"按钮。之后,上传过程需要一点时间来完成。
对数据进行标记
从这里,你需要点击分配图像。
然后,点击突出显示的图像,开始做注释。
通过点击图像,我们将切换到标注工具的全屏视图。
选择创建工具(C或命令键),选择包含汽车车牌的区域,如下图所示。在进行选择后,你需要为这组对象输入一个名称。默认情况下,这被设置为我们在创建项目时指定的注释组名称,但你可以改变它。保存结果。
在左边的 "注释"选项卡中,你可以看到你放在图像中的对象组。这些也将被包含在最终的注释文件中。
现在,让我们对其余的图像进行标注。乍一看,这个过程似乎很困难,也很耗时。这里有一个小提示:对每张图片都要这样做。选择对象 -> 按回车键 -> 按右箭头。虽然这个过程仍然需要一点时间,但事情会进行得更快更多!
完成后,你可以点击左上角的项目名称来继续。
从这里开始,我们需要点击上角的添加91张图片到数据集,系统会提示你将标记好的数据分成几类。培训、有效和测试。
这将在以后我们在Create ML中训练模型时使用。测试集可以省略或单独编制,它不应该包括训练集的图像。
验证集是非常重要的,它也包含独特的图像。Create ML将向我们展示使用验证数据的预测准确性。
苹果公司建议验证集和测试集至少要有50个对象。对于我们的项目,系统提示的数值--如图所示,Train: 70%, Valid: 20%, Test: 10%--足以得到我们想要的结果,继续往下看,点击Add Images。
在这个阶段,你会看到3个标有UNASSIGNED、ANNOTATING和DATASET的面板,以及顶角的Generate New Version按钮。
如果所有东西都已经在DATASET面板中,你可以继续点击生成新版本。否则,你应该打开作业,重新注释图像,并将它们加入训练集。
一旦所有东西都被分类到DATASET面板中,就可以点击生成新版本了。
预处理数据集
接下来,我们继续对现成的数据集进行格式化和生成。
⚠️注意:如果你在Roboflow中迷失了方向,你可以从侧边栏选择版本来导航回到这些步骤。
预处理部分允许你对一个集合中的所有对象应用一个或几个效果。这样做是为了提高模型的效率或其训练速度。默认情况下,有两种效果被应用:自动定位和尺寸适应。有了调整大小这一步,如果有必要,学习算法会自动将图像调整到416×416的大小。
如果你点击添加预处理步骤,你会看到一些更多的可用功能(在预处理选项下)。
对于我们的实施,我们将保持一切原样。
处理扩增选项
这一部分允许你在原始对象的基础上扩展当前的数据集。
要开始的话,选择 "添加扩展步骤"。增强选项部分(如下图所示)提供了一系列的效果。
让我们选择其中之一。然后,系统将向当前数据集添加新的样本图像,并应用这种效果。回顾一下,一个集合中的实例的数量会影响准确性。此外,实例的可变性也会影响准确性。你可以在苹果公司关于提高模型准确性的文章中了解更多这方面的信息。
让我们增加一些具有+20和-20度的旋转效果的实例。要做到这一点,从列表中选择旋转效果,指定所需的值,然后按应用。
你可以添加其他处理方法。提示:如果应用效果后图像不再真实,你不应该把这些图像添加到数据集中,因为这会降低识别精度。
生成数据集
最后一个阶段是生成数据集。这里会要求你选择最终数据集的大小。选择最大的可用值并点击生成。这将需要一些时间。
当数据集生成后,你可以输入一个版本名称。
另外,正如你可能已经注意到的,你可以创建同一个集合的多个版本,这使你可以尝试不同类型的预处理和增强效果。
在同一部分,你可以看到生成的结果并导出准备好的数据。
导出数据集
现在是时候下载我们的数据集并在Create ML中使用它了。首先,按下 "导出"按钮。确保 "下载zip到电脑 "被选中。
你会看到 "格式"下拉菜单,它提供了许多导出格式供你选择。
对于我们的项目,选择 "CreateML "格式。这样做之后,点击继续。
在解压缩下载的档案后,我们在本地机器上有三个图像文件夹--Train、Valid和Test集,以及它们相应的注释文件。
这次就到此为止吧!到目前为止,我们已经取得了很大的进展。我们了解了苹果的原生ML工具,从头开始准备我们的数据,对这些数据进行注释,现在我们已经有了三个数据集,可以在Create ML中输出和使用。
在本文的下一部分,我们将学习如何使用这些数据来创建一个模型,训练它,并在一个应用程序中使用它。另外,我们将看看两种Create ML训练方法:全网络和转移学习--我们将比较它们的性能。
顺便说一下,如果你有一个问题,(无论是否与ML有关)邪恶的火星人已经准备好帮助检测它,分析它,并将它消灭掉请给我们留言!
第一部分 |第二部分