深層特徵作為感知指標的不合理有效性
張理查德、菲利普·伊索拉、阿列克謝·A·埃夫羅斯、伊萊·謝赫特曼、奧利弗·王。在 CVPR,2018 年。
運行pip install lpips
。下面的 Python 程式碼就是您所需要的。
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 )
有關變體的更詳細資訊如下。此儲存庫包含我們的感知指標(LPIPS)和資料集(BAPPS) 。它也可以被用作“知覺損失”。這使用 PyTorch; Tensorflow 替代方案就在這裡。
目錄
pip install -r requirements.txt
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
評估影像區塊之間的距離。更高意味著更進一步/更不同。越低意味著越相似。
用於取得 2 個特定影像、2 個目錄中所有對應影像對或目錄中所有影像對之間的距離的範例腳本:
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
檔案 test_network.py 顯示了範例用法。這個片段就是您真正需要的。
import lpips
loss_fn = lpips . LPIPS ( net = 'alex' )
d = loss_fn . forward ( im0 , im1 )
變數im0, im1
是一個 PyTorch 張量/變量,形狀為Nx3xHxW
( N
大小為HxW
的補丁,RGB 影像按[-1,+1]
縮放)。這將傳回d
,一個長度N
張量/變數。
執行python test_network.py
取得範例參考映像ex_ref.png
到扭曲映像ex_p0.png
和ex_p1.png
之間的距離。在運行之前 - 您認為哪個應該更接近?
model.initialize
中預設的一些選項:
net='alex'
。 Network alex
速度最快,效能最好(作為轉送指標),並且是預設值。對於反向傳播, net='vgg'
損失更接近傳統的「感知損失」。lpips=True
。這在網路中的中間特徵之上添加了線性校準。將其設為lpips=False
以對所有特徵進行同等權重。檔案lpips_loss.py
顯示如何使用該指標進行迭代優化。運行python lpips_loss.py
進行演示。該程式碼還可以用於實現普通 VGG 損失,而無需我們學習的權重。
更高意味著更進一步/更不同。越低意味著越相似。
我們發現深度網路活化作為感知相似性度量的效果出乎意料地好。這在網路架構(SqueezeNet [2.8 MB]、AlexNet [9.1 MB] 和 VGG [58.9 MB] 提供相似的分數)和監督訊號(無監督、自監督和監督均表現強勁)中都是如此。我們透過線性「校準」網路(在現成的分類網路之上添加線性層)略微提高了分數。我們提供 3 種變體,在 SqueezeNet、AlexNet(預設)和 VGG 網路之上使用線性層。
如果您在出版品中使用 LPIPS,請指定您使用的版本。目前版本是0.1。您可以為初始版本設定version='0.0'
。
執行bash ./scripts/download_dataset.sh
下載資料集並將其解壓縮到目錄./dataset
中。總共需要 [6.6 GB]。或者,執行bash ./scripts/download_dataset_valonly.sh
以僅下載驗證集 [1.3 GB]。
腳本test_dataset_model.py
在資料集的子集上評估感知模型。
資料集標誌
--dataset_mode
: 2afc
或jnd
,評估哪種類型的感知判斷--datasets
:列出要評估的資料集--dataset_mode 2afc
:選擇是 [ train/traditional
、 train/cnn
、 val/traditional
、 val/cnn
、 val/superres
、 val/deblur
、 val/color
、 val/frameinterp
]--dataset_mode jnd
:選擇是 [ val/traditional
, val/cnn
]感知相似性模型標誌
--model
:要使用的感知相似性模型lpips
用於我們的 LPIPS 學習相似性模型(預訓練網路內部活化之上的線性網路)baseline
(未校準,所有層均取平均值)l2
為歐氏距離ssim
--net
: [ squeeze
, alex
, vgg
] 用於net-lin
和net
模型; l2
和ssim
模型被忽略--colorspace
:選擇為 [ Lab
, RGB
],用於l2
和ssim
模型;對於net-lin
和net
模型被忽略雜項標誌
--batch_size
:評估批次大小(預設為 1)--use_gpu
:開啟此標誌使用 GPU範例用法如下: python ./test_dataset_model.py --dataset_mode 2afc --datasets val/traditional val/cnn --model lpips --net alex --use_gpu --batch_size 50
。這將在「傳統」和「cnn」驗證資料集上評估我們的模型。
此資料集包含兩種類型的感知判斷:兩種替代強制選擇(2AFC)和只是可注意到的差異(JND) 。
(1) 2 個 AFC評估者獲得了一個補丁三元組(1 個參考 + 2 個失真)。他們被要求選擇哪一個扭曲的「更接近」參考。
訓練集包含 2 個判斷/三元組。
train/traditional
[56.6k 三胞胎]train/cnn
[38.1k 三元組]train/mix
[56.6k 三元組]驗證集包含 5 個判斷/三元組。
val/traditional
[4.7k 三元組]val/cnn
[4.7k 三元組]val/superres
[10.9k 三元組]val/deblur
[9.4k 三元組]val/color
[4.7k 三元組]val/frameinterp
[1.9k 三元組]每個 2AFC 子目錄包含以下資料夾:
ref
: 原始參考補丁p0,p1
:兩個扭曲的補丁judge
:人類判斷 - 如果所有人都喜歡 p0,則為 0;如果所有人都喜歡 p1,則為 1(2) JND評估人員在有限的時間內獲得了兩個補丁 - 一個參考補丁和一個扭曲補丁。他們被問及補丁是否相同(相同)或不同。
每組包含 3 個人工評估/範例。
val/traditional
[4.8k 對]val/cnn
[4.8k 對]每個 JND 子目錄包含以下資料夾:
p0,p1
:兩個補丁same
:人類判斷:如果所有人都認為補丁不同,則為 0;如果所有人都認為補丁相同,則為 1有關訓練和測試指標的範例,請參閱腳本train_test_metric.sh
。該腳本將在完整訓練集上訓練模型 10 個時期,然後在所有驗證集上測試學習到的指標。這些數字應該大致匹配論文中表 5 中的Alex - lin行。此程式碼支援在現有表示之上訓練線性層。訓練會在checkpoints
目錄中新增一個子目錄。
您也可以分別執行train_test_metric_scratch.sh
和train_test_metric_tune.sh
來訓練「scratch」和「tune」版本。
如果您發現此儲存庫對您的研究有用,請使用以下內容。
@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}
}
此儲存庫部分借鑒了 pytorch-CycleGAN-and-pix2pix 儲存庫。平均精度(AP)程式碼是從 py-faster-rcnn 儲存庫借用的。 Angjoo Kanazawa、Connelly Barnes、Gaurav Mittal、wilhelmhb、Filippo Mameli、SuperShinyEyes、Minyoung Huh 幫助改進了程式碼庫。