知覚指標としての深い特徴の不合理な効果
リチャード・チャン、フィリップ・イソラ、アレクセイ・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.8 MB]、AlexNet [9.1 MB]、および VGG [58.9 MB] が同様のスコアを示した) と監視信号 (教師なし、自己教師あり、教師ありのすべてが強力なパフォーマンスを示しました) 全体に当てはまります。ネットワークを線形に「調整」し、既製の分類ネットワークの上に線形層を追加することで、スコアをわずかに改善しました。 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.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
(事前学習済みネットワークの内部活性化上の線形ネットワーク)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
。これにより、「traditional」および「cnn」検証データセットに基づいてモデルが評価されます。
データセットには、2 つのタイプの知覚判断、 Two Alternative Forced Choice (2AFC)とJust Noticeable Differences (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
: 2 つの歪んだパッチjudge
: 人間の判断 - すべての人間が p0 を好む場合は 0、すべての人間が p1 を好む場合は 1(2) JND評価者には、期間限定で 2 つのパッチ (リファレンスと歪んだパッチ) が提示されました。彼らは、パッチが同じ(同一である)か、それとも異なるかを尋ねられました。
各セットには 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
をそれぞれ実行して、「スクラッチ」バージョンと「調整」バージョンをトレーニングすることもできます。
このリポジトリが研究に役立つと思われる場合は、以下を使用してください。
@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 Canadian 氏、Connelly Barnes 氏、Gaurav Mittal 氏、wilhelmhb 氏、Filippo Mameli 氏、SuperShinyEyes 氏、Minyoung Huh 氏がコードベースの改善に協力してくれました。