アニメ変換をiPhoneでつかいたい -- CoreMLに変換すればOK


#AnimeGAN2-pytorchをiPhoneで使える形式に変換する方法です

<img src=https://user-images.githubusercontent.com/23278992/150662413-fe80b2aa-97c9-4f5b-83f9-1edee3739ea0.png width=512> <img src=https://user-images.githubusercontent.com/23278992/150662411-59d001be-d5a4-4c99-95db-b87e0562149f.JPG width=512>

変換ずみモデルを入手したい方はこちら：

https://github.com/john-rocky/CoreML-Models

アニメ変換機械学習モデルであるAnimeGAN2をiPhoneアプリで使えるようにします。

#AnimeGANはかっこいい、、でもPythonかあ。。。

アプリケーションでPythonのモデルを使うには、サーバーに画像をアップして処理したり、、、と大変そう。

#CoreMLに変換すればiPhone上でモデルを使える

CoreML形式なら、かんたんにAnimeGANをiPhoneアプリに組み込めます。

#手順

```shell
pip install coremltools
```

Torch-Hubからモデルをロードします。

```python
import torch

model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")
```

モデルを変換します。

```python
import coremltools as ct

example_input = torch.rand(1,3,512,512)
traced_model = torch.jit.trace(model, example_input)
mlmodel = ct.convert(traced_model, inputs=[ct.ImageType(name="input", shape=example_input.shape,bias=[-1,-1,-1],scale=2.0/255.0)])
```

モデルの出力形状は[1,3,512,512]です。
最初の１しかない次元は不要かつ、
画像出力にするには[3,512,512]の形状にしたいので、
最初の次元を削減する層を追加します。

```python
from coremltools.proto import FeatureTypes_pb2 as ft
spec = mlmodel.get_spec()
builder = ct.models.neural_network.NeuralNetworkBuilder(spec=spec)
builder.add_squeeze(name="squeeze", input_name="var_444", output_name="squeeze_out", axes = None, squeeze_all = True)
```

モデルの入力は -1 ~ 1 の範囲に正規化されていますので、
0 ~ 255 の範囲の値に戻すアクティベーション層を追加します。

```python
builder.add_activation(name="activation",non_linearity="LINEAR",input_name="squeeze_out",output_name="activation_out",params=[127.5,127.5])
```

モデルの出力名にアクティベーション層の出力名を明示的に指定します。
こうしないと、元のvar_444層からモデルの出力が出力されるままになってしまいますので、必要なステップです。


```python
from coremltools.proto import FeatureTypes_pb2 as ft
builder.spec.description.output.pop()
builder.spec.description.output.add()
output = builder.spec.description.output[0]
output.name = "activation_out"
```
モデルの出力タイプに画像を指定します。

```python
output.type.imageType.colorSpace = ft.ImageFeatureType.ColorSpace.Value('RGB')
output.type.imageType.width = 512 
output.type.imageType.height = 512
```

モデルを保存します。

```python
from coremltools.models.utils import save_spec
save_spec(builder.spec, 'animegan2.mlmodel')
```

#iOSでの使い方

Visionでリクエスト実行します。

```swift
let model = try! VNCoreMLModel(for: animegan().model)
let coreMLRequest = VNCoreMLRequest(model: model)

let handler = VNImageRequestHandler(ciImage: ciimage,options: [:])

try! handler.perform([coreMLRequest])

let result = request.results.first as! VNPixelBufferObservation
let uiimage = UIImage(ciImage: CIImage(cvPixelBuffer: result.pixelBuffer))
```

<img src=https://user-images.githubusercontent.com/23278992/150662414-9b78cd33-488d-45d6-a1b4-a05d12d196b1.png width=512> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e078f598-2d99-c96a-a3e3-56ffe9f4cd1a.jpeg width=512>
<img src=https://user-images.githubusercontent.com/23278992/150662416-739480b3-a132-4978-99b2-0c1a8882e485.png width=512> <img src=https://user-images.githubusercontent.com/23278992/150662409-0c2561df-0079-4cc1-80c4-03b04f2cbfde.JPG width=512>

完全なコンバートスクリプトはこちらにもあります。

https://github.com/john-rocky/CoreML-Models

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)