スマホやデジカメをつかって写真や動画を撮ると思いますが、いい写真が撮れたと思ったら余計なモノも一緒に写ってしまった😞なんてことはよくあると思います。今回はディープラーニングをつかってそれらを消してしまうInpaintingをやってみようと思います👍
Inpaintingは色んなところで使われています。
Pixel 6(2021年googleより発売)に「消しゴムマジック」という新機能がつきました。この仕組みはどうなっているかわかりませんが、おそらくディープラーニングでしょう。
Adobe Photoshopでも同じようなことができるようです。「コンテンツに応じた塗りつぶしワークスペース」というみたいです。こちらも数秒待つことで消えるらしいのでディープラーニングでしょうか。
これと同じようなことをやってみようと思います👍↓こんな感じです。
Inpaintingの動画もつくってみました。詳しくは↓をご覧ください。これは光学迷彩です😎
コード
参考にした論文はgoogleの方の論文です 「Free-Form Image Inpainting with Gated Convolution Jiahui Yuら」。DeepFillv2と呼ばれるモデルです。
アルゴリズムについては、qiitaで詳しく説明されている方がいて参考にさせていただきました↓併せてご覧ください。
環境設定関連
ローカル環境でGPUをつかって実装していきます。CUDA toolkit関連セットアップが分からない場合はこのサイトに細かく掲載されていますので確認してみてください。
PC環境
- OS : Windows 10
- CPU : AMD Ryzen7 5800
- メモリ : 16GB
- GPU : GeForce RTX3070 8GB
CUDA関連
- CUDA : 11.4
- cuDNN:8.2
Python
- Python 3.7.10
ライブラリ
- tensorflow-gpu 2.6.0※
- neuralgym 0.0.1※ (pip install git+https://github.com/JiahuiYu/neuralgym でインストールできます)
- その他必要に応じて
※GithubのコードはTensorFlow 1.3.0, 1.4.0, 1.5.0, 1.6.0, 1.7.0でテストされているようなので、そちらでの実装をオススメします。私の環境ではTensorFlow1.xが動かなかったので、TensorFlow2.6で強引に実装しています。 TensorFlow1.x→2.xへの コードの変換は↓を参考にしてください。contribは自動変換されませんので手動で直しました🤢
Inpainting(DeepFillv2)をつかってみる
学習するのは大変なので、今回は事前学習済み重みデータをつかっていきます。やり方はGithubに沿って実施していきます。
と言っても簡単で以下のみでOKです。
- Pretrained modelsに記載されているリンクより事前学習済みデータをダウンロード
- 作業ディレクトリへmodel_logsディレクトリを作成し、ダウンロードしたファイルを移動
- AnacondaPromptなどで上記のライブラリをインストールし以下のコードを実行
python test.py --image examples/places2/case1_input.png --mask examples/places2/case1_mask.png --output examples/places2/case1_output.png --checkpoint model_logs
オリジナルの画像でやってみる
- まずは画像を準備します。準備する画像は2種類、オリジナル画像と、消したい部分を白塗りしたマスク画像(.png)です。マスク画像は消したい部分以外は透明に設定してください。画像のサイズですが、事前学習済みデータが256x256pixelで学習したモデルのようで、大きすぎると劣化する可能性があります。適度に調節してください。
- 作業ディレクトリ下へdataディレクトリを作成し準備した2種類の画像を移動させてください。
- AnacondaPromptなどで↓の画像名を変更しコードを実行してください。
python test.py --image data/インプット画像名.png --mask data/#マスク画像名.png --output data/#アウトプット画像名.png --checkpoint model_logs
車が消えました。少し違和感ありますが路面のラインもそれとなく再現されているのが凄いです👍
いろいろな画像で試してみる
この前、札幌で食べたスープカレーです。よく見てもらうとピーマンが消えています。食べちゃったわけではありませんよ😅
話は逸れますが札幌のスープカレーは絶品なので皆さん試してみてください↓ピカンティ、マジスパ、らっきょは鉄板です😋
ソフトクリームを消してみました。違和感がありますが机の木目を補間しています。コーンの部分もうまいこと表現されていてGOODです。
電線の影や人が主張していたので消してみました。これもいい感じに消せています。
特に看板を消した跡に格子が復元されているのが凄い驚きです😲
トマトを消してみます。マスク画像に前の記事でつくったセマンティックセグメンテーションモデルの推定画像をつかってみます(白塗り加工はやりました)。ちょっと違和感ありますが消せました。こんな感じに他のディープラーニングモデルと組み合わせると面白いですね。
今回はInpaintingを試してみました。思ったより良く消えたので他にもいろいろ試してみようと思いました。皆さんも是非やってみてください😄
今日も良いディープラーニングライフを👍
関連図書
ディープラーニングをやってみようかな😎という人にオススメな書籍を紹介します。
コメント