画像処理
docker
TensorFlow
magenta

Magentaのdocker imageをmacbookで動かして画像変換したら真っ黒な画像が出てきた場合の対処法

やりたいこと

Magentaのプリセットで用意されているモデルを使って、モネ風の画像に変換する。

出来上がったもの

マシンスペックの関係で大きいファイルだと変換ができなかったので、以下の通り画像の一部分だけ切り取って変換しました

変換前
IMG_1337 2.jpg

変換後
all_monet_styles_0_100_1_100_2_100_3_100_4_100_5_100_6_100_7_100_8_100_9_100.png

すごい!完全にモネ!
これを実現するためにハマったポイントが以下の通りです。

ハマった現象

何度トライしても真っ黒な画像が出力されてしまいました。
実行時にエラーも出ず、心が折れてしまいそうになりました。

原因はCPUでTensorFlowを動かしていたから

ググると以下のissueにたどり着きました

Image stylization example only produces black images when run on CPU #570

MagentaはTensorFlowをバックエンドに使用しています。
TensorFlowは基本的にGPUの使用を前提にしているのですが、オプションとしてCPU上だけで処理をすることができます。
しかしMagentaのdocker imageの最新版( 0.1.13 )ではそのbug fix対応版が入っておらず、正常に動作しなかった結果、真っ黒な画像が出力されていました。

古いバージョンのdocker imageなら動かせた

私が動作させることができたバージョンは 0.1.6 でした。
操作手順は以下の通りです。

docker imageの取得と起動

$ docker pull tensorflow/magenta:0.1.6
$ docker run -it -p 6006:6006 -v /tmp/magenta:/magenta-data tensorflow/magenta:0.1.6

フォルダ構成

magenta-data
└── img
    ├── original ← ソースとなる画像ファイル置き場
    └── generated ← 生成された画像が吐き出されるディレクトリ

画像変換コマンド

$ image_stylization_transform \
      --num_styles=10 \
      --checkpoint=/magenta-models/multistyle-pastiche-generator-monet.ckpt \
      --input_image=/magenta-data/img/original/IMG_1337.jpg \
      --which_styles="{0:0.1,1:0.1,2:0.1,3:0.1,4:0.1,5:0.1,6:0.1,7:0.1,8:0.1,9:0.1}" \
      --output_dir=/magenta-data/img/generated/ \
      --output_basename="all_monet_styles"

ポイントとしては --checkpoint パラメータでプリセットのモデルファイルを指定すること、 --which_styles パラメータで、用意されているモデルのどれをどのくらいの割合で使うかという指定です。
詳しくはこちらの解説がわかりやすかったです。

参考

magenta/magenta/models/image_stylization at master · tensorflow/magenta
TensorFlowのMagentaで高速に画風変換してみた
写真をモネ風タッチに変換する(magenta image_stylization)