지각 지표로서의 심층 특징의 비합리적인 효과
리처드 장, 필립 이솔라, 알렉세이 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
은 Nx3xHxW
모양의 PyTorch 텐서/변수입니다( HxW
크기의 N
패치, [-1,+1]
크기의 RGB 이미지). 이는 길이가 N
텐서/변수인 d
반환합니다.
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.8MB], AlexNet [9.1MB] 및 VGG [58.9MB]가 유사한 점수 제공) 및 감독 신호(비지도, 자체 감독 및 감독 모두 강력한 성능을 나타냄) 전반에 걸쳐 사실이었습니다. 우리는 네트워크를 선형적으로 "보정"하여 기성 분류 네트워크 위에 선형 레이어를 추가함으로써 점수를 약간 향상시켰습니다. 우리는 SqueezeNet, AlexNet(기본값) 및 VGG 네트워크 위에 선형 레이어를 사용하는 3가지 변형을 제공합니다.
출판물에 LPIPS를 사용하는 경우 사용 중인 버전을 지정하십시오. 현재 버전은 0.1입니다. 초기 릴리스의 경우 version='0.0'
설정할 수 있습니다.
bash ./scripts/download_dataset.sh
실행하여 데이터 세트를 ./dataset
디렉토리에 다운로드하고 압축을 풉니다. 총 [6.6GB]가 소요됩니다. 또는 bash ./scripts/download_dataset_valonly.sh
실행하여 검증 세트[1.3GB]만 다운로드하세요.
스크립트 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
(사전 훈련된 네트워크의 내부 활성화 위에 선형 네트워크)baseline
(모든 레이어의 평균을 계산하여 보정되지 않음)l2
ssim
--net
: net-lin
및 net
모델의 경우 [ squeeze
, alex
, vgg
]; 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(Two Alternative Forced Choice) 와 JND(Just Notable Differences)라는 두 가지 유형의 지각 판단이 포함되어 있습니다.
(1) 2AFC 평가자에게는 패치 3개(참조 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
: 패치 2개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, 허민영이 코드베이스 개선에 도움을 주었습니다.