Необоснованная эффективность глубоких функций как показателя восприятия
Ричард Чжан, Филипп Изола, Алексей А. Эфрос, Эли Шехтман, Оливер Ванг. В ЦВПР, 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
Оцените расстояние между участками изображения. Выше означает дальше/более другое. Меньше – значит больше похоже.
Примеры сценариев для определения расстояния между двумя конкретными изображениями, всеми соответствующими парами изображений в двух каталогах или всеми парами изображений в каталоге:
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'
. Сеть alex
самая быстрая, работает лучше всего (в качестве прямой метрики) и используется по умолчанию. Для обратного распространения потеря net='vgg'
ближе к традиционной «потере восприятия».lpips=True
. Это добавляет линейную калибровку поверх промежуточных функций в сети. Установите для этого параметра значение lpips=False
чтобы обеспечить одинаковый вес для всех функций. Файл lpips_loss.py
показывает, как итеративно оптимизировать с использованием метрики. Запустите python lpips_loss.py
для демонстрации. Код также можно использовать для реализации ванильных потерь VGG без наших изученных весов.
Выше означает дальше/более другое. Меньше – значит больше похоже.
Мы обнаружили, что глубокая сетевая активация работает на удивление хорошо в качестве показателя сходства восприятия. Это справедливо для сетевых архитектур (SqueezeNet [2,8 МБ], AlexNet [9,1 МБ] и VGG [58,9 МБ] дали одинаковые оценки) и сигналов управления (неконтролируемые, самоконтролируемые и контролируемые — все работают хорошо). Мы немного улучшили показатели за счет линейной «калибровки» сетей — добавления линейного слоя поверх готовых классификационных сетей. Мы предоставляем 3 варианта, используя линейные слои поверх сетей SqueezeNet, AlexNet (по умолчанию) и VGG.
Если вы используете LPIPS в своей публикации, укажите, какую версию вы используете. Текущая версия 0.1. Вы можете установить version='0.0'
для первоначальной версии.
Запустите bash ./scripts/download_dataset.sh
, чтобы загрузить и разархивировать набор данных в каталог ./dataset
. Всего требуется [6,6 ГБ]. Альтернативно, запустите bash ./scripts/download_dataset_valonly.sh
, чтобы загрузить только набор проверки [1,3 ГБ].
Скрипт 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
: включить этот флаг для использования графического процессора. Пример использования следующий: 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) Двум оценщикам AFC был предоставлен тройной патч (1 эталон + 2 искаженных). Им предлагалось выбрать, какое из искажений «ближе» к эталону.
Обучающие наборы содержат 2 суждения/тройку.
train/traditional
[56,6 тыс. троек]train/cnn
[38,1 тыс. троек]train/mix
[56,6 тыс. троек]Наборы проверки содержат 5 суждений/тройку.
val/traditional
[4,7 тыс. троек]val/cnn
[4,7 тыс. троек]val/superres
[10,9 тыс. троек]val/deblur
[9,4 тыс. триплетов]val/color
[4,7 тыс. триплетов]val/frameinterp
[1,9 тыс. триплетов]Каждый подкаталог 2AFC содержит следующие папки:
ref
: оригинальные эталонные патчиp0,p1
: два искаженных патчаjudge
: человеческие суждения - 0, если все предпочитают p0, 1, если все люди предпочитают p1(2) JND Evaluators были представлены два патча - эталонный и искаженный - в течение ограниченного времени. Их спросили, были ли патчи одинаковыми (идентичными) или разными.
Каждый набор содержит 3 человеческих оценки/примера.
val/traditional
[4,8 тыс. пар]val/cnn
[4,8 тыс. пар]Каждый подкаталог JND содержит следующие папки:
p0,p1
: два патчаsame
: человеческие суждения: 0, если все люди думали, что патчи разные, 1, если все люди думали, что патчи одинаковые См. сценарий train_test_metric.sh
для примера обучения и тестирования метрики. Скрипт будет обучать модель на полном обучающем наборе в течение 10 эпох, а затем проверять изученную метрику на всех проверочных наборах. Цифры должны примерно соответствовать строке Алекс-Лин в Таблице 5 статьи. Код поддерживает обучение линейного слоя поверх существующего представления. Обучение добавит подкаталог в каталог checkpoints
.
Вы также можете обучать «чистые» и «настраиваемые» версии, запустив train_test_metric_scratch.sh
и train_test_metric_tune.sh
соответственно.
Если вы найдете этот репозиторий полезным для своих исследований, используйте следующее.
@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. Анджу Канадзава, Коннелли Барнс, Гаурав Миттал, wilhelmhb, Филиппо Мамели, SuperShinyEyes, Минён Ха помогли улучшить кодовую базу.