本記事では、Lamaと呼ばれる機械学習手法を使って写真からの障害物を削除する方法をご紹介します。
Lamaとは
Lamaとは「Resolution-robust Large Mask Inpainting with Fourier
Convolutions」の略称で、Samsungの調査機関が発表した機械学習を用いた画像修復の手法です。
イメージをつかんでいただくために下記のGIFをご覧ください。
出典: https://github.com/saic-mdal/lama |
ご覧いただくと一目瞭然かと思います。
技術的には、削除範囲を指定し画像から除去
その後、Lamaの画像修復技術によって、削除した範囲を修復しています。
出典: https://arxiv.org/pdf/2109.07161v1.pdf |
Lamaの導入手順
セットアップ
それでは早速、開発環境にLamaをセットアップしていきます。
動作確認は下記の環境で行っています。
OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080
なお、GPU搭載のPCをお持ちでない場合は、以下からブラウザで動作確認することも可能です。
また、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。
おすすめの書籍
[初心者向け] Pythonで機械学習を始めるまでに読んだおすすめ書籍一覧
本記事では、現役機械学習エンジニアとして働く筆者が実際に読んだ書籍の中でおすすめの書籍をレベル別に紹介しています。
おすすめのオンライン講座
[初心者向け] 機械学習がゼロから分かるおすすめオンライン講座
本記事では、機械学習エンジニアとして働く筆者が、AI・機械学習をまったく知らない方でも取り組みやすいおすすめのオンライン講座をご紹介しています。
それでは、Lamaをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。
以上で、セットアップは完了です。
conda環境をymlに出力してくれているので非常に親切なプロジェクトですね。
画像修復
次に、セットアップした環境を利用して画像修復を実施します。
以上で学習済みモデルとテスト用画像、マスク画像が用意されました。
下記のディレクトリ構造になっているかご確認ください。
最後に、学習済みモデルを使って画像修復を実施します。
output
に予測結果となる画像が出力されます。
ぼんやりと人がいた部分にもやを感じますが、マスク画像に沿って人が削除された後、綺麗に画像が修復されています。
入力画像の作り方
先ほどの画像修復の結果をご覧いただくとわかりますが、入力画像にはmask画像が必要です。
以下に、mask画像の生成方法をご紹介します。
今回はパワーポイントを使って下記の画像のマスク画像を作っていきます。
対象画像をパワーポイントに貼り付け図形の「フリーフォーム:図形」を選択しマスクしたい箇所を囲みます
その後マスク対象の図形を白く塗りつぶします。
最後に、「図の書式設定」→「図の修正」→「明るさ:-100%、コントラスト:100%」にすると以下のような画像に仕上がります。
マスク画像生成時の注意点は以下の2点です。
-
マスク範囲は大きめに取る
マスクからはみ出た部分は削除されないため、残った障害物を基準に画像修復されます -
画像のサイズは合わせる
画像サイズが合っていないとマスクの範囲がずれます
今回は以下のような入力画像となります
この2つの画像を、「original001.png」、「original001_mask.png」のように、マスク画像のファイル名を「対象ファイル名_mask」に設定した後、先ほどの動作環境に配置して画像修正を実行します。
すると、自作のマスク画像を使って画像から障害物を削除できます。
このように、マスク画像さえ作成してしまえば、任意の画像の任意の対象を画像から削除できます。
トラブルシューティング
ModuleNotFoundError
Traceback (most recent call last): File "bin/predict.py", line 14, in
<module> from saicinpainting.evaluation.utils import move_to_device
ModuleNotFoundError: No module named 'saicinpainting'
saicinpaintingが読み込めていないことが原因
/lama/bin/predict.py
を修正
TypeError: load() missing 1 required positional argument: 'Loader'
インストールしたライブラリdaskのエラー
やや強引ではあるが下記修正
lama/lib/python3.6/site-packages/dask/config.py
RuntimeError: The NVIDIA driver on your system is too old
RuntimeError: The NVIDIA driver on your system is too old (found version
10010). Please update your GPU driver by downloading and installing a new
version from the URL: http://www.nvidia.com/Download/index.aspx
Alternatively, go to: https://pytorch.org to install a PyTorch version that
has been compiled with your version of the CUDA driver.
pytorch、cudatoolkitのバージョン不一致
cudatoolkitのバージョンを上げるか、pytorchのバージョンを下げる
以下は、pytorchのバージョンを下げる例
AttributeError: 'builtin_function_or_method' object has no attribute
'rfftn'
名称のconflictが原因
/lama/saicinpainting/training/modules/ffc.py
にrfftnのモジュールを明示的にimportすることで解消
まとめ
本記事では、Lamaを使った画像修復を紹介しました。
画像処理系の機械学習は出力結果が目で見てわかるものが多く知的好奇心をくすぐりますね。
また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。
また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。
参考文献
1. Resolution-robust Large Mask Inpainting with Fourier Convolutions
0 件のコメント :
コメントを投稿