首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >更快的iOS和macOS神经网络

更快的iOS和macOS神经网络

作者头像
iOSDevLog
发布2018-07-25 16:55:37
1.3K0
发布2018-07-25 16:55:37
举报
文章被收录于专栏:iOSDevLogiOSDevLog

原作者提供的服务之一是将神经网络转换为在iOS设备上运行。

因为神经网络本质上执行大量计算,所以它们在移动设备上尽可能高效地运行是很重要的。一个高效的模型能够在实时视频上获得实时结果 - 无需耗尽电池或使手机变热,就可以在其上煎鸡蛋。

传统的神经网络,如VGGNet和ResNet要求太高,我通常建议切换到MobileNet。有了这种架构,即使是超过200层的机型也可以在较旧的iPhone和iPad上以30 FPS运行。

MobileNetV2分类器和物体检测器在实时摄像机上进行

我已经为iOS和macOS 创建了一个源代码库,可快速实现MobileNet V1和V2,以及SSDLiteDeepLabv3 +

该库使您可以非常轻松地将基于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如何工作的更多详细信息,请参阅以下博文:

库中包含的模型

源代码库包括以下模型的快速实现:

  • MobileNet V1
    • 特征提取器
    • 分类
    • 使用SSD进行物体检测
  • MobileNet V2
    • 特征提取器
    • 分类
    • 使用SSDSSDLite进行对象检测
  • DeepLab v3 +用于语义分割

分类器模型可以适应任何数据集。如果您正在使用任何流行的培训脚本,那么使您的模型使用此库只需要运行转换脚本。

如何使用MobileNet V2分类器的示例:

这比使用Core ML模型所需的代码更少。?

该库支持所有常见的iOS图像格式:

  • UIImageCGImageCIImage
  • CMSampleBufferCVPixelBuffer
  • 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×

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为何选择MobileNet?
  • 库中包含的模型
  • 性能测量
    • 速度(每秒帧数)
      • 准确性
        • 大小和计算
        • 为什么不选择Core ML或TensorFlow Lite?
        • 你得到了什么?
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档