Efektivitas Fitur Mendalam yang Tidak Masuk Akal sebagai Metrik Perseptual
Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman, Oliver Wang. Di CVPR, 2018.
Jalankan pip install lpips
. Hanya kode Python berikut yang Anda perlukan.
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 )
Informasi lebih lengkap mengenai varian ada di bawah. Repositori ini berisi metrik persepsi (LPIPS) dan kumpulan data (BAPPS) kami. Ini juga bisa digunakan sebagai "kehilangan persepsi". Ini menggunakan PyTorch; alternatif Tensorflow ada di sini.
Daftar isi
pip install -r requirements.txt
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
Evaluasi jarak antar patch gambar. Lebih tinggi berarti lebih jauh/lebih berbeda. Lebih rendah berarti lebih mirip.
Contoh skrip untuk mengambil jarak antara 2 gambar tertentu, semua pasangan gambar yang sesuai dalam 2 direktori, atau semua pasangan gambar dalam satu direktori:
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
File test_network.py menunjukkan contoh penggunaan. Cuplikan ini adalah semua yang Anda butuhkan.
import lpips
loss_fn = lpips . LPIPS ( net = 'alex' )
d = loss_fn . forward ( im0 , im1 )
Variabel im0, im1
adalah Tensor/Variabel PyTorch dengan bentuk Nx3xHxW
( N
patch berukuran HxW
, gambar RGB berskala [-1,+1]
). Ini mengembalikan d
, Tensor/Variabel dengan panjang N
Jalankan python test_network.py
untuk mengambil jarak antara contoh gambar referensi ex_ref.png
ke gambar terdistorsi ex_p0.png
dan ex_p1.png
. Sebelum menjalankannya - menurut Anda mana yang lebih dekat?
Beberapa Opsi Secara default di model.initialize
:
net='alex'
. Jaringan alex
adalah yang tercepat, berkinerja terbaik (sebagai metrik penerusan), dan merupakan default. Untuk backpropping, kerugian net='vgg'
lebih mirip dengan "kerugian persepsi" tradisional.lpips=True
. Ini menambahkan kalibrasi linier di atas fitur perantara di internet. Setel ini ke lpips=False
untuk memberi bobot yang sama pada semua fitur. File lpips_loss.py
menunjukkan cara mengoptimalkan secara berulang menggunakan metrik. Jalankan python lpips_loss.py
untuk demo. Kode ini juga dapat digunakan untuk mengimplementasikan kerugian Vanilla VGG, tanpa bobot yang kita pelajari.
Lebih tinggi berarti lebih jauh/lebih berbeda. Lebih rendah berarti lebih mirip.
Kami menemukan bahwa aktivasi jaringan dalam bekerja dengan sangat baik sebagai metrik kesamaan persepsi. Hal ini berlaku di seluruh arsitektur jaringan (SqueezeNet [2,8 MB], AlexNet [9,1 MB], dan VGG [58,9 MB] memberikan skor yang serupa) dan sinyal pengawasan (tanpa pengawasan, pengawasan mandiri, dan diawasi semuanya memiliki kinerja yang kuat). Kami sedikit meningkatkan skor dengan "mengkalibrasi" jaringan secara linier - menambahkan lapisan linier di atas jaringan klasifikasi siap pakai. Kami menyediakan 3 varian, menggunakan lapisan linier di atas jaringan SqueezeNet, AlexNet (default), dan VGG.
Jika Anda menggunakan LPIPS dalam publikasi Anda, harap tentukan versi mana yang Anda gunakan. Versi saat ini adalah 0,1. Anda dapat mengatur version='0.0'
untuk rilis awal.
Jalankan bash ./scripts/download_dataset.sh
untuk mengunduh dan mengekstrak kumpulan data ke dalam direktori ./dataset
. Dibutuhkan total [6,6 GB]. Alternatifnya, jalankan bash ./scripts/download_dataset_valonly.sh
untuk hanya mengunduh set validasi [1,3 GB].
Skrip test_dataset_model.py
mengevaluasi model persepsi pada subset kumpulan data.
Tanda kumpulan data
--dataset_mode
: 2afc
atau jnd
, jenis penilaian persepsi mana yang akan dievaluasi--datasets
: daftar kumpulan data yang akan dievaluasi--dataset_mode 2afc
: pilihannya adalah [ train/traditional
, train/cnn
, val/traditional
, val/cnn
, val/superres
, val/deblur
, val/color
, val/frameinterp
]--dataset_mode jnd
: pilihannya adalah [ val/traditional
, val/cnn
]Bendera model kesamaan persepsi
--model
: model kesamaan persepsi yang akan digunakanlpips
untuk model kesamaan yang dipelajari LPIPS kami (jaringan linier di atas aktivasi internal jaringan yang telah dilatih sebelumnya)baseline
untuk jaringan klasifikasi (tidak dikalibrasi dengan rata-rata semua lapisan)l2
untuk jarak Euclideanssim
untuk Metrik Gambar Kesamaan Terstruktur--net
: [ squeeze
, alex
, vgg
] untuk model net-lin
dan net
; diabaikan untuk model l2
dan ssim
--colorspace
: pilihannya adalah [ Lab
, RGB
], digunakan untuk model l2
dan ssim
; diabaikan untuk model net-lin
dan net
Bendera lain-lain
--batch_size
: ukuran kumpulan evaluasi (defaultnya adalah 1)--use_gpu
: aktifkan tanda ini untuk penggunaan GPU Contoh penggunaannya adalah sebagai berikut: python ./test_dataset_model.py --dataset_mode 2afc --datasets val/traditional val/cnn --model lpips --net alex --use_gpu --batch_size 50
. Ini akan mengevaluasi model kami pada kumpulan data validasi "tradisional" dan "cnn".
Kumpulan data berisi dua jenis penilaian persepsi: Two Alternative Forced Choice (2AFC) dan Just Noticeable Differences (JND) .
(1) Evaluator 2AFC diberi patch triplet (1 referensi + 2 terdistorsi). Mereka diminta untuk memilih distorsi mana yang "lebih dekat" dengan referensi.
Set pelatihan berisi 2 penilaian/triplet.
train/traditional
[56.6k kembar tiga]train/cnn
[38.1k kembar tiga]train/mix
[56,6 ribu kembar tiga]Set validasi berisi 5 penilaian/triplet.
val/traditional
[4,7 ribu kembar tiga]val/cnn
[4,7 ribu kembar tiga]val/superres
[10.9k kembar tiga]val/deblur
[9,4 ribu kembar tiga]val/color
[4,7k kembar tiga]val/frameinterp
[1,9 ribu kembar tiga]Setiap subdirektori 2AFC berisi folder berikut:
ref
: patch referensi aslip0,p1
: dua patch yang terdistorsijudge
: penilaian manusia - 0 jika semua orang menyukai p0, 1 jika semua manusia menyukai p1(2) Evaluator JND diberikan dua tambalan - referensi dan distorsi - untuk waktu terbatas. Mereka ditanya apakah patchnya sama (identik) atau berbeda.
Setiap set berisi 3 evaluasi/contoh manusia.
val/traditional
[4,8k pasang]val/cnn
[4,8k pasang]Setiap subdirektori JND berisi folder berikut:
p0,p1
: dua tambalansame
: penilaian manusia: 0 jika semua manusia menganggap tambalan itu berbeda, 1 jika semua manusia menganggap tambalan itu sama Lihat skrip train_test_metric.sh
untuk contoh pelatihan dan pengujian metrik. Skrip akan melatih model pada set pelatihan penuh selama 10 periode, lalu menguji metrik yang dipelajari pada semua set validasi. Angka-angka tersebut kira-kira harus sesuai dengan baris Alex - lin pada Tabel 5 di koran. Kode ini mendukung pelatihan lapisan linier di atas representasi yang sudah ada. Pelatihan akan menambahkan subdirektori di direktori checkpoints
.
Anda juga dapat melatih versi "scratch" dan "tune" dengan menjalankan masing-masing train_test_metric_scratch.sh
dan train_test_metric_tune.sh
.
Jika Anda merasa repositori ini berguna untuk penelitian Anda, silakan gunakan repositori berikut ini.
@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}
}
Repositori ini meminjam sebagian dari repositori pytorch-CycleGAN-and-pix2pix. Kode presisi rata-rata (AP) dipinjam dari repositori py-faster-rcnn. Angjoo Kanazawa, Connelly Barnes, Gaurav Mittal, wilhelmhb, Filippo Mameli, SuperShinyEyes, Minyoung Huh membantu meningkatkan basis kode.