多年来,Apple 的机器学习结构变得越来越健壮。Style TransferNeural Style Transfer是结构供给的一种技术。通过风格转化,您可以将一张图片变成一张新图片,并将其风格化为第三张图片。在本教程中,您将学习怎样利用 Apple 的 ML 结构直接在您的 iOS 设备上实现这一政策!

iOS 和 macOS 中的机器学习 (ML) 依赖于两个中心 Apple 结构 –CreateMLCoreML。CreateML 容许您构建和操练 ML 模型,CoreML 容许您工作这些模型。

CreateML 最初仅可用于 macOS 以生成模型。然后,您可以捆绑这些模型以在 macOS、iOS 或 iPadOS 运用程序中运用。

2021 年,Apple 将该结构供给给 iOS 15 和 iPadOS 15。现在,CreateML 结构容许在设备上操练和创立模型。

在本教程中,您将学习:

  • 怎样在设备上创立 ML 模型。
  • 怎样运用模型生成风格化图画。
  • 机器学习操练和猜想的中心概念。

留心:iOS 模拟器不支持本教程中运用的 API。您需求 iOS 设备和此运用的开发者帐户。选择模拟器作为部署政策会使 Xcode 愤慨而且无法编译!:]

入门

发动项目是一个名为Petra的简略运用程序。

在 Xcode 中翻开发动项目,然后在您的设备上构建并工作它。让自己熟悉运用程序的 UI 和代码库。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

这个运用程序有一个单一的屏幕,容许您选择两个图画。第一个图画是一个样式图画,它指示需求什么样式。第二个图画,即用户选择的图画,将运用所需的样式。

底部的按钮运用样式! 应该将用户图画转化为选定的样式。在本教程结束时放入缺失的部分后,此按钮将起作用。

关于这个运用程序,您将创立一个MLModel,用于对您的宠物相片进行样式化。

在本教程中,您将操练模型将样式运用于宠物,例如猫或狗,或许大象或鸡。您可以运用相同的准则来创立专为您的宠物操练的模型。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

什么是风格搬运?

风格搬运是一种将一幅图画的内容与另一幅图画的风格相交融的技术。ML 模型从样式输入中学习样式,包含图画、颜色或纹路。然后它运用它以该样式从头组合内容输入。

该模型从样式内容创立构建块。然后它会运用这些块从头创立您的内容,就像您在 Minecraft 游戏中所做的那样。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

在上面的示例中,平铺/图画图画A充任用于提取样式(例如,颜色、图画、纹路)的源。该样式运用于图画B以生成风格化的输出图画C

听起来像魔术,不是吗?

这种技术有各式各样的运用,从数字艺术到虚拟现实。正如在 Google Stadia 平台上演示的那样,它还在游戏中找到了自己的方位。Apple 的 ARKit 还支持风格转化以对特定场景进行风格化。

准备数据集

要创立模型,您有必要运用机器学习算法处理操练集。iOS 中的 CreateML 结构也不破例,它供给了操练模型所需的一切功能。

操练数据应尽或许靠近预期的用户内容。
例如,关于一个风格化人脸的运用程序,您需求人像来操练模型。

关于本教程,您将需求宠物图画来操练模型。您将运用来自Kaggle的一小部分数据,其间包含猫和狗的图片。不要忧虑下载整个数据集。示例项目已经有咱们的小型数据集,您将在本教程中运用它。

在Finder中翻开项目目录,找到TrainingData文件夹。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

出于演示意图,该项目包含一个示例风格化图画。您可以在项目中的Assets.xcassets下看到 PresetStyle_1图片。**

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

回想一下,这就是您在发动项目中所具有的:

  1. 操练数据:包含宠物图画的目录作为咱们的操练集。
  2. 样本风格图画:具有共同纹路、颜色或图画的样本艺术或平铺图画。

留心:您也可以包含自己的一组宠物图画以提高模型的准确性。

接下来,您将运用数据创立和操练模型。

操练模型

与任何机器学习相同,模型操练是风格搬家的主要过程。让操练开始吧!

翻开MLModelHandling组中的MLModelTrainer.swift
trainModel(using:validationImage:sessionDir:onCompletion:)用下面的代码替换方法的内容。

// 1
let dataSource = MLStyleTransfer.DataSource.images(
    styleImage: styleImage,
    contentDirectory: Constants.Path.trainingImagesDir ?? Bundle.main.bundleURL,
    processingOption: nil)
// 2
let sessionParams = MLTrainingSessionParameters(
    sessionDirectory: sessionDir,
    reportInterval: Constants.MLSession.reportInterval,
    checkpointInterval: Constants.MLSession.checkpointInterval,
    iterations: Constants.MLSession.iterations)
// 3
let modelParams = MLStyleTransfer.ModelParameters(
    algorithm: .cnn,
    validation: .content(validationImage),
    maxIterations: Constants.MLModelParam.maxIterations,
    textelDensity: Constants.MLModelParam.styleDensity,
    styleStrength: Constants.MLModelParam.styleStrength)

以下是代码的情况:

  1. 您创立dataSource,它是一个MLStyleTransfer.DataSource。这告知模型要从哪里操练数据。

  2. 您可以通过以下方式为操练课程指定参数MLTrainingSessionParameterssessionDirectory:保存会话期间生成的数据。湾。reportInterval:会话陈述发展的迭代次数。C。checkpointInterval:会话保存查看点之后的迭代次数。d。迭代:为会话工作的迭代总数。

  3. 您还设置ModelParametersalgorithm:风格搬家任务的操练算法,优先考虑速度()或质量()。湾。验证:在操练期间用于验证的图画 – 来自操练会合的一张。C。maxIterations:样式搬家模型可以运用的最大操练迭代次数。当您在 中设置迭代时,这将被疏忽。d。textelDensity:定义样式细节的粗细程度。e.styleStrength:指定样式对内容图画的影响程度。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

您将在以下部分中查看其间一些参数的影响。

modelParams最终,在同一方法后面增加以下代码:

// 4
guard let job = try? MLStyleTransfer.train(
    trainingData: dataSource,
    parameters: modelParams,
    sessionParameters: sessionParams) else {
    onCompletion(nil)
    return
}

MLStyleTransfer.train(trainingData:parameters:sessionParameters:)是一种可以做到这一切的方法!您将上面创立的参数和数据源传递给它。它返回一个用于处理操练效果的MLJob目标。

调用此方法会发动异步风格搬家模型操练会话。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

接下来,您将学习怎样运用操练的输出。

设备上模型生成

操练结束后,模型就可以运用了。现在你没有对创立的模型做任何事情。所以让咱们现在处理这个问题。

翻开MLModelTrainer.swift。然后将下面的代码增加到trainModel(using:validationImage:sessionDir:onCompletion:)方法的结尾:

// 5
let modelPath = sessionDir.appendingPathComponent(Constants.Path.modelFileName)
job.result.sink(receiveCompletion: { result in
    debugPrint(result)
}, receiveValue: { model in
    do {
        try model.write(to: modelPath)
        onCompletion(modelPath)
        return
    } catch {
        debugPrint("Error saving ML Model: (error.localizedDescription)")
    }
    onCompletion(nil)
})
.store(in: &subscriptions)

在这儿,一旦操练结束,您将运用Combine来获得效果。在receiveValue闭包中,您将获得通过操练的模型,咱们将其存储在文件体系中以供今后运用。

构建并工作。

当您工作运用程序时,为您的心爱宠物选择一张风格的图片和一张图片(假设您没有宠物,请在互联网上查找图片!)。然后您可以选择运用样式! 看看会产生什么。

留心:操练或许需求一段时间才华结束。调查 Xcode 控制台的发展。

即使已结束,您也不会看到宠物的程式化图画。可是,模型生成已结束。Xcode 控制台显现类似于以下内容的信息:

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

留心: 查看参阅部分的链接以了解有关各种丢掉方程的更多信息。您会留心到的一件事是,跟着迭代次数的增加,总丢掉会不断削减。总丢掉是内容丢掉和风格丢掉的总和。因而,总丢掉越少,模型的功率就越高。

这些设备生成重要数据。要查看它们,请从 Xcode 菜单中选择Window ▸ Devices and Simulators 。 现在,在Devices下选择您的设备,然后在Installed Apps下选择Petra。选择Actions按钮并选择Download Container,如下面的屏幕截图所示。******

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

将文件保存到您的 Mac。这或许需求一段时间才华下载,因而请确保等到下载结束。运用Finder导航到下载的文件,右键单击 —显现包内容以查看内部。内容如下所示:

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

导航到AppData ▸ Documents ▸ Session。每个会话将在此处创立一个文件夹,即每次您点击“运用样式”按钮时。

在每个会话的文件夹中,您将看到操练数据、各种元数据,最重要的是,生成的 CoreML 模型保存在文件名StyleTransfer.mlmodel下。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

从用户数据中学习

当您运用用户数据时,设备上学习的定制变得无限。因为灵感随时随地都会来袭,用户可以简略地摄影并用于造型。在这种情况下,个性化并不意味着失掉您的隐私,因为数据永久不用通过设备上的学习脱离设备。

从用户数据中学习可以改进效果。可是,操练集应该尽或许靠近预期的输入图画。假设用户有一只宠物猫,那么包含猫图画的操练集会产生更好的效果。

相同,因为照明和布景的差异,运用室内图画操练的模型在室外测验图画上或许表现欠安,如下所示。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

好的操练会带来好的学习。但在某些情况下,过多的迭代和过多的操练数据或许会导致过度拟合。这意味着该模型正在学习不适用于大多数情况的细微差别。在这种情况下,削减操练迭代会有所协助。

翻开Constants.swift文件并查看以下内容:

enum MLModelParam {
  static var maxIterations = 200
  static var styleDensity = 128 // Multiples of 4
  static var styleStrength = 5 // Range 1 to 10
}

模型操练运用此处定义的值。您将很快看到这些值怎样影响样式转化输出。

现在,转到MLModelTrainer.swift文件并找到下面的代码。

// 3
let modelParams = MLStyleTransfer.ModelParameters(
    algorithm: .cnn,
    validation: .content(validationImage),
    maxIterations: Constants.MLModelParam.maxIterations,
    textelDensity: Constants.MLModelParam.styleDensity,
    styleStrength: Constants.MLModelParam.styleStrength)

正如您之前看到的,您可以运用两种不同算法之一 –.cnn.cnnLite.根据 Apple 的文档:

  • cnn:一种风格搬运操练算法,可生成优先考虑图画质量而非速度的模型。
  • cnnLite:一种风格搬运操练算法,可生成将速度置于图画质量之上的模型。

运用这些参数,您将可以微调您的模型以获得更好的个性化。

不才一个课程中,您将充分利用模型和操练并实际设置图画样式。准备好?

风格敞开!

现在您已经有了一个完美的模型,可以运用它来生成您共同的宠物艺术。

翻开MLPredictor.swift并将方法的内容替换为predictUsingModel(_: inputImage: onCompletion:)以下代码。

// 1
guard
    let compiledModel = try? MLModel.compileModel(at: modelPath),
    let mlModel = try? MLModel.init(contentsOf: compiledModel)
else {
    debugPrint("Error reading the ML Model")
    return onCompletion(nil)
}
// 2
let imageOptions: [MLFeatureValue.ImageOption: Any] = [
    .cropAndScale: VNImageCropAndScaleOption.centerCrop.rawValue
]
guard
    let cgImage = inputImage.cgImage,
    let imageConstraint = mlModel.modelDescription.inputDescriptionsByName["image"]?.imageConstraint,
    let inputImg = try? MLFeatureValue(cgImage: cgImage, constraint: imageConstraint, options: imageOptions),
    let inputImage = try? MLDictionaryFeatureProvider(dictionary: ["image": inputImg])
else {
    return onCompletion(nil)
}

这儿产生了一些事情:

  1. 在您可以运用模型进行猜想之前,首要编译模型。然后将其初始化为MLModel目标。编译后的文件作为ModelName.mlmodelc保存在临时目录中。

留心mlmodel与编译后的文件比较,文件占用的空间更少mlmodelc。这是一种节省运用程序空间或从服务器下载模型的技术。

  1. 在这儿,您创立MLDictionaryFeatureProvider模型所需的字典以进行猜想。您还运用模型的束缚和选项格式化输入图画。您生成一个MLFeatureValue并传递给MLDictionaryFeatureProvider.

要最终生成风格化图画,请在这以后增加以下代码。

// 3
guard
  let stylizedImage = try? mlModel.prediction(from: inputImage),
  let imgBuffer = stylizedImage.featureValue(for: "stylizedImage")?.imageBufferValue
else {
  return onCompletion(nil)
}
let stylizedUIImage = UIImage(withCVImageBuffer: imgBuffer)
return onCompletion(stylizedUIImage)

这是该代码的作用:

  1. 调用该prediction(from:)方法执行单个猜想并输出MLFeatureProvider。然后从中提取生成的图画并从图画缓冲区创立一个UIImage实例。

瞧!这stylizedUIImage是与您的宠物图画混合风格的输出图画。

构建并工作。

点击运用样式! 选择宠物形象和风格后。与以前相同,该处理需求几分钟才华结束。之后,您现在应该在屏幕上看到效果:

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

只用几行代码就可以操练和生成风格化的图画,这不是很奇特吗?

留心:风格化的图画或许看起来被裁剪。这是因为它契合模型承受的尺度。.cropAndScale您像.centerCrop前面相同设置值imageOptions

等候!那不是悉数!假设效果达不到您的梦想,您可以对其进行微调。

您现在将看到调整操练模型的参数怎样影响效果。前往Constants.swift并找到MLModelParam枚举。在接下来的部分中,您将了解每一个的意义。随意玩数字并随时从头工作运用程序。

风格密度

样式密度也称为Textel Density。这控制了模型应该学习风格的大略或精密程度。当您运用更高/更低的值时,这会产生显着的风格化效果。

样式密度当时设置为 128,小于默认值 256。请留心,这应始终为 4 的倍数,举荐规模为 64 到 1024。

不才面的示例中,您可以看到样式密度怎样影响输出。

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

风格力气

较高的值会使模型学习更多的风格和更少的内容。较小的值学会做更少的样式。

在示例中,它设置为 5,这是默认值。它的规模可以从 1 到 10。

以下是它怎样影响您的效果的示例:

适用于 iOS 的 CreateML 教程:运用样式搬运创立自定义图画过滤器

请留心,当您设置会话参数时,模型参数中的maxIterations值将被疏忽。iterations

玩转迭代、样式密度和样式强度,为您的宠物打造一个讨人喜欢的模型。:]

就是这样!恭喜您结束了本教程并学习了怎样操练和运用 ML 模型进行风格搬家!

点击下载项目材料与查看原文

这儿也举荐一些面试相关的内容!

  • ① BAT等各个大厂iOS面试真题+答案大全

  • ② iOS中高档开发必看的抢手书籍(经典必看)

  • ③ iOS开发高档面试”简历制造”教导

  • ④ iOS面试流程到基础知识大全