#WWDC2020の新機能を試す
Create MLに初の画像出力モデルStyle Transferが追加されました。
これがなかなか、痒いところに手が届く便利な機能がついています。
Videoをスタイル変換できる高速モデルも追加されています。
#手順はシンプル
・スタイル画像1枚
・トレーニング経過チェックのための検証画像1枚
・コンテンツ画像複数枚
を用意します。
Trainボタンで学習が開始、数分で完了します。
#便利なところ
####計算回数、スタイル適用の強度(Strenth)、密度(Density)が指定できます
・計算回数…デフォルトの500でだいたいそれらしくスタイル変換されました。
ただ、多めに計算した方が綺麗な結果が出る(ような気がします)。添付したGIFは1200iterations。それでも10分で終わります。
・強度を高めると、色、エッジともにスタイル画像の影響が大きくなります。
・密度を高めると、スタイル画像の細い領域のパターンを適用し、弱めると広い領域のパターンを適用します。
画像左から、
*(強度5,密度5:デフォルト) / (強度10,密度5) /(強度5,密度10)*Videoモデル
####中間画像結果を細かく確認できます
学習中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です。
lazy var coreMLRequest:VNCoreMLRequest = {
let model = try! VNCoreMLModel(for: windStyle().model)
let request = VNCoreMLRequest(model: model, completionHandler: self.coreMLCompletionHandler0)
return request
}()
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://drive.google.com/file/d/1GDOS-5dXXMTDl4D5ph3TlhkvSUkltVXy/view?usp=sharing)
・・・
機械学習関連の情報を発信しています。
https://twitter.com/JackdeS11
Core MLやCreate ML、Visionを使ったアプリを作っています。
rockyshikoku@gmail.com
↓