リアルな画像を生成する機械学習モデルをiOSでつかう
「この人物は存在しない」というWebページをご存知ですか?
このページにアクセスすると、高画質の人物写真が表示されます。
リロードすると別の人物が表示されます。これらの人物は、存在しません。
StyleGANという機械学習技術によって生成された画像です。
この記事では、StyleGANをiOSでつかって、かんたんに架空の人物画像を生成する方法を示します。
超強力画像生成、しかしiOSで使えるのか。。。
StyleGANは人物の顔だけでなく、絵画やアニメの画像も生成できます。
もしもiOSで扱えたら、楽しいアプリができそうです。
しかし、StyleGANは2010年代後半に発表された技術ですが、これまで(僕の知る限りですが)iOSで使えた事例はあまり見かけませんでした。
Webサーバーで実行して、というのはあるのですが、もし端末上で実行できれば、通信も必要なく、速い。
モデルが大きすぎたり、
構造がなんか複雑そうだったり
というのがネックだったのではないかと僕は想像します。
MobileStyleGANが現れた
2021年、モバイル用に軽量化されたMobileStyleGANが登場しました。
このモデルはかんたんにCoreML形式に変換でき、iOSでつかうことができます。
38MBという軽量サイズ(量子化前)、生成に1秒程度しかかかりません。
これなら、iPhoneでの使用にじゅうぶん耐えられると思います。
具体的手法
1、モデルを取得する
PlanA:
MobileStyleGANのリポジトリのCoreMLエクスポートスクリプトを実行すると、CoreMLモデルが取得できます。
出力は多次元配列(1024*1024 MLMultiArray)です。
PlanB:
CoreML-Modelsから変換ずみのMobileStyleGANのCoreMLモデルがダウンロードできます。
出力は画像(1024*1024 CVPixelBuffer)です。
2、画像生成
Swiftでモデルを実行する
MobileStyleGANはMappingNetworkとSynthesisNetworkの二つのネットワークで構成されています。
[1, 512]のランダムシードを作成し、マッピングネットワークに渡します。
マッピングネットワークの出力をシンセシスネットワークに渡します。
// Mapping
let mappingNetwork = try mappingNetwork(configuration: MLModelConfiguration())
let input = try MLMultiArray(shape: [1,512] as [NSNumber], dataType: MLMultiArrayDataType.float32)
for i in 0...input.count - 1 {
input[i] = NSNumber(value: Float32.random(in: -1...1))
}
let mappingInput = mappingNetworkInput(var_: input)
let mappingOutput = try mappingNetwork.prediction(input: mappingInput)
let style = mappingOutput.var_134
// Synthesis
let synthesisNetwork = try synthesisNetwork(configuration: MLModelConfiguration())
let synthesisInput = synthesisNetworkInput(style: style)
let output = try synthesisNetwork.prediction(input: synthesisInput)
Xcodeサンプルプロジェクトを使って画像を生成する
MobileStyleGANをiOSでつかうサンプルプロジェクト
フォトライブラリから画像を選んでモデルを実行するかんたんなサンプルです。
Githubからクローンしてビルドすると、ボタンを押して顔画像を生成できます。1枚1秒程度で生成します。
おもしろいアプリができたらいいな
512のランダムシードから画像を生成するので、3 * 10の1000乗 通りぐらいのパターンの画像が作れると思います(あってるかな?)。
MobileStyleGANをつかってiPhoneで生成した画像
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。