L'efficacité déraisonnable des fonctionnalités profondes en tant que métrique de perception
Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, Oliver Wang. Dans CVPR, 2018.
Exécutez pip install lpips
. Le code Python suivant est tout ce dont vous avez besoin.
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 )
Des informations plus détaillées sur les variantes sont disponibles ci-dessous. Ce référentiel contient notre métrique perceptuelle (LPIPS) et notre ensemble de données (BAPPS) . Elle peut également être utilisée comme une « perte de perception ». Cela utilise PyTorch ; une alternative à Tensorflow est ici.
Table des matières
pip install -r requirements.txt
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
Évaluez la distance entre les patchs d’image. Plus haut signifie plus loin/plus différent. Plus bas signifie plus similaire.
Exemples de scripts pour prendre la distance entre 2 images spécifiques, toutes les paires d'images correspondantes dans 2 répertoires, ou toutes les paires d'images dans un répertoire :
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
Le fichier test_network.py montre un exemple d'utilisation. Cet extrait est tout ce dont vous avez vraiment besoin.
import lpips
loss_fn = lpips . LPIPS ( net = 'alex' )
d = loss_fn . forward ( im0 , im1 )
Variables im0, im1
est un tenseur/variable PyTorch de forme Nx3xHxW
( N
patchs de taille HxW
, images RVB mises à l'échelle en [-1,+1]
). Cela renvoie d
, une longueur N
Tensor/Variable.
Exécutez python test_network.py
pour prendre la distance entre l'exemple d'image de référence ex_ref.png
et les images déformées ex_p0.png
et ex_p1.png
. Avant de le lancer, lequel devrait, selon vous, être le plus proche ?
Quelques options Par défaut dans model.initialize
:
net='alex'
. Le réseau alex
est le plus rapide, fonctionne le mieux (en tant que métrique directe) et constitue la valeur par défaut. Pour le backpropping, la perte net='vgg'
est plus proche de la "perte perceptuelle" traditionnelle.lpips=True
. Cela ajoute un calibrage linéaire au-dessus des fonctionnalités intermédiaires du réseau. Définissez ceci sur lpips=False
pour pondérer de manière égale toutes les fonctionnalités. Le fichier lpips_loss.py
montre comment optimiser de manière itérative à l'aide de la métrique. Exécutez python lpips_loss.py
pour une démo. Le code peut également être utilisé pour implémenter la perte de VGG vanille, sans nos poids appris.
Plus haut signifie plus loin/plus différent. Plus bas signifie plus similaire.
Nous avons constaté que les activations de réseaux profonds fonctionnent étonnamment bien comme mesure de similarité perceptuelle. Cela était vrai pour toutes les architectures de réseau (SqueezeNet [2,8 Mo], AlexNet [9,1 Mo] et VGG [58,9 Mo] ont fourni des scores similaires) et les signaux de supervision (non supervisés, auto-supervisés et supervisés fonctionnent tous très bien). Nous avons légèrement amélioré les scores en « calibrant » les réseaux de manière linéaire – en ajoutant une couche linéaire au-dessus des réseaux de classification disponibles dans le commerce. Nous proposons 3 variantes, utilisant des couches linéaires au-dessus des réseaux SqueezeNet, AlexNet (par défaut) et VGG.
Si vous utilisez LPIPS dans votre publication, veuillez préciser la version que vous utilisez. La version actuelle est la 0.1. Vous pouvez définir version='0.0'
pour la version initiale.
Exécutez bash ./scripts/download_dataset.sh
pour télécharger et décompresser l'ensemble de données dans le répertoire ./dataset
. Cela prend [6,6 Go] au total. Vous pouvez également exécuter bash ./scripts/download_dataset_valonly.sh
pour télécharger uniquement l'ensemble de validation [1,3 Go].
Le script test_dataset_model.py
évalue un modèle perceptuel sur un sous-ensemble de l'ensemble de données.
Indicateurs d'ensemble de données
--dataset_mode
: 2afc
ou jnd
, quel type de jugement perceptuel évaluer--datasets
: liste les ensembles de données à évaluer--dataset_mode 2afc
: les choix sont [ train/traditional
, train/cnn
, val/traditional
, val/cnn
, val/superres
, val/deblur
, val/color
, val/frameinterp
]--dataset_mode jnd
: les choix sont [ val/traditional
, val/cnn
]Indicateurs du modèle de similarité perceptuelle
--model
: modèle de similarité perceptuelle à utiliserlpips
pour notre modèle de similarité apprise LPIPS (réseau linéaire au-dessus des activations internes du réseau pré-entraîné)baseline
pour un réseau de classification (non calibré avec toutes les couches moyennées)l2
pour la distance euclidiennessim
pour la métrique d'image de similarité structurée--net
: [ squeeze
, alex
, vgg
] pour les modèles net-lin
et net
; ignoré pour les modèles l2
et ssim
--colorspace
: les choix sont [ Lab
, RGB
], utilisés pour les modèles l2
et ssim
; ignoré pour les modèles net-lin
et net
Divers drapeaux
--batch_size
: taille du lot d'évaluation (par défaut : 1)--use_gpu
: active cet indicateur pour l'utilisation du GPU Un exemple d'utilisation est le suivant : python ./test_dataset_model.py --dataset_mode 2afc --datasets val/traditional val/cnn --model lpips --net alex --use_gpu --batch_size 50
. Cela évaluerait notre modèle sur les ensembles de données de validation « traditionnels » et « cnn ».
L'ensemble de données contient deux types de jugements perceptuels : deux choix forcés alternatifs (2AFC) et des différences juste perceptibles (JND) .
(1) Les évaluateurs 2AFC ont reçu un triplet de patch (1 référence + 2 déformés). Il leur a été demandé de sélectionner laquelle des distorsions était « la plus proche » de la référence.
Les ensembles d’entraînement contiennent 2 jugements/triplet.
train/traditional
[56,6k triplets]train/cnn
[38,1k triplés]train/mix
[56,6k triplés]Les ensembles de validation contiennent 5 jugements/triplet.
val/traditional
[4,7k triplés]val/cnn
[4,7k triplés]val/superres
[10,9k triplés]val/deblur
[9,4k triplés]val/color
[4,7k triplets]val/frameinterp
[1,9k triplets]Chaque sous-répertoire 2AFC contient les dossiers suivants :
ref
: patchs de référence originauxp0,p1
: deux patchs déformésjudge
: jugements humains - 0 si tous préféraient p0, 1 si tous les humains préféraient p1(2) Les évaluateurs du JND ont reçu deux correctifs - un de référence et un déformé - pour une durée limitée. On leur a demandé si les correctifs étaient identiques (identiquement) ou différents.
Chaque ensemble contient 3 évaluations humaines/exemple.
val/traditional
[4,8k paires]val/cnn
[4,8k paires]Chaque sous-répertoire JND contient les dossiers suivants :
p0,p1
: deux patchssame
: jugements humains : 0 si tous les humains pensaient que les correctifs étaient différents, 1 si tous les humains pensaient que les correctifs étaient identiques Voir le script train_test_metric.sh
pour un exemple de formation et de test de la métrique. Le script entraînera un modèle sur l'ensemble de formation complet pendant 10 époques, puis testera la métrique apprise sur tous les ensembles de validation. Les chiffres doivent correspondre à peu près à la ligne Alex-lin du tableau 5 du document. Le code prend en charge la formation d'une couche linéaire au-dessus d'une représentation existante. La formation ajoutera un sous-répertoire dans le répertoire checkpoints
.
Vous pouvez également entraîner les versions "scratch" et "tune" en exécutant respectivement train_test_metric_scratch.sh
et train_test_metric_tune.sh
.
Si vous trouvez ce référentiel utile pour votre recherche, veuillez utiliser ce qui suit.
@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}
}
Ce référentiel emprunte partiellement au référentiel pytorch-CycleGAN-and-pix2pix. Le code de précision moyenne (AP) est emprunté au référentiel py-faster-rcnn. Angjoo Kanazawa, Connelly Barnes, Gaurav Mittal, wilhelmhb, Filippo Mameli, SuperShinyEyes, Minyoung Huh ont contribué à améliorer la base de code.