WWDC Quick Look 💓 By SwiftGGTeam
Build dynamic iOS apps with the Create ML framework

Build dynamic iOS apps with the Create ML framework

观看原视频

Highlight

Create ML 框架从 macOS 扩展到 iOS 15 和 iPadOS 15,开发者可以在用户设备上直接训练 Core ML 模型,实现自适应的个性化 App 体验,且用户数据始终不离开设备。

核心内容

从静态模型到动态学习

以前,App 里的机器学习模型是静态的。开发者用 Create ML app 在 Mac 上训练好模型,打包进 App,用户下载后模型就不会再变。这种方案有几个问题:模型无法适应每个用户的独特偏好;更新模型需要发新版 App;用户数据要上传到服务器才能训练,隐私有风险。

WWDC2021 把 Create ML 框架带到了 iOS 和 iPadOS。现在 App 可以直接在设备上训练模型,学习用户的行为和偏好,实时调整体验。数据始终留在本地,隐私得到保护。训练完成后直接用于推理,不需要部署模型到服务器。

支持的任务类型

Create ML on iOS 支持多种任务模板(02:27):

  • 图像分类、风格迁移(Style Transfer)
  • 文本分类
  • 声音分类
  • 表格数据分类与回归(Tabular Classifier / Regressor)
  • 手部姿态与动作分类(Hand Pose / Action Classifier)

风格迁移:现场训练个性化滤镜

演讲者演示了一个照片滤镜 App。用户选择一张风格图片(比如孩子的涂鸦),App 在设备上训练一个风格迁移模型,然后立刻用这个模型处理照片(03:42)。

训练只需要一张风格图和一组内容图。用户可以提供自己的照片作为内容图,让模型学习如何把风格应用到这类照片上。训练参数包括风格强度、风格密度和迭代次数,可以根据效果调整。

表格回归:餐厅推荐系统

另一个例子是餐厅点餐 App(10:07)。App 收集三类信息:菜品内容(关键词、食材)、上下文(用餐时间)、用户行为(点了什么)。用这些信息训练一个线性回归模型,预测用户对每道菜的偏好分数。

模型训练只需要几次订单就能开始给出推荐。用户点午餐时,模型推荐适合午餐的菜品;点晚餐时,推荐适合晚餐的菜品。随着订单增多,推荐越来越精准。

详细内容

风格迁移模型训练代码

07:58

// 定义训练数据源:一张风格图 + 一组内容图
let data = MLStyleTransfer.DataSource.images(
    styleImage: styleUrl,
    contentDirectory: contentUrl
)

// 定义会话参数:指定 checkpoint 保存位置
let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionUrl)

// 定义训练任务
let job = try MLStyleTransfer.train(
    trainingData: data,
    sessionParameters: sessionParameters
)

// 训练完成后保存模型
try model.write(to: writeToUrl)

// 编译模型供后续使用
let compiledURL = try MLModel.compileModel(at: writeToUrl)
let mlModel = try MLModel(contentsOf: compiledURL)

// 用训练好的模型做推理
let inputImage = try MLDictionaryFeatureProvider(dictionary: ["image": image])
let stylizedImage = try mlModel.prediction(from: inputImage)

关键点:

  • MLStyleTransfer.DataSource.images 把风格图和内容图目录封装成数据源
  • MLTrainingSessionParameters 控制训练会话的行为,包括 checkpoint 保存路径
  • MLStyleTransfer.train 启动异步训练,返回一个可以监控进度的 job
  • 模型需要先 writecompileModel,编译后的 .mlmodelc 才能被 MLModel 加载
  • 推理时使用 MLDictionaryFeatureProvider 构造输入,键名 "image" 对应模型输入

表格回归模型训练代码

13:39

// 从菜品关键词和用餐时间生成特征
func featuresFromMealAndKeywords(meal: String, keywords: [String]) -> [String: Double] {
    // 把关键词和用餐时间组合,捕捉内容与上下文的交互
    let featureNames = keywords + keywords.map { meal + ":" + $0 }

    // 每个特征值为 1.0,表示该特征存在
    return featureNames.reduce(into: [:]) { features, name in
        features[name] = 1.0
    }
}

关键点:

  • 特征工程的核心是把 “用餐时间:关键词” 作为组合特征,让模型学习 “午餐时喜欢披萨” 这种上下文相关的偏好
  • 每个特征用 1.0 表示存在,这是稀疏特征的标准表示方式

14:08

var trainingKeywords: [[String: Double]] = []
var trainingTargets: [Double] = []

for item in userPurchasedItems {
    // 正例:用户点了这道菜
    trainingKeywords.append(
        featuresFromMealAndKeywords(meal: item.meal, keywords: item.keywords)
    )
    trainingTargets.append(1.0)

    // 负例:用户没点的其他关键词
    let negativeKeywords = allKeywords.subtracting(item.keywords)
    trainingKeywords.append(
        featuresFromMealAndKeywords(meal: item.meal, keywords: Array(negativeKeywords))
    )
    trainingTargets.append(-1.0)
}

关键点:

  • 必须同时提供正例和负例,模型才能学会区分喜欢和不喜欢的菜品
  • 负例用 allKeywords.subtracting(item.keywords) 生成,代表同一餐时用户没选择的其他关键词
  • 目标值用 1.0 和 -1.0,让回归器输出可正可负的偏好分数

14:37

// 把数据封装成 DataFrame
var trainingData = DataFrame()
trainingData.append(column: Column(name: "keywords", contents: trainingKeywords))
trainingData.append(column: Column(name: "target", contents: trainingTargets))

// 训练线性回归模型
let model = try MLLinearRegressor(
    trainingData: trainingData,
    targetColumn: "target"
)

关键点:

  • DataFrameColumn 是 Create ML 的数据结构,类似 pandas 的 DataFrame
  • MLLinearRegressor 是四种表格回归算法之一,适合这个场景因为特征稀疏且线性可分
  • targetColumn 指定要预测的目标列

14:58

// 构造待预测的输入数据
var inputData = DataFrame()
inputData.append(column: Column(name: "keywords", contents: dishKeywords))

// 调用模型预测
let predictions = try model.predictions(from: inputData)

关键点:

  • 预测时构造的 DataFrame 列名必须与训练时一致
  • predictions 返回每道菜的偏好分数,分数越高表示用户越可能喜欢

核心启发

1. 个性化照片滤镜 App

  • 做什么:让用户用自己的照片或绘画作品训练专属滤镜,实时应用到相机拍摄的照片上
  • 为什么值得做:风格迁移模型可以在几秒内完成训练,用户能立刻看到效果,体验极具个性化
  • 怎么开始:用 MLStyleTransfer.train 在设备上训练,参考代码中的 MLStyleTransfer.DataSource.images 构造数据源

2. 智能笔记分类助手

  • 做什么:根据用户过去的分类习惯,自动为新笔记推荐标签和文件夹
  • 为什么值得做:文本分类器可以在设备上训练,学习用户的个人分类模式,不需要把笔记内容上传到云端
  • 怎么开始:用 MLTextClassifier 训练,把用户的历史笔记作为训练数据,标签是用户之前手动设置的分类

3. 自适应音乐推荐

  • 做什么:根据用户在不同时间、地点、活动状态下的听歌历史,预测当前场景下用户想听什么
  • 为什么值得做:表格回归可以融合多种上下文特征(时间、地点、活动),给出比简单规则更精准的推荐
  • 怎么开始:用 MLLinearRegressorMLBoostedTreeRegressor,特征包括时间、地点、歌曲元数据,目标是用户是否完整播放了歌曲

4. 自定义手势控制游戏

  • 做什么:让用户定义自己的手势来控制游戏角色或触发特效
  • 为什么值得做:手部姿态分类器可以识别用户自定义的手势,结合 Vision 的手部关键点检测,实现零学习成本的操作方式
  • 怎么开始:用 Create ML 训练 MLHandPoseClassifier,输入是 Vision 的 VNHumanHandPoseObservation.keypointsMultiArray()

关联 Session

评论

GitHub Issues · utterances