Die unangemessene Wirksamkeit tiefer Merkmale als Wahrnehmungsmetrik
Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, Oliver Wang. Im CVPR, 2018.
Führen Sie pip install lpips
aus. Der folgende Python-Code ist alles, was Sie brauchen.
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 )
Ausführlichere Informationen zu Varianten finden Sie weiter unten. Dieses Repository enthält unsere Wahrnehmungsmetrik (LPIPS) und unseren Datensatz (BAPPS) . Es kann auch als „Wahrnehmungsverlust“ bezeichnet werden. Dies verwendet PyTorch; Eine Tensorflow-Alternative ist hier.
Inhaltsverzeichnis
pip install -r requirements.txt
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
Bewerten Sie den Abstand zwischen Bildfeldern. Höher bedeutet weiter/anders. Niedriger bedeutet ähnlicher.
Beispielskripte zum Ermitteln des Abstands zwischen zwei bestimmten Bildern, allen entsprechenden Bildpaaren in zwei Verzeichnissen oder allen Bildpaaren innerhalb eines Verzeichnisses:
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
Die Datei test_network.py zeigt eine Beispielverwendung. Dieser Ausschnitt ist alles, was Sie wirklich brauchen.
import lpips
loss_fn = lpips . LPIPS ( net = 'alex' )
d = loss_fn . forward ( im0 , im1 )
Variablen im0, im1
ist ein PyTorch-Tensor/eine PyTorch-Variable mit der Form Nx3xHxW
( N
Patches der Größe HxW
, RGB-Bilder skaliert in [-1,+1]
). Dies gibt d
zurück, einen Tensor/eine Variable der Länge N
Führen Sie python test_network.py
aus, um den Abstand zwischen dem Beispielreferenzbild ex_ref.png
und den verzerrten Bildern ex_p0.png
und ex_p1.png
zu ermitteln. Was sollte Ihrer Meinung nach näher sein, bevor Sie es ausführen?
Einige Optionen Standardmäßig in model.initialize
:
net='alex'
. Netzwerk- alex
ist am schnellsten, bietet die beste Leistung (als Vorwärtsmetrik) und ist die Standardeinstellung. Beim Backpropping liegt der net='vgg'
näher am traditionellen „Wahrnehmungsverlust“.lpips=True
. Dadurch wird zusätzlich zu den Zwischenmerkmalen im Netz eine lineare Kalibrierung hinzugefügt. Setzen Sie dies auf lpips=False
um alle Funktionen gleich zu gewichten. Die Datei lpips_loss.py
zeigt, wie die Metrik iterativ optimiert wird. Führen Sie python lpips_loss.py
für eine Demo aus. Der Code kann auch verwendet werden, um den Vanille-VGG-Verlust zu implementieren, ohne unsere erlernten Gewichte.
Höher bedeutet weiter/anders. Niedriger bedeutet ähnlicher.
Wir haben herausgefunden, dass tiefe Netzwerkaktivierungen als wahrnehmungsbezogene Ähnlichkeitsmetrik überraschend gut funktionieren. Dies galt für alle Netzwerkarchitekturen (SqueezeNet [2,8 MB], AlexNet [9,1 MB] und VGG [58,9 MB] lieferten ähnliche Ergebnisse) und Überwachungssignale (unüberwacht, selbstüberwacht und überwacht weisen alle eine gute Leistung auf). Wir haben die Ergebnisse leicht verbessert, indem wir Netzwerke linear „kalibriert“ haben – indem wir eine lineare Ebene über handelsüblichen Klassifizierungsnetzwerken hinzugefügt haben. Wir bieten drei Varianten an, die lineare Schichten über den Netzwerken SqueezeNet, AlexNet (Standard) und VGG verwenden.
Wenn Sie LPIPS in Ihrer Publikation verwenden, geben Sie bitte an, welche Version Sie verwenden. Die aktuelle Version ist 0.1. Sie können version='0.0'
für die Erstveröffentlichung festlegen.
Führen Sie bash ./scripts/download_dataset.sh
aus, um den Datensatz herunterzuladen und in das Verzeichnis ./dataset
zu entpacken. Insgesamt werden [6,6 GB] benötigt. Alternativ können Sie bash ./scripts/download_dataset_valonly.sh
ausführen, um nur den Validierungssatz [1,3 GB] herunterzuladen.
Das Skript test_dataset_model.py
wertet ein Wahrnehmungsmodell für eine Teilmenge des Datensatzes aus.
Datensatz-Flags
--dataset_mode
: 2afc
oder jnd
, welche Art von Wahrnehmungsurteil ausgewertet werden soll--datasets
: Listen Sie die auszuwertenden Datensätze auf--dataset_mode 2afc
: Auswahlmöglichkeiten sind [ train/traditional
, train/cnn
, val/traditional
, val/cnn
, val/superres
, val/deblur
, val/color
, val/frameinterp
]--dataset_mode jnd
: Auswahlmöglichkeiten sind [ val/traditional
, val/cnn
]Flags für Wahrnehmungsähnlichkeitsmodelle
--model
: Zu verwendendes Wahrnehmungsähnlichkeitsmodelllpips
für unser erlerntes LPIPS-Ähnlichkeitsmodell (lineares Netzwerk zusätzlich zu internen Aktivierungen des vorab trainierten Netzwerks)baseline
für ein Klassifizierungsnetzwerk (unkalibriert mit gemittelter Darstellung aller Schichten)l2
für den euklidischen Abstandssim
für strukturierte Ähnlichkeitsbildmetrik--net
: [ squeeze
, alex
, vgg
] für die Modelle net-lin
und net
; Wird für l2
und ssim
-Modelle ignoriert--colorspace
: Zur Auswahl stehen [ Lab
, RGB
], verwendet für die Modelle l2
und ssim
; Wird für net-lin
und net
-Modelle ignoriertVerschiedene Flaggen
--batch_size
: Bewertungs-Batch-Größe (standardmäßig 1)--use_gpu
: Aktivieren Sie dieses Flag für die GPU-Nutzung Eine Beispielverwendung ist wie folgt: python ./test_dataset_model.py --dataset_mode 2afc --datasets val/traditional val/cnn --model lpips --net alex --use_gpu --batch_size 50
. Dies würde unser Modell anhand der Validierungsdatensätze „traditionell“ und „cnn“ bewerten.
Der Datensatz enthält zwei Arten von Wahrnehmungsurteilen: Two Alternative Forced Choice (2AFC) und Just Noticeable Differences (JND) .
(1) 2AFC- Bewerter erhielten ein Patch-Triplett (1 Referenz + 2 verzerrt). Sie wurden gebeten, auszuwählen, welche der Verzerrungen „näher“ an der Referenz lag.
Trainingssätze enthalten 2 Urteile/Triplett.
train/traditional
[56,6k Drillinge]train/cnn
[38,1k Drillinge]train/mix
[56,6.000 Drillinge]Validierungssätze enthalten 5 Urteile/Triplett.
val/traditional
[4,7k Drillinge]val/cnn
[4,7k Tripletts]val/superres
[10,9.000 Tripletts]val/deblur
[9,4k Tripletts]val/color
[4,7.000 Tripletts]val/frameinterp
[1,9k Tripletts]Jedes 2AFC-Unterverzeichnis enthält die folgenden Ordner:
ref
: Original-Referenzpatchesp0,p1
: zwei verzerrte Patchesjudge
: menschliche Urteile – 0, wenn alle Menschen p0 bevorzugen, 1, wenn alle Menschen p1 bevorzugen(2) Den JND- Evaluatoren wurden für begrenzte Zeit zwei Patches zur Verfügung gestellt – ein Referenz- und ein verzerrter Patch. Sie wurden gefragt, ob die Patches gleich (identisch) oder unterschiedlich seien.
Jeder Satz enthält 3 menschliche Bewertungen/Beispiele.
val/traditional
[4,8.000 Paare]val/cnn
[4,8.000 Paare]Jedes JND-Unterverzeichnis enthält die folgenden Ordner:
p0,p1
: zwei Patchessame
: menschliche Urteile: 0, wenn alle Menschen denken, dass die Flecken unterschiedlich sind, 1, wenn alle Menschen denken, dass die Flecken gleich sind Ein Beispiel für das Training und Testen der Metrik finden Sie im Skript train_test_metric.sh
. Das Skript trainiert ein Modell für 10 Epochen mit dem vollständigen Trainingssatz und testet dann die gelernte Metrik mit allen Validierungssätzen. Die Zahlen sollten ungefähr mit der Alex-Lin- Zeile in Tabelle 5 in der Arbeit übereinstimmen. Der Code unterstützt das Training einer linearen Ebene über einer vorhandenen Darstellung. Durch Training wird ein Unterverzeichnis im checkpoints
-Verzeichnis hinzugefügt.
Sie können auch die Versionen „scratch“ und „tune“ trainieren, indem Sie train_test_metric_scratch.sh
bzw. train_test_metric_tune.sh
ausführen.
Wenn Sie dieses Repository für Ihre Forschung nützlich finden, verwenden Sie bitte Folgendes.
@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}
}
Dieses Repository lehnt sich teilweise an das pytorch-CycleGAN-and-pix2pix-Repository an. Der AP-Code (Average Precision) wird aus dem py-faster-rcnn-Repository ausgeliehen. Angjoo Kanazawa, Connelly Barnes, Gaurav Mittal, wilhelmhb, Filippo Mameli, SuperShinyEyes und Minyoung Huh halfen bei der Verbesserung der Codebasis.