Anime2SketchをColaboratoryで試してみた（静止画のみ）

## はじめに
いまさらですが、ColaboratoryでAnime2Sketchを試してみました。本記事は手っ取り早く試すための備忘録的なもので、理論に関しては触れていません。Colaboratoryを使えることが前提ですので、Colaboratoryの使用方法がわからない場合は、[Webの無料のサービス](https://gradio.app/g/AK391/Anime2Sketch)があるのでそちらを利用してください

![res_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/09c8d706-cffc-4ac8-7ff1-56ff40ab98f1.png)

## Anime2Sketchとは
Anime2Sketchは、イラストやアニメアート、マンガ用のスケッチ画作成ツールです。
["Adversarial Open Domain Adaption for Sketch-to-Photo Synthesis"](https://arxiv.org/pdf/2104.05703.pdf)をベースにしたアプリケーションとのことで**[MIT License](https://ja.wikipedia.org/wiki/MIT_License)**としてリリースされています。

## 準備
Colaboratoryにアクセスし、ノートブックを新規作成
ランタイムをGPUに変更し接続
[Xiaoyu XiangさんのGitHub](https://github.com/Mukosame/Anime2Sketch)よりプロジェクトをクローン

```
!git clone https://github.com/Mukosame/Anime2Sketch.git
```
フォルダの変更

```
%cd Anime2Sketch
```
事前学習済みデータがGoogleDriveに公開されているのでgdownでダウンロード

```
import gdown

url='https://drive.google.com/uc?id=1RILKwUdjjBBngB17JHwhZNBEaW4Mr-Ml'
output='./weights/netG.pth'
gdown.download(url, output, quiet=True)
```
## 実行
test.py を参考に作成

```
from data import get_image_list
from model import create_model
from data import read_img_path, tensor_to_img, save_image

gpu_ids = [0]

model = create_model(gpu_ids)
model.eval()
```

繰り返す場合は、以下のセルのみ実行
test.pyでは、test_samplesに保存された画像すべてが変換されますが、ここでは指定のファイルのみとしています

```
load_size = 512

test_path = "test_samples/madoka.jpg"
aus_path = "./res.png"

img,  aus_resize = read_img_path(test_path, load_size)
aus_tensor = model(img)
aus_img = tensor_to_img(aus_tensor)
save_image(aus_img, aus_path, aus_resize)
```
処理結果は、res.pngとして保存しており、ローカルマシンへのダウンロードや自分のGoogleDriveをマウントしてそこにコピーできます


## ハイパーパラメータ
内部処理で、オリジナルの画像のサイズを変換前に512x512に変更し、保存前にもとの画像のサイズに戻しています
変換対象の画像サイズが大きい場合、512x512では結果がぼやけてしまいます、
シャープなエッジが必要な場合、load_size = 512を 768, 1024等に変更してみてください
接続直後では、load_size = 4096まで成功しています

## 処理結果
#### 例１
オリジナル画像　996x634
![girls.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/fb552d80-756d-cdce-3fe8-02192f617eee.jpeg)

load_size 512
![res_512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/5f5fba86-e6a6-42ed-d78f-56ed9d2d1594.png)

冒頭の画像は、load_size 4096で処理
#### 例2
ジブリ公開画像 totoro029　1920 x 1038
![totoro029](https://www.ghibli.jp/gallery/totoro029.jpg "totoro029")

load_size 512
![totoro029_512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/a8e04e4d-e89f-81ce-2be5-710d64b7d972.png)

load_size 4096
![totoro029_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/8515e8df-2bf8-43c6-bce1-882d9d37abeb.png)

#### 例3
細かい画像は苦手みたいなので背景がシンプルなもの
ジブリ公開画像 porco028　1920 x 1038
![porco028](https://www.ghibli.jp/gallery/porco028.jpg "porco028")

load_size 512
![porco028_512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/719c645f-46bb-091a-797e-a3bde8e09641.png)

load_size 4096
![porco028_4096.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975328/9115b5fa-667e-85a7-8bdf-ea00cbc2120b.png)

## issue
パイパーパラメータを変更して何度か試しているとCudaのOut Of Memoryが生じます
<font color="Red">RuntimeError: CUDA out of memory</font>
その場合は、ランタイムを再起動して、再度cellを実行する必要があります。

Cudaメモリ操作用のなんらかのまじないがあるかもしれません

## 参考
[イラストを線画に変換する「Anime2Sketch」が登場](https://gigazine.net/news/20210507-anime2sketch/)