跃迁引擎

空気を読んだ雨降らないでよ

iOS Research & Development


「端智能」神经网络/机器学习在 iOS 端的应用与场景落地

端智能简介

相比云侧智能,端智能具有低延时保护数据隐私节省云端计算资源等显著优势。

近年来,以深度学习为代表的新一代人工智能技术得到了快速发展和广泛应用,模型训练和模型推断基本都在云侧完成。但随着移动设备算力的提升、模型压缩技术的成熟,模型推断在终端设备运行成为可能,端智能(On-Device AI)应运而生。

端智能是指算法模型在终端设备上运行及其上层应用。其中,终端设备是指以手机为主的各种智能设备,算法模型多数是指深度学习模型。相比云侧智能,端智能具有低延时保护数据隐私节省云端计算资源等显著优势。目前手机上的智能摄像、人脸识别、增强现实(AR)特效等端智能应用已经非常普遍。全球权威IT研究与顾问咨询公司高德纳(Gartner)曾经在数年前预计,到2022年,80%的智能手机将内置人工智能技术。目前国内各大厂商,主流 APP 已全部完成或正在进行端智能覆盖。

如阿里巴巴,早在2016年就在拍立淘场景中进行端智能相关应用实践。经过多年探索、实践和沉淀,我们目前已经构建了相对完整的端智能技术体系,并且在拍立淘、直播内容理解、AR商品导购等场景获得规模化应用。据不完全统计,阿里巴巴集团内部已经有超过30个移动App应用了端智能技术,手机淘宝内部应用场景超过25个。

而像抖音、今日头条、美团、小红书、Bilibili等众多国内主流 APP 也早已完成了核心业务的智能推送、实时翻译、图像识别、音频识别、手势识别等端智能部署。

基于 Core ML 的神经网络/机器学习

关于机器学习

对于机器学习,iOS 开发人员可以选择三种方式来访问经过训练的模型进行推理和预测:

  1. 使用 Core ML 访问本地设备上的预训练模型。这要是本篇文章将要介绍的重点。
  2. 在云中托管机器学习模型,并将数据从设备发送到托管端点进行预测。
  3. 调用第三方 API 驱动的机器学习云托管服务,该服务托管并管理预定义的训练模型。用户数据通过设备的 API 调用传递,再由服务返回预测值。

关于 Core ML

Core ML 是跨 Apple 产品(macOS、iOS、watchOS 和 tvOS)使用的机器学习框架,用于通过在端侧轻松集成预先训练的机器学习模型来执行快速预测或推理,从而允许您执行实时预测设备上的实时图像或视频。开发者可以通过 Core ML 框架将机器学习模型集成到应用程序中,该框架最大的优点是使用它并不需要开发者具备额外的神经网络或机器学习知识。Core ML 框架的另一个特点是,只要开发者将已经训练好的数据模型转换成了 Core ML 模型即可使用

Core ML为所有模型提供统一的表示。你的应用程序使用Core ML API 和用户数据来进行预测以及训练或微调模型,所有这些都在个人设备上进行。

模型是将机器学习算法应用于一组训练数据的结果。你可以使用模型根据新的输入数据进行预测。模型可以完成各种用代码编写很难或不切实际的任务。例如,你可以训练模型对照片进行分类,或直接从照片的像素检测照片中的特定对象。

你可以使用与 Xcode 捆绑在一起的 Create ML 应用程序构建和训练模型。使用Create ML训练的模型采用Core ML模型格式,可以在你的应用程序中使用。或者,你可以使用各种其他机器学习库,然后使用Core ML Tools将模型转换为Core ML格式。一旦模型位于某人的设备上,你就可以使用Core ML使用该人的数据在设备上重新训练或微调该模型。

Core ML通过利用 CPU、GPU 和神经引擎来优化设备性能,同时最大限度地减少内存占用和功耗。严格在个人设备上运行模型无需网络连接,这有助于保持个人数据的私密性和应用程序的响应能力。

该框架是特定领域框架和功能的基础。它支持用于分析图像的视觉、用于处理文本的自然语言、用于将音频转换为文本的语音以及用于识别音频中的声音的声音分析。Core ML本身构建在Accelerate和BNNS等低级原语以及Metal Performance Shaders之上。

端侧机器学习的优势

  1. 低延迟和近乎实时的结果:用户不需要通过发送数据然后等待响应来进行网络 API 调用。这对于设备上摄像头连续帧的视频处理等应用至关重要。
  2. 可用性(离线)、隐私和低成本,因为应用程序在没有网络连接的情况下运行,没有 API 调用,并且数据永远不会离开设备。想象一下,在地铁中使用移动设备识别历史瓷砖,在飞行模式下编录私人度假照片,或者在荒野中检测有毒植物。

端侧机器学习的缺点

  1. 应用程序大小:通过将模型添加到设备,您会增加应用程序的大小,并且一些精确的模型可能会非常大。
  2. 系统利用率:移动设备上的预测和推理涉及大量计算,这会增加电池消耗。较旧的设备可能难以提供实时预测。
  3. 模型训练:在大多数情况下,设备上的模型必须在设备外部使用新的用户数据不断进行训练。重新训练模型后,应用程序将需要使用新模型进行更新,并且根据模型的大小,这可能会给用户带来网络传输压力。结合上面提到的应用程序大小问题,这也会导致一个潜在的用户体验问题。

如何使用 Core ML

Create ML

当我们手中没有现成的模型时,需要训练并创建一个全新的模型,这时就可以使用 Xcode Developer Tool 中的 Create ML 进行创建。

  1. 首先找到 Create ML,选择并打开。

  2. 由于我们是从0开始构建一个全新的模型,所这里选择创建一个新文档,用于存放我们的训练集。

  3. 选择模型将要训练的类型,Core ML 会根据不同的训练模型(如图像分类、目标检测、风格迁移、手势分类等)选择不同的神经网络算法进行训练处理。选择并给训练集命名后,就创建完成了。这里我们选择图像分类进行演示。

  4. 开始训练,在选择完训练集以后,会进入模型构建页面,这里可以进行训练、验证、测试和模型输出的设置等。其中,训练集和测试集需要提供数据,而验证集是自动从训练集中分割的不需要要手动处理。将同一训练集的训练内容放入 Training Data 进行训练,训练完毕后即可输出对应的模型。注意:数据的格式必须是以训练集且必须拥有至少2个子集(子文件目录)的形式(也就是需要放入一个已命名的文件夹)放入,测试与训练数据不能相同

    1. 注意这里的 Feature Extractor(特征提取器)提供了两个版本 V1 和 V2,其中 V2 的特征训练结果更精确,但是要求更高的基础版本,需要 macOS 14.0+ ``/ ``iOS 17.0+ / tvOS 17.0+
  5. 训练完毕后,可以看到验证结果,准确率等指标数据。

  6. 预览模型训练效果,训练结束后,可以在 Preview 中预览模型的训练成果。这里我们演示的是图像分类,就放图图片进行效果预览。

这里我们可以看到识别结果,94%的相似度是在 8 这个训练集中,6%的相似度在 7 这个训练集中

让我们看下 8 的元训练数据

再看看 7 的元训练数据

很显然,数据训练的很成功,那么我们就可以将这个模型进行输出了

  1. 输出模型,提供给开发者使用。这里会展示出模型的大小、类型、支持的系统版本等信息。选择 Get 保存为模型文件即可。

输出后会得到一个mlmodel为后缀格式模型文件

如何在代码中使用训练完成的模型

将模型放入端内,Xcode 会自动生成与模型同名的调用 API,如下面的 VideoFrameChineseModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import UIKit
import CoreML

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// 模型配置
let config = MLModelConfiguration()
// 初始化模型
let model = try? VideoFrameChineseModel(configuration: config)

if let url = Bundle.main.url(forResource: "8shang", withExtension: "png") {
// 构建输出结果
if let pResult = try? model?.prediction(input: VideoFrameChineseModelInput(imageAt: url)) {
print("检测到目标属于: \(pResult.target) 测试集")
}
}
}
}

其中,pResult 为 VideoFrameChineseModelInput 类型的输出结果,其遵循了 MLFeatureProvider 协议 ,我们可以在 pResult 中读取到模型预测的对象名称(也就是我们的训练集名称),以及预测结果中各训练集所占的百分比的比例等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// Model Prediction Output Type
@available(macOS 14.0, iOS 17.0, tvOS 17.0, *)
@available(watchOS, unavailable)
class VideoFrameChineseModelInput : MLFeatureProvider {

/// Source provided by CoreML
private let provider : MLFeatureProvider

/// target as string value
var target: String {
return self.provider.featureValue(for: "target")!.stringValue
}

/// targetProbability as dictionary of strings to doubles
var targetProbability: [String : Double] {
return self.provider.featureValue(for: "targetProbability")!.dictionaryValue as! [String : Double]
}

var featureNames: Set<String> {
return self.provider.featureNames
}

func featureValue(for featureName: String) -> MLFeatureValue? {
return self.provider.featureValue(for: featureName)
}

init(target: String, targetProbability: [String : Double]) {
self.provider = try! MLDictionaryFeatureProvider(dictionary: ["target" : MLFeatureValue(string: target), "targetProbability" : MLFeatureValue(dictionary: targetProbability as [AnyHashable : NSNumber])])
}

init(features: MLFeatureProvider) {
self.provider = features
}
}

模型导入到工程内问题解决方案

Core ML 模型导入工程后 Swift 类无法识别的问题

解决方案:

  1. 检查 MLModel 的语言类型,点击工程内的模型,查看如下信息,一般默认情况下,Xcode 会自动设置为 **Objective-C ** 类型

  2. 找到Build settings -> 搜索 CoreML Model Class Generation Language -> 将 Automatic改为 Swift 即可

Core ML 模型在 .xcodeproj 工程内可识别,但 .xcworkspace 中无法识别
  1. 执行 pod deintegrate
  2. 执行 rm -rf PROJECTNAME.xcworkspace/
  3. 执行 pod install

会重新生成全新的 .xcworkspace 工程文件,运行这个新的工程文件进行编译即可

洋葱学园在端智能场景的落地

使用场景

  • 智能识别学习视频帧图,快速定位到视频内容,能够最大程度的从域外流量进行引流,如用户在抖音看到分享洋葱学园课程的视频,被课程内容吸引而下载了 APP,此时又想详细学习当时看到的那个视频的完整内容,那么截图抖音视频,进入端内进行图像识别,即可搜索出对应的视频并播放学习,如果是付费视频还可以促进付费转换。
  • 智能搜索推荐,在搜索上利用机器学习模型对语言进行分词解析,推荐内容,更快速的找到搜索词条,简化用户触达学习场景的复杂度。
  • 洋葱 TV 话题相关视频推荐,端智能排序进行相关内容输出,例如抖音。
  • 首页定制化智能推荐,千人千面首页板块,例如手淘。
  • 本地的用户行为分析,操作分析等等。

模型如何训练

  • 将数据源利用 Core ML 进行训练后,产出模型内置与客户端内,例如视频帧数据源训练,将各视频进行逐帧训练,训练完毕后产出模型。

模型如何更新

  • 客户端发版更新
  • 对 cmmodel 类型进行 zip 下发覆盖策略更新,如更新后上传至服务器,更新后下发解压覆盖原文件

延伸阅读

最近的文章

iOS 短视频播放列表优化策略

基于洋葱学院短视频播放器进行优化改造,以下是优化策略图 三播放器加载策略 业务流程优化 …

, , 开始阅读
更早的文章

洋葱学园 iOS 端组件化重构之路[三]-重构完成

概述 以下数据均已脱敏 当前,洋葱学园移动端工程的组件化完成度较低,在影响工程师开发效率的同时,又难以兜住持续集成的影响范围,不利于整体工程的高质量建设,已无法满足日益增长的工程预期与精细化控制的需求,更是掣肘了对公司业务快速扩展的响应速度。 当前问题业务侧影响 业务组件独立度的低,难以快速部 …

, , 开始阅读
comments powered by Disqus