NAFNet

O NAFNet é uma rede convolucional para restauração de imagens que remove as funções de ativação não lineares de um bloco UNet típico, substituindo-as por multiplicação elemento a elemento. O LibreYOLO oferece suporte a uma tarefa, restauração, com um checkpoint publicado de remoção de ruído em imagens reais treinado no SIDD.

Tarefas
restore
Tamanhos
s, l at 256 px
Instalação
pip install libreyolo
Nível de suporte
Compatível, desde a v. Modelos treináveis complementares: mantidos verdes na CI, com recursos incorporados quando há oportunidade.
Origem
NAFNet por Megvii, MIT. Artigo, código-fonte
Licenças
Código MIT, pesos MIT. Uso comercial

Instalação

O NAFNet não precisa de nenhum extra opcional. Tudo o que ele importa já vem na instalação base.

bash
pip install libreyolo

Predição

Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.

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

O objeto Results devolvido carrega um único campo para esta família, restored, uma imagem RGB uint8 densa em HWC no canvas original; não há boxes para percorrer. save=True grava essa imagem restaurada direto no disco, em vez de desenhar uma anotação sobre a entrada. conf, iou e max_det são aceitos por paridade de assinatura com todas as outras famílias, mas não têm efeito, já que a restauração não produz detecções para filtrar. Veja predição para fontes, streaming e tratamento de resultados.

Variantes

Duas larguras compartilham esta arquitetura: s (largura 32) e l (largura 64), ambas construídas em torno de um patch de treinamento de 256 px. Predição e validação rodam na resolução nativa da imagem, seja qual for o tamanho, com padding apenas até o fator de downsample da rede. Só a largura l está publicada no momento, como um checkpoint de remoção de ruído em imagens reais treinado no SIDD.

Treinamento

O NAFNet faz fine-tuning nos seus próprios pares de imagens degradada/limpa: um YAML de dataset apontando para uma pasta inputs/<split>/ de imagens degradadas e uma pasta targets/<split>/ de alvos limpos, pareadas pelo radical do nome do arquivo. degradation e dataset são strings opcionais registradas no checkpoint salvo para fins de procedência; elas não participam do treinamento.

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
Procedência do checkpoint
from libreyolo import LibreYOLO # degradation e dataset são registrados no checkpoint salvo; eles# não mudam o que é treinado.model = LibreYOLO("LibreNAFNetl-restore-sidd.pt")model.train(    data="my-dataset.yaml",    epochs=100,    degradation="denoise",    dataset="MyDataset",)
Multi-GPU
libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \  epochs=100 device=0,1 batch=32

Sem ajustes, o trainer roda 100 épocas com AdamW em lr0=1e-3, batch de 16, crops de 256 px e early stopping depois de 50 épocas sem melhora de PSNR. Não existe caminho LoRA para esta família: lora=True gera um erro em vez de rodar, já que o NAFNetTrainer nunca adere ao fine-tuning por adaptadores.

Durante o treinamento a rede roda com global average pooling comum. O pooling local por janelas do NAFNet, exclusivo de inferência (Test-time Local Converter), é desacoplado antes da primeira época e reacoplado quando o treinamento termina, já que retropropagar por um pooling local de janela fixa não corresponderia à forma como o checkpoint é usado na inferência.

Veja treinamento para datasets, data augmentation, multi-GPU e loggers.

Validação

val() devolve um dicionário com metrics/PSNR e metrics/SSIM, calculados em RGB sobre todo o canvas válido: o SSIM usa uma janela gaussiana 11x11 com sigma 1.5, e o fitness para seleção do melhor checkpoint é o valor de PSNR. data aponta para o mesmo formato de dataset de imagens pareadas usado no treinamento.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreNAFNetl-restore-sidd.pt") # val() devolve um dict simples, não um objetometrics = 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

Exportação

TarefaONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
restorerestore to ONNX: compatívelrestore to TorchScript: compatívelrestore to ExecuTorch: compatívelrestore to TensorRT: compatívelrestore to OpenVINO: compatívelrestore to Paddle: incompatívelrestore to MNN: incompatívelrestore to RKNN: incompatívelrestore to ncnn: compatívelrestore to TFLite: incompatívelrestore to CoreML: incompatívelrestore to Core AI: compatível

Um artefato exportado é carregado de volta por LibreYOLO() pelo sufixo do arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e devolve o mesmo Results, com restored carregando a imagem de saída. O NAFNet exporta em uma resolução espacial fixa: imgsz precisa ser divisível pelo fator de downsample da rede (16 para as duas larguras de arquitetura), e apenas a dimensão de batch é dinâmica quando dynamic=True; altura e largura ficam fixas no momento da exportação.

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
Usar o arquivo exportado
from libreyolo import LibreYOLO # A factory roteia pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreNAFNetl-restore-sidd.onnx")result = model("noisy.jpg") result.restored.save("denoised.png")

Checkpoints

Todos os arquivos de pesos publicados desta família.

ArquivoEntrada (px)Licença dos pesos
restore
LibreNAFNetl-restore-sidd.ptmit

Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.

Licenciamento

Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.

Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.

Trabalho original
NAFNet, Megvii
Licença original
MIT
Código-fonte original
github.com/megvii-research/NAFNet
Código do LibreYOLO
MIT
Pesos
MIT, republicado em huggingface.co/LibreYOLO
Interpretação
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.

Citação

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

Copiado do bloco de citação dos autores em github.com/megvii-research/NAFNet#citations.

Verificado com o LibreYOLO v1.5.0. As tabelas de suporte, os checkpoints e os números de benchmark desta página são gerados a partir da biblioteca lançada e dos pesos publicados, não escritos à mão.