Inpaintingで画像の一部を消してみた【消しゴムマジック】

AI実装

スマホやデジカメをつかって写真や動画を撮ると思いますが、いい写真が撮れたと思ったら余計なモノも一緒に写ってしまった😞なんてことはよくあると思います。今回はディープラーニングをつかってそれらを消してしまうInpaintingをやってみようと思います👍

Inpaintingは色んなところで使われています。

Pixel 6(2021年googleより発売)に「消しゴムマジック」という新機能がつきました。この仕組みはどうなっているかわかりませんが、おそらくディープラーニングでしょう。

Adobe Photoshopでも同じようなことができるようです。「コンテンツに応じた塗りつぶしワークスペース」というみたいです。こちらも数秒待つことで消えるらしいのでディープラーニングでしょうか。

コンテンツに応じた塗りつぶしワークスペース
引用:Adobe Photoshop
https://helpx.adobe.com/jp/photoshop/using/content-aware-fill.html

これと同じようなことをやってみようと思います👍↓こんな感じです。

オリジナル画像 / Inpainting画像

Inpaintingの動画もつくってみました。詳しくは↓をご覧ください。これは光学迷彩です😎

コード

参考にした論文はgoogleの方の論文です 「Free-Form Image Inpainting with Gated Convolution Jiahui Yuら」。DeepFillv2と呼ばれるモデルです。

Free-Form Image Inpainting with Gated Convolution
We present a generative image inpainting system to complete images with free-form mask and guidance. The system is based on gated convolutions learned from mill...
GitHub - JiahuiYu/generative_inpainting: DeepFill v1/v2 with Contextual Attention and Gated Convolution, CVPR 2018, and ICCV 2019 Oral
DeepFill v1/v2 with Contextual Attention and Gated Convolution, CVPR 2018, and ICCV 2019 Oral - GitHub - JiahuiYu/generative_inpainting: DeepFill v1/v2 with Con...

アルゴリズムについては、qiitaで詳しく説明されている方がいて参考にさせていただきました↓併せてご覧ください。

【AI】Deep Learning for Image Inpainting - Qiita
はじめにどれも良い画像ですね。しかし、実はこれらは元々この世に存在しない画像で、オリジナル画像は以下です。今回はこのような応用を可能にする「Image Inpainting」をやって行きたいと…

環境設定関連

ローカル環境で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

オリジナルの画像でやってみる

  1. まずは画像を準備します。準備する画像は2種類、オリジナル画像と、消したい部分を白塗りしたマスク画像(.png)です。マスク画像は消したい部分以外は透明に設定してください。画像のサイズですが、事前学習済みデータが256x256pixelで学習したモデルのようで、大きすぎると劣化する可能性があります。適度に調節してください。
オリジナル画像
マスク画像
  1. 作業ディレクトリ下へdataディレクトリを作成し準備した2種類の画像を移動させてください。
  2. AnacondaPromptなどで↓の画像名を変更しコードを実行してください。
python test.py --image data/インプット画像名.png --mask data/#マスク画像名.png --output data/#アウトプット画像名.png --checkpoint model_logs

Inpainting画像

車が消えました。少し違和感ありますが路面のラインもそれとなく再現されているのが凄いです👍

いろいろな画像で試してみる

オリジナル画像 / Inpainting画像

この前、札幌で食べたスープカレーです。よく見てもらうとピーマンが消えています。食べちゃったわけではありませんよ😅

話は逸れますが札幌のスープカレーは絶品なので皆さん試してみてください↓ピカンティ、マジスパ、らっきょは鉄板です😋

オリジナル画像 / Inpainting画像

ソフトクリームを消してみました。違和感がありますが机の木目を補間しています。コーンの部分もうまいこと表現されていてGOODです。

オリジナル画像 / Inpainting画像

電線の影や人が主張していたので消してみました。これもいい感じに消せています。

オリジナル画像 / Inpainting画像

特に看板を消した跡に格子が復元されているのが凄い驚きです😲

オリジナル画像 / Semantic segmentation結果 / Inpainting画像

トマトを消してみます。マスク画像に前の記事でつくったセマンティックセグメンテーションモデルの推定画像をつかってみます(白塗り加工はやりました)。ちょっと違和感ありますが消せました。こんな感じに他のディープラーニングモデルと組み合わせると面白いですね。

今回はInpaintingを試してみました。思ったより良く消えたので他にもいろいろ試してみようと思いました。皆さんも是非やってみてください😄

今日も良いディープラーニングライフを👍

関連図書

ディープラーニングをやってみようかな😎という人にオススメな書籍を紹介します。

コメント

タイトルとURLをコピーしました