深层特征作为感知指标的不合理有效性
张理查德、菲利普·伊索拉、阿列克谢·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 帮助改进了代码库。