ประสิทธิผลที่ไม่สมเหตุสมผลของคุณลักษณะเชิงลึกในฐานะตัวชี้วัดการรับรู้
ริชาร์ด จาง, ฟิลลิป อิโซลา, อเล็กซี่ เอ. เอฟรอส, อีไล เชชท์แมน, โอลิเวอร์ หวัง ใน 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
คือ PyTorch Tensor/ตัวแปรที่มีรูปร่าง 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 MB], AlexNet [9.1 MB] และ VGG [58.9 MB] ให้คะแนนใกล้เคียงกัน) และสัญญาณการควบคุมดูแล (ไม่มีการควบคุมดูแล ควบคุมตัวเอง และควบคุมดูแล ล้วนแต่มีประสิทธิภาพอย่างยิ่ง) เราปรับปรุงคะแนนเล็กน้อยโดยเครือข่าย "ปรับเทียบ" เชิงเส้น - เพิ่มเลเยอร์เชิงเส้นที่ด้านบนของเครือข่ายการจัดหมวดหมู่ที่มีจำหน่ายทั่วไป เรามี 3 รูปแบบ โดยใช้เลเยอร์เชิงเส้นที่ด้านบนของเครือข่าย SqueezeNet, AlexNet (ค่าเริ่มต้น) และ VGG
หากคุณใช้ LPIPS ในสิ่งพิมพ์ของคุณ โปรดระบุเวอร์ชันที่คุณใช้ เวอร์ชันปัจจุบันคือ 0.1 คุณสามารถตั้งค่า version='0.0'
สำหรับการเปิดตัวครั้งแรกได้
เรียกใช้ bash ./scripts/download_dataset.sh
เพื่อดาวน์โหลดและแตกชุดข้อมูลลงในไดเร็กทอรี ./dataset
ใช้เวลาทั้งหมด [6.6 GB] หรือเรียกใช้ 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
สำหรับ 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"
ชุดข้อมูลประกอบด้วยการตัดสินการรับรู้สองประเภท: Two Alternative Forced Choice (2AFC) และ Just Noticeable Differences (JND)
(1) ผู้ประเมิน 2AFC ได้รับแพตช์แฝด (1 การอ้างอิง + 2 บิดเบี้ยว) พวกเขาถูกขอให้เลือกว่าข้อใดที่บิดเบี้ยว "ใกล้กว่า" กับข้อมูลอ้างอิงมากกว่า
ชุดฝึกซ้อมประกอบด้วย 2 การตัดสิน/ทริปเปิล
train/traditional
[แฝด 56.6,000]train/cnn
[แฝดสาม 38.1,000]train/mix
[แฝด 56.6,000]ชุดการตรวจสอบประกอบด้วย 5 การตัดสิน/triplet
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
: การตัดสินของมนุษย์ - 0 ถ้าทุกคนชอบ p0, 1 ถ้ามนุษย์ทุกคนชอบ p1(2) ผู้ประเมิน JND ถูกนำเสนอด้วยสองแพตช์ - ข้อมูลอ้างอิงและการบิดเบือน - ในระยะเวลาที่จำกัด พวกเขาถูกถามว่าแผ่นแปะเหมือนกัน (เหมือนกัน) หรือแตกต่างกัน
แต่ละชุดประกอบด้วยการประเมินโดยมนุษย์/ตัวอย่าง 3 รายการ
val/traditional
[4.8k คู่]val/cnn
[4.8k คู่]แต่ละไดเร็กทอรีย่อย 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 ช่วยปรับปรุงโค้ดเบส