A eficácia irracional dos recursos profundos como métrica de percepção
Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, Oliver Wang. Em CVPR, 2018.
Execute pip install lpips
. O código Python a seguir é tudo que você precisa.
import lpips
loss_fn_alex = lpips . LPIPS ( net = 'alex' ) # best forward scores
loss_fn_vgg = lpips . LPIPS ( net = 'vgg' ) # closer to "traditional" perceptual loss, when used for optimization
import torch
img0 = torch . zeros ( 1 , 3 , 64 , 64 ) # image should be RGB, IMPORTANT: normalized to [-1,1]
img1 = torch . zeros ( 1 , 3 , 64 , 64 )
d = loss_fn_alex ( img0 , img1 )
Informações mais completas sobre as variantes estão abaixo. Este repositório contém nossa métrica perceptual (LPIPS) e conjunto de dados (BAPPS) . Também pode ser usado como uma “perda perceptiva”. Isso usa PyTorch; uma alternativa ao Tensorflow está aqui.
Índice
pip install -r requirements.txt
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
Avalie a distância entre os patches da imagem. Maior significa mais/mais diferente. Menor significa mais semelhante.
Scripts de exemplo para medir a distância entre 2 imagens específicas, todos os pares de imagens correspondentes em 2 diretórios ou todos os pares de imagens em um diretório:
python lpips_2imgs.py -p0 imgs/ex_ref.png -p1 imgs/ex_p0.png --use_gpu
python lpips_2dirs.py -d0 imgs/ex_dir0 -d1 imgs/ex_dir1 -o imgs/example_dists.txt --use_gpu
python lpips_1dir_allpairs.py -d imgs/ex_dir_pair -o imgs/example_dists_pair.txt --use_gpu
O arquivo test_network.py mostra um exemplo de uso. Este trecho é tudo que você realmente precisa.
import lpips
loss_fn = lpips . LPIPS ( net = 'alex' )
d = loss_fn . forward ( im0 , im1 )
Variáveis im0, im1
é um tensor/variável PyTorch com formato Nx3xHxW
( N
patches de tamanho HxW
, imagens RGB dimensionadas em [-1,+1]
). Isso retorna d
, um tensor/variável de comprimento N
Execute python test_network.py
para medir a distância entre a imagem de referência de exemplo ex_ref.png
e as imagens distorcidas ex_p0.png
e ex_p1.png
. Antes de executá-lo - o que você acha que deveria estar mais próximo?
Algumas opções por padrão em model.initialize
:
net='alex'
. Network alex
é o mais rápido, tem o melhor desempenho (como métrica direta) e é o padrão. Para backpropping, a perda net='vgg'
está mais próxima da tradicional "perda perceptiva".lpips=True
. Isso adiciona uma calibração linear aos recursos intermediários da rede. Defina isso como lpips=False
para ponderar igualmente todos os recursos. O arquivo lpips_loss.py
mostra como otimizar iterativamente usando a métrica. Execute python lpips_loss.py
para uma demonstração. O código também pode ser usado para implementar a perda VGG vanilla, sem nossos pesos aprendidos.
Maior significa mais/mais diferente. Menor significa mais semelhante.
Descobrimos que as ativações de redes profundas funcionam surpreendentemente bem como uma métrica de similaridade perceptiva. Isso foi verdade em arquiteturas de rede (SqueezeNet [2,8 MB], AlexNet [9,1 MB] e VGG [58,9 MB] forneceram pontuações semelhantes) e sinais de supervisão (não supervisionados, auto-supervisionados e supervisionados, todos apresentam forte desempenho). Melhoramos ligeiramente as pontuações "calibrando" linearmente as redes - adicionando uma camada linear no topo das redes de classificação disponíveis no mercado. Fornecemos 3 variantes, usando camadas lineares sobre as redes SqueezeNet, AlexNet (padrão) e VGG.
Se você usa LPIPS em sua publicação, especifique qual versão está usando. A versão atual é 0.1. Você pode definir version='0.0'
para a versão inicial.
Execute bash ./scripts/download_dataset.sh
para baixar e descompactar o conjunto de dados no diretório ./dataset
. Leva [6,6 GB] no total. Como alternativa, execute bash ./scripts/download_dataset_valonly.sh
para baixar apenas o conjunto de validação [1,3 GB].
O script test_dataset_model.py
avalia um modelo perceptual em um subconjunto do conjunto de dados.
Sinalizadores de conjunto de dados
--dataset_mode
: 2afc
ou jnd
, que tipo de julgamento perceptual avaliar--datasets
: lista os conjuntos de dados para avaliar--dataset_mode 2afc
: as opções são [ train/traditional
, train/cnn
, val/traditional
, val/cnn
, val/superres
, val/deblur
, val/color
, val/frameinterp
]--dataset_mode jnd
: as opções são [ val/traditional
, val/cnn
]Sinalizadores de modelo de similaridade perceptiva
--model
: modelo de similaridade perceptiva a ser usadolpips
para nosso modelo de similaridade aprendida LPIPS (rede linear sobre ativações internas de rede pré-treinada)baseline
para uma rede de classificação (não calibrada com média de todas as camadas)l2
para distância euclidianassim
para métrica de imagem de similaridade estruturada--net
: [ squeeze
, alex
, vgg
] para os modelos net-lin
e net
; ignorado para modelos l2
e ssim
--colorspace
: as opções são [ Lab
, RGB
], usadas para os modelos l2
e ssim
; ignorado para modelos net-lin
e net
Bandeiras diversas
--batch_size
: tamanho do lote de avaliação (o padrão será 1)--use_gpu
: ativa este sinalizador para uso de GPU Um exemplo de uso é o seguinte: python ./test_dataset_model.py --dataset_mode 2afc --datasets val/traditional val/cnn --model lpips --net alex --use_gpu --batch_size 50
. Isso avaliaria nosso modelo nos conjuntos de dados de validação “tradicional” e “cnn”.
O conjunto de dados contém dois tipos de julgamentos perceptivos: Duas Escolhas Alternativas Forçadas (2AFC) e Diferenças Apenas Notáveis (JND) .
(1) Os avaliadores 2AFC receberam um trio de patches (1 referência + 2 distorcidos). Eles foram solicitados a selecionar qual dos distorcidos estava “mais próximo” da referência.
Os conjuntos de treinamento contêm 2 julgamentos/tripleto.
train/traditional
[56,6 mil trigêmeos]train/cnn
[38,1 mil trigêmeos]train/mix
[56,6 mil trigêmeos]Os conjuntos de validação contêm 5 julgamentos/tripleto.
val/traditional
[4,7 mil trigêmeos]val/cnn
[4,7 mil trigêmeos]val/superres
[10,9 mil trigêmeos]val/deblur
[9,4 mil trigêmeos]val/color
[4,7 mil trigêmeos]val/frameinterp
[1,9 mil trigêmeos]Cada subdiretório 2AFC contém as seguintes pastas:
ref
: patches de referência originaisp0,p1
: dois patches distorcidosjudge
: julgamentos humanos - 0 se todos preferirem p0, 1 se todos os humanos preferirem p1(2) Os avaliadores do JND receberam dois patches - um de referência e um distorcido - por um tempo limitado. Eles foram questionados se os patches eram iguais (idênticos) ou diferentes.
Cada conjunto contém 3 avaliações/exemplos humanos.
val/traditional
[4,8 mil pares]val/cnn
[4,8 mil pares]Cada subdiretório JND contém as seguintes pastas:
p0,p1
: dois patchessame
: julgamentos humanos: 0 se todos os humanos pensassem que as manchas eram diferentes, 1 se todos os humanos pensassem que as manchas eram iguais Consulte o script train_test_metric.sh
para obter um exemplo de treinamento e teste da métrica. O script treinará um modelo no conjunto de treinamento completo por 10 épocas e, em seguida, testará a métrica aprendida em todos os conjuntos de validação. Os números devem corresponder aproximadamente à linha Alex - lin na Tabela 5 do artigo. O código oferece suporte ao treinamento de uma camada linear sobre uma representação existente. O treinamento adicionará um subdiretório no diretório checkpoints
.
Você também pode treinar versões "scratch" e "tune" executando train_test_metric_scratch.sh
e train_test_metric_tune.sh
, respectivamente.
Se você achar este repositório útil para sua pesquisa, use o seguinte.
@inproceedings{zhang2018perceptual,
title={The Unreasonable Effectiveness of Deep Features as a Perceptual Metric},
author={Zhang, Richard and Isola, Phillip and Efros, Alexei A and Shechtman, Eli and Wang, Oliver},
booktitle={CVPR},
year={2018}
}
Este repositório é parcialmente emprestado do repositório pytorch-CycleGAN-and-pix2pix. O código de precisão média (AP) é emprestado do repositório py-faster-rcnn. Angjoo Kanazawa, Connelly Barnes, Gaurav Mittal, Wilhelmhb, Filippo Mameli, SuperShinyEyes, Minyoung Huh ajudaram a melhorar a base de código.