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.
pip install libreyoloPredição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache local.
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")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.
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 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",)libreyolo train model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yaml \ epochs=100 device=0,1 batch=32Sem 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.
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"])libreyolo val model=LibreNAFNetl-restore-sidd.pt data=my-dataset.yamlExportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| restore | restore to ONNX: compatível | restore to TorchScript: compatível | restore to ExecuTorch: compatível | restore to TensorRT: compatível | restore to OpenVINO: compatível | restore to Paddle: incompatível | restore to MNN: incompatível | restore to RKNN: incompatível | restore to ncnn: compatível | restore to TFLite: incompatível | restore to CoreML: incompatível | restore 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.
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 # 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.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| restore | ||
| LibreNAFNetl-restore-sidd.pt | mit | |
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.