大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 Create ML 框架构建动态 iOS App
了解您的 app 如何使用 Create ML 框架在设备上彻底训练 Core ML 模型,带来自适应和自定义 app 体验,并始终保护数据隐私。我们将探索可以即时创建样式传输和图像分类等基于图像的任务、自定义声音分类等音频任务,或基于丰富的文本分类、表格数据分类和表格回归因子的任务的模型类型。我们将带您了解这些模型带来的各种精彩机会,让您的 app 更加个性化和动态化。请观看 WWDC21 的“使用 Create ML 对手势和动作分类”和“探索 SoundAnalysis 中内置的声音分类”,激发更多灵感。
资源
相关视频
WWDC22
WWDC20
-
下载
♪重低音音乐声♪ ♪ 贾韬:你好 我是韬 今天 我和我的同事杰克将谈谈 用Create ML框架 打造动态iOS app 动态的app是什么意思? 动态的app让用户能 灵活自定义app的某些元素 动态app也为不同用户的需求 提供最符合用户的定制化内容 这些适应性强的app内功能 让你的用户能有 专为他们量身订做的 更智能和个性化的体验 你可以通过简单的启发式 和预定义规则 提供这种体验 但通常这些方法可能无法 为所有app用户提供最佳体验 因为他们的背景和偏好可能不同 另一方面 机器学习技术 让你能创建 直接向用户数据学习的模型 通常这比较容易泛化 比起启发式和预定义规则 较可能适合更多用户 所以能用哪些工具提供这种体验? 在Mac上可用的Create ML app 让人能轻松创建模型 只要选择 一些训练数据并点击训练按钮即可 它通过一组丰富的模板 支持各种模型类型 这个app构建于 Create ML框架之上 而Create ML让机器学习模型 能加速训练 Create ML框架原本推出于 macOS Mojave 让模型能 在你的macOSapp中 用Swift的编码训练 而现在我们将那个框架 带到iOS 15和iPadOS 15 能在设备上使用后 你的app可以做出各种 全新、动态的事情 换句话说 你可以直接从 你的app访问编程API 在设备上创建模型 它让你的app能够向用户学习 进而适应你的用户 最后但同等重要的 用户数据永远不需要离开他们的设备 因此能保护用户隐私 现在让我们开始吧 Create ML中提供了不同的任务 这是所有在macOS上可用的任务 而现在iOS也提供了 其中有些很受欢迎的任务 例如图像、声音 和文字分类器 较近期添加的任务包含风格迁移 还有今天新添加的 手部姿态和手部动作分类器 有了这些工具可 就能引申出许多有趣的点子和用例 这里有几个例子 利用图像分类 app可以学习 孩子最爱的毛绒玩具长什么样子 然后帮忙找到更多关于该玩具的照片 以协助制作关于毛绒娃娃的冒险故事 文字分类器可用来帮助用户 快速整理刚写好的笔记 方式是从用户的过去行动中 学习建议标记和文件夹 手部动作分类器 这是今年新推出的 可以让你的用户用自定义手部动作 触发app内视觉效果 有好多很酷的东西 可以用Create ML在iOS上做到 但我最好用演示直接示范是什么意思 我有个app 看起来有点像Photo Booth 但这比较动态 它让我能创建 自定义照片滤镜 让我示范怎么用 在我的iPad上 它在顶端显示 一系列现有的滤镜 是我在Mac上用Create ML的 风格迁移任务训练的 每个滤镜都由用来创建滤镜的 特定风格图像表示 在最底端 这个app等着照片试用这些滤镜 可以是拍照或选择照片 我现在拍张照
自拍好了
来看看滤镜的样子 我先点第一张海浪的照片 噢 我的脸和头发上出现一堆水滴 让我想起很久以前去迈阿密度假时 那小鸟这张照片呢? 你看我有多缤纷 看起来像裂开的冰的第三张呢? 喔 我看起来很冷酷 这些看起来都很有趣 但我觉得还是少了什么 如果我能用自己选的照片 自己创造一个滤镜呢? 那会让这个app超好玩 我来试试
我有这幅女儿的画 是她三岁时画的 我很爱这幅画的纹理和颜色 我很好奇我配上 我女儿的艺术风格会是什么样子 我要点这个“+滤镜”按钮 选择相机 然后拍照 “使用照片” 现在它正在创建滤镜 在后台 它正在训练一个自定义 风格迁移模型 我来解释它的原理 首先 选择单一张风格图像 我选择的风格图像是我女儿的画作 接着 我需要提供一组内容图像 让模型能学习如何将风格应用到图像 同时保存这些图像的原始内容 在这个演示中 我用了几十张来自我的相簿的照片 包括风景照和自拍照 如果你想将风格应用在其他照片类型 例如 你的宠物的照片 你可能也会选几张那种照片 加入你的内容组里 然后 选择你的滤镜类型 可以是图像或视频 这根据你的应用情境而定 在这个演示中 我选了图像 因为我想把风格应用在静态照片上 你也可以尝试不同的风格强度 风格密度 还有迭代的次数 以获得在风格化和原始内容间 最喜欢的组合 想更了解如何设置这些参数 请参考去年的WWDC专题讲座 现在我们来把这个新创的滤镜 套用在我的照片上 哇 我在女儿的画作上会长这个样子 它确实侦测到了这些纹理和颜色 来试试别张照片 我有只兔子 我女儿超爱跟它玩 如果我和兔子自拍 然后应用滤镜呢?
兔子也变成她的画作的风格了 我等不及拿给她看 并套用她的其他画作 一定会很好玩 在这个演示中 我示范了如何利用 iOS上的Create ML框架中的 风格迁移模型 创建一个自定义照片滤镜 以代码来看会是什么样子? 首先 定义训练数据源 指定一个风格图像 和一组内容图像 接着 定义你的会话参数 指定你想在哪里存储 你的检查点等 接着 用这些参数定义你的训练作业 最后 调度训练作业 一旦收到成功完成通知 存储已训练模型 要风格化图像 编译并实例化Core ML模型 开始进行预测 就这样 这就是我用 Create ML框架的风格迁移API 创建自定义照片滤镜的方式 其他任务遵循类似的API模式 目前为止我提到了 让你能用丰富媒体数据类型 创建模型的任务 媒体包含图像、文字、音频和视频 但如果你的app 不跟这些类型的数据交互呢? 让我邀请我的同事杰克 谈谈在那种情况下 如何让你的app变得动态 杰克卡克勒:谢谢韬 除了我们已经提到的任务以外 iOS上的Create ML框架 也支持结构化表格数据的 分类器和回归器 让我们用一个例子了解 这些可以如何创造 更动态的app体验 首先 介绍一下分类器和回归器 分类器从训练数据集里的数据 学习预测特定的类 回归器也类似 但它学习预测 一个数值 而不是离散的类标签 这些是利用表格数据 训练分类器和回归器的API 让它们能用在很多不同的场景中 特别是iOS上的Create ML 为这两者分别提供四种不同算法 使用常规表格模型 可能需要多投注一点心力 因为你必须决定想在模型中使用 哪些功能和目标值 不过 通常这可以很直截了当 我们来看一个app 它用表格回归器 添加个性化体验 这是一个简单的app 用来向餐厅订购餐点 这个app有附近地区的餐厅 这是一家本地的泰式餐厅 叫做“神奇泰式” 如果我选择它 app会显示 我可以向餐厅订购的餐点 还有每道餐点的信息 这是简单的app 但如果我能让它更好呢? 那应该会很棒 如果随着时间过去 我的app学会我的行为 并协助显示智能建议 推荐我可能会喜欢的餐厅和餐点 那会让它从简单的app 变成非常动态的体验 我可以通过直接在app中 训练一个表格回归器 做到这点 我要用三种信息 结合在一个结构化表格 以训练模型并交付新的动态体验 第一个是内容 也就是我加载到这个app的数据 以我们的餐厅app来说 就是餐点的信息 第二个是内容背景 这个例子中是用户订餐的时间 最后 我添加了用户的订购纪录 就在他们的设备上 创建一个为他们量身订做的体验 通过结合内容和背景信息 还有过去的用户交互 我可以预测未来的交互 这是个性化的大好机会 以这例子来说是协助预测 用户未来可能喜欢的餐点 我们回到添加模型后的app 我要订今天午餐 我想吃披萨 我将用餐时间设定为午餐 并选了披萨店 选了一个玛格丽特披萨并订购 这个窗口上有几项信息 是训练表格回归器的关键 内容是这项餐点的关键词 像是原料 西红柿和马苏里拉芝士 还有餐厅本身 披萨店 还有食物类型 披萨 这个模型用的背景信息是时间 这是午餐时间 现在我教会我的模型 这些是我午餐可能想吃的东西 最后 我的交互是我点了这道餐点 而不是别的餐点 我正在训练的回归器 正在为每一道我可能订购的餐点 预测一个偏好分数 今天它学到我确实点了这道餐点 而不是别的餐点 回到主要屏幕 模型已经训练好了 有个新窗口 专门为我推荐餐点 我实际点过的餐点 也就是玛格丽特披萨 是第一道建议餐点 但下一道建议餐点是 来自完全不同的餐厅的 卡布里莎三明治 前几名推荐还有几道披萨 我们再试一个例子 假设我现在要点晚餐
这次我点了神奇泰式的黄咖喱 现在模型再次更新了 它根据我的订购时间的信息 学到我的新偏好 我刚点的黄咖喱现在是第一推荐餐点 一道类似的咖喱是第二推荐餐点 下一个推荐是素食披萨 里面有蘑菇和彩椒 跟我刚点的咖喱一样 而且app知道我可能想吃披萨 就算披萨可能不是我晚餐的首选 如果我在隔一天订购午餐 模型学会分辨 我午餐可能会点什么 相对于我晚餐可能会点什么 这能提供非常个性化的体验 帮我找到我在那个时点想要的东西 而且现在才两笔订单 要将表格分类器或回归器 添加到app 有三个真实步骤 设置数据 训练 预测 这里的第一个函数利用一餐和关键词 创建这个回归器中使用的功能 我用和每道餐点关联的关键词 与目前这一餐 也就是背景信息相结合 创造新的关键词 让模型能捕获 内容 也就是餐点的关键词 和背景信息 也就是这一餐的关键词 两者的交互 我们在字典放入1.0的值 只是为了表示某个特定的关键词 存在数据输入中 首先 我为用户订购的每道餐点 用之前生成的功能添加一个输入 和一个正目标值 不过 如果只包含这个 模型不会学会分辨我喜欢的餐点 和我不喜欢的餐点 要做到这点 我再添加一个输入 内容是所有没有在餐点里的关键词 加上负的目标值-1 这让模型能学会哪些关键词 最适合用户的爱好 我将这个合并信息转换成数据框 指定关键词以及目标 最后 我训练模型 指定我要预测的列 是我设置为1或-1的目标列 在这个例子里 模型是个简单的 线性回归器 它能生成有意义的结果 让我用在这个app中 预测时 我只需要拿我想要执行推理的数据 并从我训练的模型调用预测 目前我们展示了如何 在iPadOS和iOS app中 训练风格迁移模型和表格回归器 我们谈谈集成机器学习训练 到你的app 一些最佳实践 别忘了遵守机器学习的 通用最佳实践 例如永远要用训练数据集以外的数据 测试模型表现 对于长期运行的训练任务 利用异步训练控制 和检查点机制 自定义你的模型创建工作流 模型创建的一些方面 可能需要大量算力 消耗额外内存 或是需要下载额外资产 集成到你的app时记得考虑这些 想了解更多信息 请参考我们的API和文档 如果想知道更多最佳实践 强烈建议你观看我们 过去几年的WWDC专题讲座 《设计绝佳的ML体验》 和《使用Swift控制 Create ML的训练》 本次讲座中 我们谈了如何使用 iOS上的Create ML框架 我们举了风格迁移的例子 和表格回归器的例子 大部分的Create ML模板现在可以 直接在iPhone或iPad上训练 通过在iOS上训练 你可以创建动态app 让用户能自定义并个性化体验 同时保护用户隐私 因为训练和推理 完全在app中进行 不需要担心模型部署的问题 我们很期待看到你的作品 谢谢收看 祝你享受今年的WWDC ♪
-
-
7:58 - Training a style transfer model
// define training data source let data = MLStyleTransfer.DataSource.images(styleImage: styleUrl, contentDirectory: contentUrl) // define session parameter let sessionParameters = MLTrainingSessionParameters(sessionDirectory: sessionUrl) // define training job let job = try MLStyleTransfer.train(trainingData: data, sessionParameters: sessionParameters) // dispatch training job // save out model upon receiving successful completion, compile for later use // make prediction with CoreML model 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)
-
13:39 - Collecting features for a regressor
func featuresFromMealAndKeywords(meal: String, keywords: [String]) -> [String: Double] { // Capture interactions between content (the dish keywords) and context (meal) by // adding a copy of each keyword modified to include the meal. let featureNames = keywords + keywords.map { meal + ":" + $0 } // For each keyword, create an entry in a dictionary of features with a value of 1.0. return featureNames.reduce(into: [:]) { features, name in features[name] = 1.0 } }
-
14:08 - Preparing training data
var trainingKeywords: [[String: Double]] = [] var trainingTargets: [Double] = [] for item in userPurchasedItems { // Add in the positive example. trainingKeywords.append( featuresFromMealAndKeywords(meal: item.meal, keywords: item.keywords)) trainingTargets.append(1.0) // Add in the negative example. let negativeKeywords = allKeywords.subtracting(item.keywords) trainingKeywords.append( featuresFromMealAndKeywords(meal: item.meal, keywords: Array(negativeKeywords))) trainingTargets.append(-1.0) }
-
14:37 - Training a linear regressor model
// Create the training data. var trainingData = DataFrame() trainingData.append(column: Column(name: "keywords" contents: trainingKeywords)) trainingData.append(column: Column(name: "target", contents: trainingTargets)) // Create the model. let model = try MLLinearRegressor(trainingData: trainingData, targetColumn: "target")
-
14:58 - Making a prediction
// Setup the data to run an inference on. var inputData = DataFrame() inputData.append(column: Column(name: "keywords", contents: dishKeywords)) // Call predictions on the trained model with the data. let predictions = try model.predictions(from: inputData)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。