3
2

More than 3 years have passed since last update.

Create MLの新機能Style Transfer(WWDC2020,iOS14).

Last updated at Posted at 2020-07-23

WWDC2020の新機能を試す

Create MLに初の画像出力モデルStyle Transferが追加されました。
これがなかなか、痒いところに手が届く便利な機能がついています。

スクリーンショット 2020-07-23 8.21.50.png
Jul-23-2020 08-06-56.gif

Videoをスタイル変換できる高速モデルも追加されています。

手順はシンプル

・スタイル画像1枚
・トレーニング経過チェックのための検証画像1枚
・コンテンツ画像複数枚
を用意します。
Trainボタンで学習が開始、数分で完了します。

便利なところ

計算回数、スタイル適用の強度(Strenth)、密度(Density)が指定できます

・計算回数…デフォルトの500でだいたいそれらしくスタイル変換されました。
ただ、多めに計算した方が綺麗な結果が出る(ような気がします)。添付したGIFは1200iterations。それでも10分で終わります。
強度を高めると、色、エッジともにスタイル画像の影響が大きくなります。
密度を高めると、スタイル画像の細い領域のパターンを適用し、弱めると広い領域のパターンを適用します。
画像左から、
*(強度5,密度5:デフォルト) / (強度10,密度5) /(強度5,密度10)*Videoモデル
スクリーンショット 2020-07-23 10.10.16.png

中間画像結果を細かく確認できます

学習中5iterationごとに中間画像を表示してくれます。

中間モデルを細かく保存できます

Snapshotボタンを押すと、学習途中のモデルを保存できます。
途中経過を見比べて選定したいときに便利です。

プリセットのコンテンツ画像があります

Natural Content Datasetsという600枚の風景画像がダウンロードできます。

軽量モデルです

Videoモデルが595KB
Imageモデルが6.5MB
でした。

VideoモデルとImageモデルのちがい。

・Imageモデルはトレーニングの収束も10倍ぐらいかかります(と言っても数分の違いですが)。
結果の綺麗さのちがいは僕はわかりませんでした。(Google Drive:左ビデオモデル:右画像モデル)
・UIViewでパラパラビデオにしてみると、やはりVideoの方が滑らかでした。
Capture Outputを食わせた時のCPUUsageは、ビデオが10〜20%、イメージが10弱でイメージの方が小さいですが、
メモリ使用がビデオ60MB、イメージ250MBとイメージが4倍大きかったです。
(iPod Touch使用)

感想

GUIで結果もすぐ見れるので、オプションを調整したり画像を変えたり、いろんなスタイルを試すのがたのしくなりました。

iOSプロジェクトでモデルを使う

モデルは入出力ともに512pixelのColor Imageです。
従来通りVisionのVNCoreMLRequestで処理できます。
AVFoundationのCapture OutputをCMSampleBufferGetImageBufferして入力にしています。
結果はPixelBufferです。

ViewController.swift
    lazy var coreMLRequest:VNCoreMLRequest = {
        let model = try! VNCoreMLModel(for: windStyle().model)
        let request = VNCoreMLRequest(model: model, completionHandler: self.coreMLCompletionHandler0)
        return request
    }()
ViewController.swift
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
                return
            }
            currentBuffer = pixelBuffer

            let exifOrientation = exifOrientationFromDeviceOrientation()
            let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer:currentBuffer!, orientation: exifOrientation, options: [:])
            do {
                try imageRequestHandler.perform([self.coreMLRequest])
            } catch {
                print(error)
            }
    }

Videoとして高速でレンダリングするにはMetalとかを使わないといけないと思うので、以下の記事を参考にしてください。

Qiita:Metalでカメラからの動画入力をリアルタイム処理する

ぼくはMetalを勉強せず、UIViewでパラパラVideoにしました。
Capture Output全部食わせてもcpu使用率10%とかだったので、モデル処理は軽量なのだと思います。
UIViewで描画した動画です(GoogleDrive:最初にカッコつけたGIF貼って容量超えたので貼れなくなりました)。興味ある方はどうぞ。

・・・

機械学習関連の情報を発信しています。
https://twitter.com/JackdeS11

Core MLやCreate ML、Visionを使ったアプリを作っています。
rockyshikoku@gmail.com

            ↓

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2