スマートフォンで手軽に写真を撮れる現代において、写真の質はますます重要になっています。しかし、せっかくの思い出写真がノイズやブレで台無しになってしまったら、どうしましょう?
そんな写真のお悩みを解決してくれるのが、AI技術を用いた画像復元技術です。近年、この分野では目覚ましい進歩が遂げられており、有料サービスがいくつも登場していますが、ほとんどがサブスクで数千円程度の課金が必要となります。
そこで、今回は PythonとNAFNet を用いて、画像のノイズとブレを除去する方法について紹介したいと思います。もし自宅のPCにGPUを搭載しているなら、是非この記事を読んでトライしてみてください。
NAFNetとは
NAFNet(Nonlinear Activation Free Network)は、2022年に発表された画像復元のためのAI技術です。従来の画像復元技術と比べて、以下の点で革新的な特徴を持っています。
1. 高精度な復元性能
NAFNetは、AIの中でも高い学習能力を持つ畳み込みニューラルネットワーク(CNN)の一種であるViTと、効率的な計算処理を実現する**Gated Linear Unit (GLU)**を組み合わせることで、従来の技術を凌駕する精度で画像を復元することができます。特に、画像のノイズ除去とブレ(ぼやけ)除去において顕著な効果を発揮します。
2. シンプルな構造
NAFNetは、非線形活性化関数を排除したシンプルな構造を持つ点が特徴です。このシンプルな構造により、計算処理が効率化され、処理速度が向上するだけでなく、モデルの理解や改変が容易になります。
3. 軽量モデル
NAFNetは、計算量が少ない軽量モデルとして設計されています。そのため、高性能なGPUを搭載していないスマートフォンやタブレットなどの端末でも、快適に動作させることができます。
4. 幅広い応用例
NAFNetは、写真以外にも、古い写真の修復、天体写真のノイズ除去、医療画像の処理など、幅広い分野で応用することができます。
NAFNetの公式サイト
NAFNet の概要とソースコードは、Git上にある NAFNet 公式ページに掲載されています。本記事では、ここに記載されいている内容をできるだけわかりやすく解説したものになります。
https://github.com/megvii-research/NAFNet
インストールの前提条件
NAFNet のページでは、インストール方法が簡単に記載されていますが、2022年4月時点の内容であるため、このまま実行してもうまく動作しません。各モジュールを2022年当時のものに合わせる必要があります(詳細は後述)。
Python/CUDAのバージョン
動作に必要な環境は次の通りです。
必要な環境・ライブラリ | バージョンなど | 備考 |
---|---|---|
Python 環境 | Python 3.9.5 | |
Git 環境 | その時の最新版 | |
Pytorch | 1.11.0 | |
CUDA Toolkit | 11.3 | CPUで動かすならインストール不要 |
インストール手順の概要
次の手順でインストールを行います。
Step1 Python動作環境の構築 | ①Python 3.9.5の環境準備 ②Gitの環境準備 ③CUDA Toolkit 11.3のインストール ④Microsoft Visual C++ 2015 再頒布可能パッケージのインストール ⑤Microsoft Visual Studio 2022 ビルド ツールのインストール ⑥Pytorchのインストール |
---|---|
Step2 NAFNetのインストール | GitHubからNAFNetをインストール後、requirements.txt を修正したのち、各種モジュールをインストール |
Step3 各種モデルのインストール | Google Drive に公開されている学習済みモデル3個をダウンロードし 所定のフォルダにコピー |
インストール手順
Step1.Python動作環境の構築
「【最初の一歩】生成AI向けPython環境構築手順(スクリーンショットで解説)」の記載内容(①②③、⑤⑥)を実行してください。
Python環境構築手順の①~③、⑤~⑥をインストールしてください。
④cuDNN のインストール、⑦FFMPEGのインストールは不要です(使わないだけなので、インストールしても差し支えはありません)。
上記の手順で作成したPython環境において、次のコマンドを実行します。
python.exe -m pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113
Step2.NAFNetのインストール
あらかじめ、NAFNet をインストールするための任意のフォルダを作成しておきます。今回は、Oドライブの直下に NAFNetというフォルダを作成しました。
まず、コマンドプロンプトを開き、インストールしたいフォルダ(今回はOドライブ直下のNAFNetフォルダ)に移動し、次のコマンドを実行します。
git clone https://github.com/megvii-research/NAFNet
NAFNetのモジュールがインストールに成功したら、次のコマンドを実行してください。
cd NAFNet
notepad requirements.txt
メモ帳が開き、requirements.txt が編集可能状態になりますので、モジュールのバージョンを指定するよう書き換えます。
変更前:requirements.txt
変更後:requirements.txt
既存の中身を削除し、下記の内容を張り付けて保存してください。
addict
future
lmdb
numpy==1.21.6
opencv-python==4.5.1.48
Pillow
pyyaml
requests
scikit-image==0.19.3
scipy==1.6.2
tb-nightly
tqdm
yapf
今編集した requirements.txt を使って モジュールのインストールを行います。次のコマンドを実行してください。
pip install -r requirements.txt
python setup.py develop --no_cuda_ext
python setup.py develop --no_cuda_ext となっていますが、これを実行することで PytorchがCUDAを使うために必要なC++のソースコード(deform_conv_cuda.cpp)が所定フォルダにダウンロードされ、ビルドされます。そして、ノイズ削減やブレ削減のコマンド実行時、GPUが使われるようになります。
Step3.各種モデルのインストール
モデルは公式ページを少しスクロールしたところにダウンロードリンクがあります。
NAFNet-SIDD-width64(ノイズ除去モデル) と NAFNet-REDS-width64(ブレ除去モデル) は、以下の画面が表示されますので、「Download」ボタンをクリックします。
NAFSSR-L_4x (高解像化モデル)は次の画面が表示されるので、上部のダウンロードアイコンをクリックします。
ダウンロードした3つのモデルファイルを、次のフォルダ(pretrained_modelsフォルダ)にコピーしましょう。
以上でモデルのインストールは完了です。
NAFNet デモプログラムの起動方法
コマンドプロンプトを開き、NAFNetをインストールしたフォルダの直下に移動したあとで、デモプログラム(後述)を実行します。
デモプログラムが出力するフォルダ
デモプログラムは、demo フォルダの中の所定のファイルを読み込んで、同じ場所に結果を出力します。demoフォルダには結果のファイルが含まれているため、デモを実行するまえに削除しておきましょう。
ノイズ除去
次のコマンドで、ノイズ除去のデモプログラムが実行できます。
python basicsr/demo.py -opt options/test/SIDD/NAFNet-width64.yml --input_path ./demo/noisy.png --output_path ./demo/denoise_img.png
実行時のコンソール出力
処理結果(ノイズ除去後)
ブレ除去
次のコマンドで、ブレ除去のデモプログラムが実行できます。
python basicsr/demo.py -opt options/test/REDS/NAFNet-width64.yml --input_path ./demo/blurry.jpg --output_path ./demo/deblur_img.png
実行時のコンソール出力
処理結果(ノイズ除去後)
ステレオ画像の高解像化
次のコマンドでステレオ画像の高解像化のデモが実行できます。
python basicsr/demo_ssr.py -opt options/test/NAFSSR/NAFSSR-L_4x.yml --input_l_path ./demo/lr_img_l.png --input_r_path ./demo/lr_img_r.png --output_l_path ./demo/sr_img_l.png --output_r_path ./demo/sr_img_r.png
実行時のコンソール出力
処理結果(ステレオ画像の高解像化)
3つのデモプログラムを実行した結果、 demo フォルダは次の様になっています。
NAFNetの使い方
デモプログラムの引数に入力ファイル名と出力ファイル名を指定することで、任意の画像のノイズ除去、ブレ除去、ステレオ画像の高解像化を行うことが可能です。
入力ファイルのサイズが大きすぎる場合、GPUのメモリ不足で実行できません。私が使っているGPUは12GBのメモリ容量がありますが、約800万画素相当の画像が上限のようです。
これ以上大きな画像を処理したい場合はメモリ容量の大きいGPUをご利用ください。
ノイズ除去とブレ除去
次のコマンドを実行することで、ノイズ除去とブレ除去が行えます。
python basicsr/demo.py -opt options --input_path input --output_path output
options | ノイズ除去 ⇒ options/test/SIDD/NAFNet-width64.yml ブレ除去 ⇒ options/test/REDS/NAFNet-width64.yml |
input | 入力ファイルのパス |
output | 出力ファイルのパス |
ステレオ画像の高画素化
次のコマンドを実行することで、ステレオ画像の高画素化が行えます。
python basicsr/demo_ssr -opt options --input_path input --output_path output
options | ノイズ除去 ⇒ optoptions/test/NAFSSR/NAFSSR-L_4x.yml |
input | 入力ファイルのパス |
output | 出力ファイルのパス |
まとめ
今回は NAFNet についてインストール方法と使い方を紹介しました。
NAFNetを使うことで、かなりの量のノイズ除去やブレ除去が行えます。しかしGPUのメモリを大量に消費するため、入力ファイルの容量(画素数)が大きいと処理できません。
12GBのメモリを搭載したGPUを使った場合、おおよそ800万画素の処理が限界でした。
とはいえ、有料サイトのノイズ除去/ブレ除去サービスも結構高額なので、自宅のPCで無制限に行える点は大きなメリットではないでしょうか。
処理したい画像が少量の場合は有料サービスを利用する方がコストパフォーマンスが高いですが、それほど大きくない画像を大量に処理したい場合は、NAFNet がお勧めです。
コメント