原作者提供的服务之一是将神经网络转换为在iOS设备上运行。
因为神经网络本质上执行大量计算,所以它们在移动设备上尽可能高效地运行是很重要的。一个高效的模型能够在实时视频上获得实时结果 - 无需耗尽电池或使手机变热,就可以在其上煎鸡蛋。
传统的神经网络,如VGGNet和ResNet要求太高,我通常建议切换到MobileNet。有了这种架构,即使是超过200层的机型也可以在较旧的iPhone和iPad上以30 FPS运行。
我已经为iOS和macOS 创建了一个源代码库,可快速实现MobileNet V1和V2,以及SSDLite和DeepLabv3 +。
该库使您可以非常轻松地将基于MobileNet的神经网络添加到您的应用程序中,以执行以下任务:
- 图像分类
- 实时物体检测
- 语义图像分割
- 作为特征提取器,它是自定义模型的一部分
现代神经网络通常具有基础网络或“骨干”,在顶部具有用于执行特定任务的附加层。MobileNet是一个很好的支柱。我帮助客户在基础MobileNet层之上实现了实时对象跟踪和人体姿势识别模型,取得了巨大成功。
这是一个经过验证的经过实战检验的代码库,可在App Store中的应用程序中运行。
这是从运行MobileNetV2 + SSDLite的iPhone 7录制的视频(YouTube链接):
为制作此视频,我只是将手机指向我在Mac 上播放的YouTube视频,并使用Quicktime Player录制iPhone的屏幕。相机以30 FPS运行,神经网络可以轻松跟上,即使在这款旧手机上也是如此。(这个版本的SSDLite是在COCO上训练的。要在你的应用程序中使用它,你通常会在你自己的数据集上重新训练它。)
为何选择MobileNet?
许多研究论文提出了不适合在移动设备上使用的神经网络架构。通常,诸如VGGNet之类的大型模型被用作特征提取器,并且在顶部添加了新功能。
VGGNet,ResNet50和Inception等体系结构的问题在于它们具有数千万个参数,并且需要通过网络进行数十亿次计算。研究论文中的模型通常是在非常强大的GPU集群上进行培训。iPhone和iPad根本没有这种计算能力。
MobileNet架构旨在在移动设备上高效运行。它使用“仅”最多400万个参数,这比VGG的130M参数和ResNet50的25M参数要少得多。它也可以减少计算:300 MFLOPs与4 GFLOPs或更多这些大型模型。MobileNet的准确性与VGGNet类似,因此它是一个很好的替代品。
如果您正在考虑创建用于移动设备的神经网络架构,或者您正在从研究论文转换架构,请考虑使用MobileNet作为基础网络,为模型的其余部分提供提取的功能。
有关MobileNet如何工作的更多详细信息,请参阅以下博文:
- iPhone上的谷歌手机网
- MobileNet版本2
库中包含的模型
源代码库包括以下模型的快速实现:
- MobileNet V1:
- 特征提取器
- 分类
- 使用SSD进行物体检测
- MobileNet V2:
- 特征提取器
- 分类
- 使用SSD或SSDLite进行对象检测
- DeepLab v3 +用于语义分割
分类器模型可以适应任何数据集。如果您正在使用任何流行的培训脚本,那么使您的模型使用此库只需要运行转换脚本。
如何使用MobileNet V2分类器的示例:
这比使用Core ML模型所需的代码更少。
该库支持所有常见的iOS图像格式:
-
UIImage
,CGImage
,CIImage
-
CMSampleBuffer
和CVPixelBuffer
- Metal(RGB,BGR,YCbCr)
分类器使用MobileNet作为特征提取器,并在顶部添加分类层。该库还可以轻松地将特征提取器与分类器之外的其他模型集成。以下是如何使用MobileNet V1作为基础网络作为更大型号的一部分的示例:
您可以指定要从哪些图层中提取要素图,并使用这些输出作为模型其他图层的输入。这正是SSDLite等高级模型中发生的情况。
性能测量
本节显示了包含的MobileNet模型性能的几个指标。影响性能的因素有两个:
- “深度倍增器”。这个超参数可以让您平衡模型大小,推理速度和准确性之间的权衡。具有较小深度倍增器的模型执行较少的计算,因此更快,但也更不准确。以下测量适用于深度乘数= 1.0的标准模型。
- 输入图像的大小。由于它是一个完全卷积网络,因此MobileNet接受任何大小的输入图像。但是,使用大图像比使用较小图像慢得多。使用224×224像素的标准图像进行测量。
速度(每秒帧数)
下表显示了在一系列224×224图像上运行推理的分类器模型的最大FPS(每秒帧数):
版 | iPhone 7 | iPhone X. | iPad Pro 10.5 |
---|---|---|---|
MobileNet V1 | 118 | 162 | 204 |
MobileNet V2 | 145 | 233 | 220 |
注意:测试是在iOS 11.2和11.3上进行的。将图像从其原始大小调整为224×224的时间不包括在这些测量中。测试使用三重缓冲来获得最大吞吐量。分类器在ImageNet数据集上进行训练,并输出1000个类别的预测。
物体检测的FPS结果是:
版 | iPhone 7 | iPhone X. | iPad Pro 10.5 |
---|---|---|---|
MobileNet V1 + SSD | 53 | 74 | 82 |
MobileNet V2 + SSDLite | 63 | 98 | 108 |
注意:物体检测测试是在300×300图像上进行的。没有应用后处理(非最大抑制),因此这些分数仅测量运行神经网络所需的原始时间。SSD模型在COCO数据集上进行训练。
用于语义分割的FPS结果是:
版 | iPhone 7 | iPhone X. | iPad Pro 10.5 |
---|---|---|---|
DeepLabv3 + | 8.2 | 12.5 | 15.1 |
注意:分割模型将513x513图像作为输入,并生成513x513分割蒙版。该模型在Pascal VOC数据集上进行了20个等级的培训。如您所见,分割比其他任务慢很多!
准确性
下表显示了ImageNet测试集上分类器的准确性:
版 | 前1名准确度 | 前5名准确度 |
---|---|---|
MobileNet V1 | 70.9 | 89.9 |
MobileNet V2 | 71.8 | 91.0 |
注意:这是原始TensorFlow模型的精确度,而不是转换后的Metal模型。(我将很快更新此表,其中包含在ImageNet验证集上运行Metal模型的结果。)
大小和计算
下一个表格显示了分类器模型的大小以及它们在单个224×224图像上进行推理的多次乘法累加运算:
版 | MAC(百万) | 参数(百万) |
---|---|---|
MobileNet V1 | 569 | 4.24 |
MobileNet V2 | 300 | 3.47 |
库将权重存储为16位浮点数。将MobileNet V2加入您的应用程序会为您的应用程序包增加大约7 MB的空间。
为什么不选择Core ML或TensorFlow Lite?
Core ML很棒,我是粉丝。如果您使用Keras,Caffe或MXNet训练模型,将模型转换为Core ML文件并将其嵌入您的应用程序非常容易。如果您使用TensorFlow训练模型,TF Lite是一个不错的选择。
这些选项(相当)方便,但不幸的是它们没有那么高效。TensorFlow目前不是GPU加速的,Core ML往往比手动优化的Metal模型慢。
下表比较了Core ML和MetalNet版本的最大FPS:
iPhone 7 | iPhone X. | iPad Pro 10.5 | |
---|---|---|---|
Core ML | 45 | 53 | 110 |
Core ML 2 | - | - | 120 |
Metal | 118 | 162 | 204 |
速度差异 | 2.6× | 3× | 1.8倍 |
注意:在iOS 11.2和11.3上测试了Core ML和Metal。Core ML 2使用iOS 12 beta 2测试。由于它仍处于测试阶段,因此Core ML 2的报告结果可能比最终版本慢。
是的,我也不敢相信:Core ML真的要慢得多。为了测量Core ML模型的速度,我使用224×224 CVPixelBuffer
作为输入,具有三重缓冲。我还通过Vision框架测试了模型,但这通常比直接使用Core ML慢。
与MobileNet V2相同的比较:
iPhone 7 | iPhone X. | iPad Pro 10.5 | |
---|---|---|---|
Core ML | 41 | 50 | - |
Core ML 2 | - | - | 84 |
Metal | 145 | 233 | 220 |
速度差异 | 3.5× | 4.6× | 2.6× |
出于某种原因,使用Core ML,MobileNet V2的运行速度低于V1。V2模型具有更少的参数但更多的层,这可能是Core ML更慢的原因。
使用Core ML的另一个缺点是它不如Metal灵活。Core ML仅支持有限数量的模型和图层类型。如果您正在使用新图层或激活功能进行前沿工作,Core ML可能无法帮助您。虽然现在可以创建自定义Core ML图层,但我发现使用Metal实现整个模型更容易。
我建议使用Core ML快速迭代你的模型,但对于进入你的应用程序的最终版本,没有什么比Metal代码的原始功能更好。
你得到了什么?
使用此库,您可以获得MobileNet V1和V2 的完整Swift源代码,以及SSD,SSDLite和DeepLabv3 +。
代码使用Metal和Metal Performance Shaders框架编写,以充分利用GPU。
还包括:
- 转换脚本。这些脚本从TensorFlow,Keras,Caffe等读取经过训练的模型,并转换权重,以便将它们加载到模型的Metal版本中。
- 方便的帮助程序类,可以轻松地将模型放入您自己的应用程序并解释其预测。
- 预先训练好的模型可以快速入门。
- 有关如何使用API的文档。
- 示例应用。这些应用程序展示了如何使用iPhone相机,照片库,ARKit等实时视频的模型。
该库与iOS 11兼容,可在具有A8处理器或更高处理器(iPhone 6及更高版本)的设备上运行。
注意:由于iOS的限制,当应用程序在后台时,无法使用GPU。如果您的应用需要在应用程序后台运行时运行神经网络,则无法使用此库。在这种情况下,使用Core ML或TF Lite是更好的选择。或者,如果Core ML或TensorFlow不是合适的解决方案,我可以将您的模型转换为使用高度优化的CPU例程,以尽可能地挤出最大速度。
原文:http://machinethink.net/faster-neural-networks/
作者:Matthijs Hollemans