Build Image and Video Style Transfer models in Create ML
Machine Learning & AI 进阶 25m

在 Create ML 中构建图像和视频风格迁移模型

Build Image and Video Style Transfer models in Create ML

2020年6月24日

在 Apple 官方观看视频

一句话判断

Create ML 现在支持风格迁移了——不需要懂神经网络,拖几张风格图进去就能训练出一个能把照片变成油画风格的核心模型。

这场 Session 讲了什么

这场 Session 介绍了 Create ML 在 2020 年新增的 Style Transfer(风格迁移)模板。风格迁移是深度学习中一个经典应用——将一张图片的艺术风格应用到另一张图片的内容上。以前这需要自己搭建和训练神经网络,Create ML 将整个过程封装成了一个可视化的工具。

演讲者首先讲解了风格迁移的基本概念。训练数据需要两类图片:内容图片(你想要保留的照片内容)和风格图片(你想要应用的艺术风格)。模型会学习风格图片的纹理、色彩和笔触特征,然后将其应用到任意内容图片上。

Session 的核心部分通过一个完整的演示展示了工作流程:在 Create ML app 中选择 Style Transfer 模板、导入内容图片和风格图片、配置训练参数(风格强度、内容保留度)、启动训练、预览效果、导出 Core ML 模型文件。

一个重要更新是视频风格迁移的支持。导出的模型可以实时处理视频帧,在 iPhone 上以 30fps 的速度对每一帧应用风格效果。演讲者展示了如何使用 Vision 框架将风格迁移模型集成到视频处理管线中。

值得深挖的点

  • 风格强度与内容保留的平衡:训练参数中最重要的两个设置是 Style Loss Weight 和 Content Loss Weight。风格权重越高,输出越像目标风格(但可能丢失内容细节);内容权重越高,输出越保留原始照片(但风格感弱)。Apple 建议从默认参数开始,根据预览效果微调。
  • 实时视频风格迁移的性能:Create ML 的风格迁移模型使用了轻量化的网络架构,在 A13 Bionic 及以上的芯片上可以达到实时处理速度。但在旧设备上,帧率可能不够,需要考虑降级方案(如预渲染而非实时处理)。

代码片段

// 使用训练好的 Style Transfer Core ML 模型
import CoreML
import Vision

func applyStyleTransfer(to image: UIImage) -> UIImage? {
    guard let model = try? VNCoreMLModel(
        for: StyleTransferModel().model
    ) else { return nil }

    let request = VNCoreMLRequest(model: model) { request, error in
        guard let result = request.results?.first as? VNPixelBufferObservation else {
            return
        }
        // 获取风格化后的图像
        let styledImage = UIImage(pixelBuffer: result.pixelBuffer)
        self.displayResult(styledImage)
    }

    let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
    try? handler.perform([request])

    return nil
}
// 实时视频风格迁移
import AVFoundation
import CoreML

class StyleTransferVideoProcessor {
    private let model: VNCoreMLModel
    private var sequenceRequestHandler = VNSequenceRequestHandler()

    init() throws {
        let styleModel = StyleTransferModel()
        model = try VNCoreMLModel(for: styleModel.model)
    }

    func processFrame(_ sampleBuffer: CMSampleBuffer) -> CVPixelBuffer? {
        guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
            return nil
        }

        let request = VNCoreMLRequest(model: model)
        request.imageCropAndScaleOption = .centerCrop

        try? sequenceRequestHandler.perform(
            [request],
            on: pixelBuffer
        )

        if let result = request.results?.first as? VNPixelBufferObservation {
            return result.pixelBuffer
        }
        return nil
    }
}
// 在 AR 场景中应用实时风格迁移
import ARKit
import CoreML

class ARStyleTransferViewController: UIViewController {
    var arView: ARView!

    func applyStyleToARFrame() {
        guard let currentFrame = arView.session.currentFrame else { return }

        let capturedImage = currentFrame.capturedImage
        // 将 AR 相机帧通过风格迁移模型处理
        // 然后作为后处理效果叠加
        let styledFrame = styleTransferModel.prediction(
            from: capturedImage
        )
        // 更新 AR 场景的背景
    }
}

最佳实践

  • 训练时使用至少 100 张内容图片确保模型泛化能力
  • 风格图片 1-3 张即可,太多可能导致训练不稳定
  • 在目标设备上测试推理速度,确保满足实时需求
  • 为不同风格分别训练模型,避免一个模型混合多种风格
  • 使用 Create ML 的 Preview 功能在训练过程中实时查看效果,及时调参

还有什么值得关注

  • Create ML 后来在后续版本中增加了更多 ML 模板,包括 Object Tracking 和 Sound Classification
  • 如果你的应用需要同时支持多种风格,考虑使用多输出模型或动态加载
  • 搭配 “What’s new in Create ML” 一起看,了解 Create ML 的其他更新
WWDC 2020