NAFNet

NAFNetは画像復元用の畳み込みネットワークで、一般的なUNet blockから非線形activation functionを取り除き、要素ごとの乗算に置き換えます。LibreYOLOは復元という1つのタスクで対応し、SIDDで学習した実画像ノイズ除去チェックポイントを公開しています。

タスク
restore
サイズ
s, l at 256 px
インストール
pip install libreyolo
サポートティア
サポート対象、v以降。補助的な学習可能モデル:CIで正常な状態を維持し、機能は機会に応じて追加されます。
アップストリーム
MegviiのNAFNet、MIT。論文ソース
ライセンス
コード:MIT、重み:MIT。商用利用

インストール

NAFNetに任意の追加パッケージは必要ありません。インポートするものはすべて基本インストールに含まれています。

bash
pip install libreyolo

推論

重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")result = model("noisy.jpg", save=True) restored = result.restoredprint(restored.array.shape)
CLI
libreyolo predict model=LibreNAFNetl-restore-sidd.pt source=noisy.jpg save=True
復元画像を保存
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")result = model.predict("noisy.jpg") result.restored.save("denoised.png")

返される Results オブジェクトは、このファミリー用の restored という1つのフィールドを持ちます。元のキャンバス上の密なHWC uint8 RGB画像であり、反復対象のボックスはありません。save=True は入力上にアノテーションを描かず、その復元画像をディスクへ直接書き込みます。confioumax_det はほかのすべてのファミリーとのsignatureの一貫性のために受け付けますが、復元では絞り込み対象の検出結果が生成されないため効果はありません。ソース、ストリーミング、結果の処理については推論を参照してください。

バリアント

s(幅32)と l(幅64)の2つの幅がこのアーキテクチャを共有し、どちらも256 pxの学習patchを中心に構築されています。推論と検証はサイズに関係なく画像のネイティブ解像度で動作し、ネットワークのdownsample factorに合わせたpaddingだけを行います。現在公開されているのは、SIDDで学習した実画像ノイズ除去チェックポイントの l 幅だけです。

学習

NAFNetは独自に用意した劣化画像ときれいな画像のペアでファインチューニングします。データセットYAMLは、劣化画像の inputs/<split>/ フォルダーと、ファイルstemで対応付けられたきれいな対象画像の targets/<split>/ フォルダーを指定します。degradationdataset は来歴として保存済みチェックポイントへ記録される任意の文字列で、学習には関与しません。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=256, batch=16, lr0=1e-3)
CLI
libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \  epochs=100 imgsz=256 batch=16 lr0=1e-3
チェックポイントの来歴
from libreyolo import LibreYOLO # degradationとdatasetは保存済みチェックポイントに記録されるが# 学習内容は変更しないmodel = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train(    data="my-dataset.yaml",    epochs=100,    degradation="denoise",    dataset="MyDataset",)
マルチGPU
libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \  epochs=100 device=0,1 batch=32

設定を変更しなければ、trainerはAdamW、lr0=1e-3、バッチ16、256 px cropで100エポック実行し、PSNRが50エポック改善しないと早期終了(early stopping)します。このファミリーにはLoRA経路がありません。NAFNetTrainer はadapterファインチューニングへオプトインしないため、lora=True は実行せずにエラーを送出します。

学習中、ネットワークは通常のglobal-average poolingで動作します。NAFNetの推論専用windowed local pooling(Test-time Local Converter)は最初のエポック前に取り外され、学習完了後に再び取り付けられます。固定window local poolを通じたbackpropagationでは、推論時のチェックポイント利用方法と一致しないためです。

データセット、データ拡張、マルチGPU、loggerについては学習を参照してください。

検証

val() は、全有効キャンバスのRGBで計算した metrics/PSNRmetrics/SSIM を含む辞書を返します。SSIMはsigma 1.5の11x11 Gaussian windowを使い、best-checkpoint選択の fitness はPSNR値です。data は学習に使うものと同じペア画像データセット形式を指します。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # val()はオブジェクトではなく通常のdictを返すmetrics = model.val(data="my-dataset.yaml") print(metrics["metrics/PSNR"])print(metrics["metrics/SSIM"])
CLI
libreyolo val model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml

エクスポート

タスクONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
restorerestore to ONNX:対応restore to TorchScript:対応restore to ExecuTorch:対応restore to TensorRT:対応restore to OpenVINO:対応restore to Paddle:非対応restore to MNN:非対応restore to RKNN:非対応restore to ncnn:対応restore to TFLite:非対応restore to CoreML:非対応restore to Core AI:対応

エクスポート済み成果物はファイル接尾辞に基づいて LibreYOLO() から再度読み込めます。そのため、.onnx または .engine ファイルはチェックポイントと同様に動作し、restored に出力画像を保持する同じ Results を返します。NAFNetは固定空間解像度でエクスポートされます。imgsz はネットワークのdownsample factor(どちらのアーキテクチャ幅でも16)で割り切れる必要があり、dynamic=True でもdynamicになるのはbatch次元だけです。高さと幅はエクスポート時に固定されます。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.export(format="onnx", imgsz=256)model.export(format="tensorrt", imgsz=256, half=True)
CLI
libreyolo export model=LibreNAFNetl-restore-sidd.pt format=onnx imgsz=256libreyolo export model=LibreNAFNetl-restore-sidd.pt format=tensorrt imgsz=256 half=True
エクスポートしたファイルを使う
from libreyolo import LibreYOLO # ファクトリーはファイル接尾辞で経路を選ぶため、エクスポート済み成果物も# 通常のチェックポイントと同様に読み込まれ、同じResultsオブジェクトを返すmodel = LibreYOLO("LibreNAFNetl-restore-sidd.onnx")result = model("noisy.jpg") result.restored.save("denoised.png")

チェックポイント

このファミリーで公開されているすべての重みファイルです。

ファイル入力(px)重みのライセンス
restore
LibreNAFNetl-restore-sidd.ptmit

上記のすべてのファイルは現在LibreYOLO orgにあり、初回使用時にダウンロードされます。

ライセンス

ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。

これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。

原著作物
NAFNet, Megvii
アップストリームのライセンス
MIT
アップストリームのソース
github.com/megvii-research/NAFNet
LibreYOLOのコード
MIT
重み
MIT、huggingface.co/LibreYOLOで再公開
解釈
MIT is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep the copyright notice and license text with any copy you redistribute, and places no other obligation on your own application code. Part of the training pipeline is ported from BasicSR under Apache-2.0, which additionally grants a patent license. The published checkpoint is trained on the Smartphone Image Denoising Dataset (SIDD), itself MIT-licensed.

引用

@article{chen2022simple,
  title={Simple Baselines for Image Restoration},
  author={Chen, Liangyu and Chu, Xiaojie and Zhang, Xiangyu and Sun, Jian},
  journal={arXiv preprint arXiv:2204.04676},
  year={2022}
}

著者によるgithub.com/megvii-research/NAFNet#citationsの引用ブロックからコピーしています。

LibreYOLO v1.5.0で検証済みです。このページのサポート表、チェックポイント、ベンチマーク値は手作業で記述したものではなく、リリース済みライブラリと公開済みの重みから生成されています。