MENU

【Python】無料だけど凄い!AI「SCUNet」による写真/画像ノイズの除去方法を解説

室内で撮影した写真を拡大してみると、思った以上にノイズが目立つことがあります。特にスマホやコンパクトデジタルカメラでは、暗所撮影や高感度設定によってノイズが顕著に現れることも少なくありません。

最近では、AIを活用したノイズ除去機能を備えたフォトレタッチのウェブサービスが多数登場していますが、その多くは有料。できれば無料で、しかも高品質なノイズ除去を実現したい――そんな方に向けて今回は、SCUNetSwin-Conv-UNet) という最新のAIアルゴリズムを使って、どこまでノイズを除去できるのかを検証してみます。

写真編集はもちろん、医療画像や衛星写真にも応用されるこの技術。果たして、有料サービスに匹敵する性能を無料で実現できるのか?ぜひ最後までご覧ください!

目次

SCUNetとは

引用元:SCUNet 公式GitHub

SCUNetは、画像ノイズ除去のために設計された深層学習モデル で、以下の2つの技術を融合しています

  1. Swin Transformer – 広範囲の情報を捉えることで、高品質な復元を実現。
  2. 畳み込みネットワーク(ConvNet) – 局所的な特徴を詳細に捉えることで、微細なノイズを取り除く。

これらを組み合わせることで、従来の手法よりも柔軟かつ高精度なノイズ除去が可能になりました。
SCUNetの特徴は次の通りです。

  • 柔軟な構造でさまざまな画像に適用可能
    医療画像、衛星写真、監視カメラ映像など、多様な分野で活用されています。
  • ノイズの種類を問わず適応可能(ブラインドノイズ除去)
    通常、ノイズ除去モデルは特定の種類のノイズに最適化されますが、SCUNetは事前にノイズタイプを知らなくても効果的に処理できます。
  • 画像の細部を保持しながらノイズを除去
    一般的なフィルターでは画像がぼやけることがありますが、SCUNetはシャープな画質を維持しつつ、不要なノイズを排除できます。

SCUNet の公式サイト

引用元:SCUNet 公式GitHub

SCUNet の概要とソースコードは、Git上にある SCUNet 公式ページに掲載されています。本記事では、ここに記載されいている内容をできるだけわかりやすく解説したものになります。

https://github.com/cszn/SCUNet

インストールの前提条件

SCUNet のページでは、モデルのダウンロード方法とデモプログラムの使い方に関する記述があるだけで、詳しいインストール方法が記載されていません。

今回は、私のPCで試して動作した構成を記載しています。

Python/CUDAのバージョン

動作に必要な環境は次の通りです。

必要な環境・ライブラリバージョンなど備考
Python 環境Python 3.12.33.10.9でも動作しました
Git 環境その時の最新版
Pytorchtorch 2.0.1+cu118
CUDA Toolkit11.8CPUで動かすならインストール不要
cuDNN8.9.78.9.0以上なら動作可能

インストール手順の概要

次の手順でインストールを行います。

Step1
Python動作環境の構築
①Python 3.12.3の環境準備
②Gitの環境準備
③CUDA Toolkit 11.8のインストール(GPUを使う場合)
④cuDNN 8.9.7
Step2
SCUNet のインストール
GitHubからSCUNet をインストール後、各種モジュールをインストール
Step3
各種モデルのインストール
GitHubに公開されている学習済みモデルをダウンロードします。
これは、コマンドを1行実行することで完了します。

インストール手順

Step1.Python動作環境の構築

【最初の一歩】生成AI向けPython環境構築手順(スクリーンショットで解説)」の記載内容(①②③④)を実行してください。

Python環境構築手順の①~④をインストールしてください。
FFMPEGのインストールは不要です(使わないだけなので、インストールしても差し支えはありません)。

Step2.SCUNet のインストール

あらかじめ、SCUNet をインストールするための任意のフォルダを作成しておきます。今回は、Oドライブの直下に DeNiseというフォルダを作成し、そこにインストールすることにします。

まず、コマンドプロンプトを開き、インストールしたいフォルダ(今回はOドライブ直下のSCUNet フォルダ)に移動し、次のコマンドを実行します。

git clone https://github.com/cszn/scunet

SCUNet のモジュールがインストールに成功したら、次のコマンドを実行してください。

cd scunet
pip install thop
pip install einops
pip install timm
pip install opencv-python
pip install matplotlib

続けて、Pytorch をインストールします。CPUのみで動作させる場合と、GPUを使う場合とではコマンドが変わってきます。お使いのPCがNVIDIAのGPUを搭載している場合、下記のコマンドを実行してください。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

CPUのみで動作させたい場合は、下記のコマンドを実行します。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

GPUを使わない場合、Core-i5 13400 のCPUスペックだと、1画像に9分程度の処理時間が必要です。
NVIDIA RTX-4070 を使う場合、20秒程度で処理できます。

Step3.各種モデルのインストール

続けて、次のコマンドを実行します。これで、必要なモデルが自動的にダウンロードされます。

python main_download_pretrained_models.py --models "SCUNet" --model_dir "model_zoo"

以上でモデルのインストールは完了です。

SCUNet フォルダ構成について

インストール後のフォルダ構成は上図の通りです。先ほどダウンロードしたモデルファイルは、model_zoo フォルダに格納されています。

testsets フォルダにはテスト用のサンプル画像がフォルダに分かれて格納されており、results フォルダには、ノイズ除去後のサンプル画像が格納されています。

また、デモ用の5つのPythonプログラムが置かれています。後ほど詳しく説明しますが、これらのプログラムを用いてノイズ除去を行います。

Pythonファイル内容・用途
main_download_pretrained_models.py学習済みモデルをダウンロードするためのスクリプト。
main_test_scunet_color_gaussian.pySCUNetを使用してカラー画像のガウスノイズ除去をテストするスクリプト。
main_test_scunet_gray_gaussian.pySCUNetを使用してグレースケール画像のガウスノイズ除去をテストするスクリプト。
main_test_scunet_real_application.py実際の写真やリアル環境でのノイズを除去する場合に使うスクリプト。ほんの少し画質が良くなるが、GPUを使っても数分掛かる。
モデルが scunet_color_real_gan 又は scunet_color_real_psnr の場合、逆にノイズが増える。
predict.py
予測を行うスクリプト(モデルを使用して画像処理を実施)。

SCUNet デモプログラムの起動方法

コマンドプロンプトを開き、SCUNet をインストールしたフォルダの直下に移動したあとで、デモプログラムを実行します。

試しに、カラーノイズを除去してみましょう。この場合、main_test_scunet_color_gaussian.py を使います。

python main_test_scunet_color_gaussian.py --model_name <モデル名> testset_name <フォルダ名> --noise_level_img 0

--model_name次の5つの中から指定します。
scunet_color_15:ノイズが少ない場合
scunet_color_25:ノイズが中程度の場合
scunet_color_50:ノイズがかなり多い場合
scunet_color_real_gan:人物などの視覚的な質感や美しさを重視してノイズを除去
scunet_color_real_psnr:ディテールを重視し、最大限ノイズを除去
--need_degradationノイズ除去の性能を試すためのオプションで、Trueを指定すると元画像にノイズを追加します。但し、デモプログラムはこのオプションを無視しており、必ずTrueが設定されてしまいます。
--noise_level_img--need_degradation が Trueの場合、元画像に指定した分だけノイズを追加します。
デモプログラムは、--need_degradation の指定に関係なくノイズを追加してしまうため、必ず0を指定しておきます。
--testsetsデータセット(入力画像を格納したフォルダ)の親フォルダを指定します。省略した場合は、"testsets"フォルダが指定されます。
--testset_name入力画像を格納したフォルダを指定します。--testsetsで指定した親フォルダの直下を起点に、--testset_nameで指定したフォルダ内の画像を入力画像として使用します。
--results出力画像のルートフォルダを指定します。省略した場合、results フォルダ直下に、自動で「入力画像のフォルダ名+モデル名」のフォルダが作成され、そこに出力されます。

今回、試しに使う画像は、Fimi Palm 2 Pro という小型のジンバルカメラで撮影したISO1600の写真です。スマートフォンと同じくらい小さな受光センサーなので、かなりノイズが載っています。

ノイズ量を考慮すると scunet_color_50 が適していそうです。

今回は、testset フォルダ直下に test フォルダを作り、そこに画像をコピーします。そして、
モデル名:scunet_color_50 、出力画像フォルダの指定なしで、ノイズ除去を行ってみました。

--noise_level_img 0 を毎回指定するのが面倒な場合、main_test_scunet_color_gaussian.py の56行目に args.need_degradation = Trueと記載されてる部分を、args.need_degradation = False に書き換えてあげることで、起動時の引数に関係なくノイズが追加されなくなります。


出力先フォルダを指定しない場合、--testset_name で指定したフォルダ名(test)と、-- model_name で指定したモデル名(scunet_color_25)でフォルダが作成され、そこにノイズ除去結果の画像が出力されます。

python main_test_scunet_color_gaussian.py --model_name scunet_color_50 --testset_name test --noise_level_img 0 

見違えるようにノイズが除去されていることが分かります。感動ですね!

入力画像

出力画像

scunet_color_gaussianscunet_real_application の画質比較

ここまでは、main_test_scunet_color_gaussian.py を使ってノイズ除去を試してみましたが、SCUNetのデモプログラムには、 main_test_scunet_real_application.py も用意されています。

main_test_scunet_real_application.py は、実際の写真やリアル環境でのノイズを学習させたモデルであるため、実際の撮影画像においては、更に高品質なノイズ除去が実現できるようです。しかし、その副作用として、処理時間が大幅に増える(color_gaussian:20秒前後/画像 ⇒ real_application:400秒前後/画像)という副作用もあります。

そこで、処理時間に見合うだけの価値があるかについて、main_test_scunet_color_gaussian.py main_test_scunet_real_application.py の出力結果を比較してみました。
画像を1回クリックすると拡大表示し、もう1回クリックすると更に拡大されます。

結論として、scunet_color_15、scunet_color_25、scunet_color_50 については、両者の差は僅かであり、良く見比べると若干改善されていることが分かる程度でした。

一方、scunet_color_real_ganとscunet_color_real_psnrについては、逆にmain_test_scunet_real_application.pyの方が、ノイズが増えている印象です。

写っている画像の中身や、ノイズ量によっても結果は異なってくると思いますので、色々と試して頂ければと思います。

モデル名:scunet_color_15

main_test_scunet_color_gaussian.py

main_test_scunet_real_application.py

モデル名:scunet_color_25

main_test_scunet_color_gaussian.py

main_test_scunet_real_application.py

モデル名:scunet_color_50

main_test_scunet_color_gaussian.py

main_test_scunet_real_application.py

モデル名:scunet_color_real_gan

main_test_scunet_color_gaussian.py

main_test_scunet_real_application.py

モデル名:scunet_color_real_psnr

main_test_scunet_color_gaussian.py

main_test_scunet_real_application.py

まとめ

今回は SCUNet についてインストール方法と使い方を紹介しました。

SCUNet を使うことで、劇的にノイズ除去やブレ除去が行えます。有料サービスのノイズ除去に匹敵するのではないでしょうか。

但し、CPUだけでノイズ除去する場合は、1000万画素1枚当たり9分(Core-i5 13400使用時)程度もの時間が掛かるため、本格的に使うにはGPUが必須です。

とはいえ、フォルダに複数のファイルをコピーしておけば、あとは放置しておくだけで勝手にノイズ除去してくれるので、寝ている間にノイズ除去させておくという運用も可能です。

ノイズ除去したい画像の枚数が少ない方、長時間パソコンをほったらかしても良い方、もしくはGPUを既に所有している方には、強力なツールになると思います。

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次