感知相似性度量与数据集 [项目页面]
深度特征作为感知度量的非凡有效性
Richard Zhang,Phillip Isola,Alexei A. Efros,Eli Shechtman,Oliver Wang。发表于 CVPR,2018。
快速开始
运行 pip install lpips
。下面的 Python 代码就是你所需要的。
import lpips
loss_fn_alex = lpips.LPIPS(net='alex') # 最优前向评分
loss_fn_vgg = lpips.LPIPS(net='vgg') # 更接近“传统”感知损失,用于优化时
import torch
img0 = torch.zeros(1,3,64,64) # 图像应为 RGB,重要:归一化到 [-1,1]
img1 = torch.zeros(1,3,64,64)
d = loss_fn_alex(img0, img1)
下面是关于变体的更详细的信息。这个仓库包含我们的 感知度量(LPIPS) 和 数据集(BAPPS)。它也可用作“感知损失”。这是基于 PyTorch 的;一个 TensorFlow 的替代方案在这里。
目录
- 学习的感知图像补丁相似性(LPIPS)度量
a. 基本用法 如果你只想在命令行运行度量,这就是你所需要的。
b. “感知损失”用法
c. 关于度量 - 伯克利-Adobe 感知补丁相似性(BAPPS)数据集
a. 下载
b. 评估
c. 关于数据集
d. 使用数据集训练度量
(0) 依赖项/设置
安装
- 从 http://pytorch.org 安装 PyTorch 1.0+ 和 torchvision
pip install -r requirements.txt
- 克隆这个仓库:
git clone https://github.com/richzhang/PerceptualSimilarity
cd PerceptualSimilarity
(1) 学习的感知图像补丁相似性(LPIPS)度量
评估图像补丁之间的距离。距离越大表示越远/越不同。距离越小表示越相似。
(A) 基本用法
(A.I) 命令行指令
以下是一些示例脚本,用于计算两张特定图像之间的距离,两个目录中所有对应图像对之间的距离,或一个目录中的所有图像对之间的距离:
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
(A.II) Python 代码
文件 test_network.py 显示了示例用法。这段代码就是所有你真正需要的。
import lpips
loss_fn = lpips.LPIPS(net='alex')
d = loss_fn.forward(im0,im1)
变量im0, im1
是一个形状为 Nx3xHxW
的 PyTorch Tensor/Variable(N
个大小为HxW
、经过尺度缩放至 [-1,+1]
的 RGB 图像)。这将返回 d
,一个长度为 N
的 Tensor/Variable。
运行 python test_network.py
,以计算示例参考图像 ex_ref.png
与失真图像 ex_p0.png
和 ex_p1.png
之间的距离。在运行它之前,你认为哪个 应该 比较接近?
一些选择 在默认的model.initialize
中:
- 默认设置为
net='alex'
。alex
网络速度最快,表现最佳(作为前向度量),并且是默认设置。对于反向传播,net='vgg'
的损失更接近传统的“感知损失”。 - 默认设置为
lpips=True
。它在网络的中间特征上添加了线性校准。设置lpips=False
以平均加权所有特征。
(B) 通过度量进行反向传播
文件 lpips_loss.py
显示了如何使用该度量进行迭代优化。运行 python lpips_loss.py
进行演示。该代码也可用于实现基本的 VGG 损失,而无需我们的学习权重。
(C) 关于度量
距离越高表示越远/越不同。距离越低表示越相似。
我们发现深度网络激活在作为感知相似性度量时效果出奇地好。在网络架构(SqueezeNet [2.8 MB],AlexNet [9.1 MB],和 VGG [58.9 MB] 中提供相似的分数)和监督信号(无监督、自监督和有监督皆表现强劲)之间情况都相同。通过对网络进行线性“校准”——在现有分类网络上添加线性层,我们略微提高了分数。我们提供了三种变体,在 SqueezeNet、AlexNet(默认)和 VGG 网络上添加线性层。
如果你在发表的文章中使用了 LPIPS,请指明你使用的版本。当前版本是 0.1。你可以设置version='0.0'
以使用初始版本。
(2) 伯克利-Adobe 感知补丁相似性(BAPPS)数据集
(A) 下载数据集
运行 bash ./scripts/download_dataset.sh
下载并解压数据集到目录 ./dataset
。总共需要 [6.6 GB]。或者,运行 bash ./scripts/download_dataset_valonly.sh
仅下载验证集 [1.3 GB]。
- 2AFC 训练集 [5.3 GB]
- 2AFC 验证集 [1.1 GB]
- JND 验证集 [0.2 GB]
(B) 在数据集上评估感知相似性度量
脚本 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”验证数据集上的表现。
(C) 关于数据集
数据集包含两种类型的感知判断:两项强制选择 (2AFC) 和 刚好能察觉的差异 (JND)。
(1) 2AFC 评估者得到一个补丁三重组合(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
(D) 使用数据集训练度量
参见脚本 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 帮助改进了代码库。