【アーティストになりたい】画風変換とセグメンテーションを組み合わせて作品(?)をつくる

アートという自己表現で食べていくのって個人的にとても憧れがあります。アーティストになりたい。

コンピュータビジョンのアート領域の研究に画風変換というものがあり、楽に試すことができましたので、メモを残しておこうと思います。

おしながき

・画像を用意する

・山男を画風変換する

・GIFアニメーションを作成する

・セグメンテーションを活用して、背景だけ画風変換する

画像を用意する

 

こちらから画像を取得します

https://unsplash.com/photos/-87JyMb9ZfU

画像サイズが大きいので、1200 × 800 にリサイズをしておきます。

 

今回は Google Colab でやりましたので、colabを開いて、sample_mountain.jpg という名前でアップロードをします。

 

画像のサイズの情報も後で使うため取得しておきます。

画像サイズが大きすぎた場合は、1/2や1/3にしてやります。

 

山男を画風変換する

 

はじめに、ColabでどのGPUが割り当てられているか確認をしておきます。

Tesla K80 が多いですが、K80だとこのサイズの画像で処理を回そうとするとメモリが足らなくて処理が走らないことがあります。

P100 でした。K80の場合でうまく走らなかったら、画像サイズを小さくするか、GPUガチャを回しましょう。Colab Pro の日本版が待ち遠しいです。

 

こちらのレポジトリを使わせてもらいます。https://github.com/titu1994/Neural-Style-Transfer

画風変換のアルゴリズムは少しだけ調べたところ以下のようなものがあるようです。

・任意のスタイル画像で変換できるが、1枚ごとに学習を行うため時間がかかる

・スタイル画像は学習済みのもの以外は使用できないが、変換(推論)は早い

GANを使うものはまだ調べてないですが、どんな感じなんだろう。

今回は、前者の任意のスタイル画像を使えるものを試します。

 

 

ハイパーパラメータを設定します。vgg19の中間の様々な特徴をとってきて、content loss と style loss を計算して、トータルのロスが小さくなるように学習していくようです。Max Pooling でなく Average Poolingにするとよくなるといった研究もあるそうで、POOLING_TYPEで選択できるみたいです。

CONETNT_IMAGE(変換したい画像)と STYLE_IMAGE(スタイル画像)のパスを設定します。スタイル画像は、レポジトリ内に用意されていた candy-style というものを使用します。レポジトリ内の他の選択肢としては、ここ を見るとよいです。また、wikiart のページでは様々な有名な絵画を見ることができます。

変換は、.pyスクリプト実行すると開始します。

 

これで、generated フォルダ内に、各毎の変換pngファイルが格納されます。

今回は10イテレーション回しているので、10個出てきます。

 

一番最後のものだけ確認します。

異次元の空間に紛れ込んだ感じになりました。

 

GIFアニメーションを作成する

せっかくなので、変換過程のGIFアニメーションを作成してみようと思います。

generated フォルダ内に 10 枚の変換過程の画像があります。

sample_mountain.jpg を generated フォルダに移動し、ソートをかけて正しい順番になるように名前を調整します(01_~~, 02_~~ みたいにします)

参考:https://qiita.com/hiro9/items/222bea3e77dfed235f0a

 

元画像は jpg 拡張子ですが、変換後画像は png ですので、*.png としないように注意します。

 

セグメンテーションを活用して、背景だけ画風変換する

 

このレポジトリでは、マスク画像を用意してあげるとマスクされた部分だけ画風変換する、なんていうこともできるようです。

というわけで、人の部分と背景の部分でわけたマスク画像を取得して試してみたいと思います。

 

torchvision の 学習済み deeplabv3 を持ってきてマスク画像を取得します。

 

できたものについて、2値化を行います。

 

mask_person.jpg : 人が0, 背景が255 のマスク画像

mask_back.jpg:人が255, 背景が0 のマスク画像

人だけ変換、背景だけ変換、と両パターンためせるように2種類マスク画像を用意しておきます。

 

変換は、レポジトリで用意されている、 mask_transfer.py で実行できます。

ImportError: cannot import name ‘imread’

と出てきたら、scipy のバージョンの問題なので、 !pip install scipy==1.1.0 としてから実行し直します。

generated フォルダ内に画像が出力されます。

なんだかちぐはぐな感じ担ってしまいました。センスが欲しい。

 

最後まで読んで頂きありがとうございました。