NAFNet
NAFNetは画像復元用の畳み込みネットワークで、一般的なUNet blockから非線形activation functionを取り除き、要素ごとの乗算に置き換えます。LibreYOLOは復元という1つのタスクで対応し、SIDDで学習した実画像ノイズ除去チェックポイントを公開しています。
- タスク
- restore
- サイズ
- s, l at 256 px
- インストール
pip install libreyolo- サポートティア
- サポート対象、v以降。補助的な学習可能モデル:CIで正常な状態を維持し、機能は機会に応じて追加されます。
- ライセンス
- コード:MIT、重み:MIT。商用利用
インストール
NAFNetに任意の追加パッケージは必要ありません。インポートするものはすべて基本インストールに含まれています。
pip install libreyolo推論
重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")result = model("noisy.jpg", save=True) restored = result.restoredprint(restored.array.shape)libreyolo predict model=LibreNAFNetl-restore-sidd.pt source=noisy.jpg save=Truefrom 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 は入力上にアノテーションを描かず、その復元画像をディスクへ直接書き込みます。conf、iou、max_det はほかのすべてのファミリーとのsignatureの一貫性のために受け付けますが、復元では絞り込み対象の検出結果が生成されないため効果はありません。ソース、ストリーミング、結果の処理については推論を参照してください。
バリアント
s(幅32)と l(幅64)の2つの幅がこのアーキテクチャを共有し、どちらも256 pxの学習patchを中心に構築されています。推論と検証はサイズに関係なく画像のネイティブ解像度で動作し、ネットワークのdownsample factorに合わせたpaddingだけを行います。現在公開されているのは、SIDDで学習した実画像ノイズ除去チェックポイントの l 幅だけです。
学習
NAFNetは独自に用意した劣化画像ときれいな画像のペアでファインチューニングします。データセットYAMLは、劣化画像の inputs/<split>/ フォルダーと、ファイルstemで対応付けられたきれいな対象画像の targets/<split>/ フォルダーを指定します。degradation と dataset は来歴として保存済みチェックポイントへ記録される任意の文字列で、学習には関与しません。
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)libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \ epochs=100 imgsz=256 batch=16 lr0=1e-3from libreyolo import LibreYOLO # degradationとdatasetは保存済みチェックポイントに記録されるが# 学習内容は変更しないmodel = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train( data="my-dataset.yaml", epochs=100, degradation="denoise", dataset="MyDataset",)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/PSNR と metrics/SSIM を含む辞書を返します。SSIMはsigma 1.5の11x11 Gaussian windowを使い、best-checkpoint選択の fitness はPSNR値です。data は学習に使うものと同じペア画像データセット形式を指します。
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"])libreyolo val model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yamlエクスポート
| タスク | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| restore | restore 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次元だけです。高さと幅はエクスポート時に固定されます。
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.export(format="onnx", imgsz=256)model.export(format="tensorrt", imgsz=256, half=True)libreyolo export model=LibreNAFNetl-restore-sidd.pt format=onnx imgsz=256libreyolo export model=LibreNAFNetl-restore-sidd.pt format=tensorrt imgsz=256 half=Truefrom libreyolo import LibreYOLO # ファクトリーはファイル接尾辞で経路を選ぶため、エクスポート済み成果物も# 通常のチェックポイントと同様に読み込まれ、同じResultsオブジェクトを返すmodel = LibreYOLO("LibreNAFNetl-restore-sidd.onnx")result = model("noisy.jpg") result.restored.save("denoised.png")チェックポイント
このファミリーで公開されているすべての重みファイルです。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| restore | ||
| LibreNAFNetl-restore-sidd.pt | mit | |
上記のすべてのファイルは現在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の引用ブロックからコピーしています。