NAFNet

NAFNet to sieć konwolucyjna do rekonstrukcji obrazów, która usuwa nieliniowe funkcje aktywacji z typowego bloku UNet i zastępuje je mnożeniem element po elemencie. LibreYOLO obsługuje ją w jednym zadaniu, rekonstrukcji, z opublikowanym punktem kontrolnym do odszumiania rzeczywistych obrazów wytrenowanym na SIDD.

Zadania
restore
Rozmiary
s, l at 256 px
Instalacja
pip install libreyolo
Poziom obsługi
Obsługiwany, od wersji v. Dodatkowe trenowalne modele: testy CI pozostają zielone, a funkcje są dodawane w miarę możliwości.
Projekt źródłowy
NAFNet, autorzy: Megvii, licencja: MIT. Publikacja, kod źródłowy
Licencje
Kod: MIT, wagi: MIT. Użycie komercyjne

Instalacja

NAFNet nie wymaga opcjonalnych dodatków. Wszystkie importowane przez nią elementy znajdują się w instalacji podstawowej.

bash
pip install libreyolo

Predykcja

Przy pierwszym użyciu wagi są pobierane z Hugging Face i zapisywane w lokalnej pamięci podręcznej.

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
Zapis zrekonstruowanego obrazu
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")result = model.predict("noisy.jpg") result.restored.save("denoised.png")

Zwracany obiekt Results zawiera dla tej rodziny jedno pole, restored, czyli gęsty obraz RGB uint8 w układzie HWC na oryginalnym płótnie. Nie ma ramek do iterowania. Ustawienie save=True zapisuje zrekonstruowany obraz bezpośrednio na dysku zamiast rysować adnotację na obrazie wejściowym. Parametry conf, iou i max_det są przyjmowane dla zgodności sygnatury z każdą inną rodziną, ale nie mają wpływu na wynik, ponieważ rekonstrukcja nie tworzy detekcji do filtrowania. Informacje o źródłach, strumieniowaniu i obsłudze wyników znajdziesz w sekcji predykcja.

Warianty

Ta architektura ma dwie szerokości: s (szerokość 32) i l (szerokość 64), obie zbudowane wokół fragmentu treningowego 256 px. Predykcja i walidacja działają w natywnej rozdzielczości obrazu niezależnie od rozmiaru, z dopełnieniem wyłącznie do współczynnika zmniejszania rozdzielczości sieci. Obecnie opublikowano tylko szerokość l, jako punkt kontrolny do odszumiania rzeczywistych obrazów wytrenowany na SIDD.

Trenowanie

NAFNet dostraja się na własnych parach obrazów zdegradowanych i czystych. Plik YAML zbioru danych wskazuje folder inputs/<split>/ ze zdegradowanymi obrazami oraz folder targets/<split>/ z czystymi obrazami docelowymi, dopasowanymi według rdzenia nazwy pliku. degradation i dataset to opcjonalne ciągi zapisywane w punkcie kontrolnym jako informacja o pochodzeniu. Nie biorą udziału w trenowaniu.

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
Pochodzenie punktu kontrolnego
from libreyolo import LibreYOLO # Rodzaj degradacji i zbiór danych są zapisywane w punkcie kontrolnym;# nie zmieniają trenowanych elementów.model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train(    data="my-dataset.yaml",    epochs=100,    degradation="denoise",    dataset="MyDataset",)
Wiele GPU
libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \  epochs=100 device=0,1 batch=32

Przy ustawieniach domyślnych trener wykonuje 100 epok z optymalizatorem AdamW, lr0=1e-3, partiami po 16, wycinkami 256 px oraz wczesnym zatrzymaniem po 50 epokach bez poprawy PSNR. Ta rodzina nie ma ścieżki LoRA: lora=True zgłasza błąd zamiast rozpoczynać działanie, ponieważ NAFNetTrainer nie obsługuje dostrajania adapterów.

Podczas trenowania sieć używa zwykłego globalnego uśredniania. Przeznaczone wyłącznie do wnioskowania lokalne uśrednianie okienkowe NAFNet (Test-time Local Converter) jest odłączane przed pierwszą epoką i ponownie dołączane po zakończeniu trenowania, ponieważ propagacja wsteczna przez lokalne uśrednianie o stałym oknie nie odpowiadałaby sposobowi użycia punktu kontrolnego podczas wnioskowania.

Informacje o zbiorach danych, augmentacji, wielu GPU i loggerach znajdziesz w sekcji trenowanie.

Walidacja

Metoda val() zwraca słownik z metrics/PSNR i metrics/SSIM, obliczanymi w RGB na całym prawidłowym płótnie. SSIM używa okna Gaussa 11x11 z sigma 1,5, a fitness do wyboru najlepszego punktu kontrolnego jest wartością PSNR. Parametr data wskazuje ten sam format zbioru sparowanych obrazów, którego używa trenowanie.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # val() zwraca zwykły słownik, a nie obiektmetrics = 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

Eksport

ZadanieONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
restorerestore to ONNX: obsługiwanerestore to TorchScript: obsługiwanerestore to ExecuTorch: obsługiwanerestore to TensorRT: obsługiwanerestore to OpenVINO: obsługiwanerestore to Paddle: brak obsługirestore to MNN: brak obsługirestore to RKNN: brak obsługirestore to ncnn: obsługiwanerestore to TFLite: brak obsługirestore to CoreML: brak obsługirestore to Core AI: obsługiwane

Wyeksportowany artefakt jest ponownie ładowany przez LibreYOLO() na podstawie rozszerzenia pliku, więc plik .onnx lub .engine zachowuje się jak punkt kontrolny i zwraca ten sam obiekt Results, a restored zawiera obraz wynikowy. NAFNet jest eksportowany ze stałą rozdzielczością przestrzenną: imgsz musi być podzielne przez współczynnik zmniejszania rozdzielczości sieci (16 dla obu szerokości architektury), a przy dynamic=True dynamiczny jest tylko wymiar partii. Wysokość i szerokość są ustalane podczas eksportu.

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
Użycie wyeksportowanego pliku
from libreyolo import LibreYOLO # Fabryka wybiera ścieżkę na podstawie rozszerzenia pliku, dlatego# artefakt ładuje się jak punkt kontrolny i zwraca ten sam obiekt Results.model = LibreYOLO("LibreNAFNetl-restore-sidd.onnx")result = model("noisy.jpg") result.restored.save("denoised.png")

Punkty kontrolne

Wszystkie opublikowane pliki wag dla tej rodziny.

PlikWejście (px)Licencja wag
restore
LibreNAFNetl-restore-sidd.ptmit

Każdy z powyższych plików jest obecnie dostępny w organizacji LibreYOLO i pobierany przy pierwszym użyciu.

Licencjonowanie

Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.

To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.

Oryginalna praca
NAFNet, Megvii
Licencja projektu źródłowego
MIT
Kod źródłowy projektu
github.com/megvii-research/NAFNet
Kod LibreYOLO
MIT
Wagi
MIT, ponownie opublikowane w huggingface.co/LibreYOLO
Interpretacja
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.

Cytowanie

@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}
}

Skopiowano z bloku cytowania autorów w github.com/megvii-research/NAFNet#citations.

Zweryfikowano z LibreYOLO v1.5.0. Tabele obsługi, checkpointy i wyniki benchmarków na tej stronie są generowane na podstawie wydanej biblioteki i opublikowanych wag, a nie wpisywane ręcznie.