الفعالية غير المعقولة للميزات العميقة كمقياس إدراكي
ريتشارد تشانغ، فيليب إيزولا، أليكسي أ. إفروس، إيلي شيختمان، أوليفر وانغ. في CVPR، 2018.
قم بتشغيل pip install lpips
. كود بايثون التالي هو كل ما تحتاجه.
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
Tensor/Variable.
قم بتشغيل 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 ميجابايت]، و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
: قم بتشغيل هذه العلامة لاستخدام 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) تم منح مقيمي 2AFC تصحيحًا ثلاثيًا (مرجع واحد + 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.4k ثلاثة توائم]val/color
[4.7k ثلاثة توائم]val/frameinterp
[1.9k ثلاثة توائم]يحتوي كل دليل فرعي 2AFC على المجلدات التالية:
ref
: البقع المرجعية الأصليةp0,p1
: رقعتان مشوهتانjudge
: الأحكام البشرية - 0 إذا فضل جميع البشر p0، 1 إذا فضل جميع البشر p1(2) تم تقديم تصحيحين لمقيمي JND - مرجع ومشوه - لفترة محدودة. تم سؤالهم عما إذا كانت البقع هي نفسها (متطابقة) أم مختلفة.
تحتوي كل مجموعة على 3 تقييمات/أمثلة بشرية.
val/traditional
[4.8 ألف زوج]val/cnn
[4.8 ألف زوج]يحتوي كل دليل فرعي JND على المجلدات التالية:
p0,p1
: رقعتانsame
: الأحكام البشرية: 0 إذا اعتقد جميع البشر أن البقع مختلفة، 1 إذا اعتقد جميع البشر أن البقع متشابهة راجع البرنامج النصي train_test_metric.sh
للحصول على مثال للتدريب واختبار المقياس. سيقوم البرنامج النصي بتدريب نموذج على مجموعة التدريب الكاملة لمدة 10 فترات، ثم يختبر المقياس الذي تم تعلمه على جميع مجموعات التحقق من الصحة. يجب أن تتطابق الأرقام تقريبًا مع صف Alex-lin في الجدول 5 في الورقة. يدعم الكود تدريب طبقة خطية أعلى التمثيل الموجود. سيقوم التدريب بإضافة دليل فرعي في دليل checkpoints
.
يمكنك أيضًا تدريب الإصدارين "scratch" و"tune" عن طريق تشغيل 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 Kanazawa وConnelly Barnes وGaurav Mittal وwilhelmhb وFilippo Mameli وSuperShinyEyes وMinyoung Huh في تحسين قاعدة التعليمات البرمجية.