- [26-10-2566] เพิ่มแบ็คโบน DINOv2 พร้อมรีจิสเตอร์ ตามหลัง Vision Transformers Need Registers
การวิจัย Meta AI ยุติธรรม
มักซีม โอกอบ, ทิโมธี ดาร์เซต์, ธีโอ มูตาคานนี, ฮุย วี. โว, มาร์ค ซาฟราเนียค, วาซิล คาลิดอฟ, แพทริค ลาบาตุต, อาร์มันด์ จูลิน, พิโอเตอร์ โบจาโนฟสกี้
[ Paper #1
] Paper #2
] [ Blog
] [ Demo
] [ BibTeX
]
การใช้งาน PyTorch และโมเดลที่ได้รับการฝึกล่วงหน้าสำหรับ DINOv2 สำหรับรายละเอียด โปรดดูเอกสาร: DINOv2: การเรียนรู้คุณลักษณะด้านภาพที่มีประสิทธิภาพโดยไม่ต้องมีการควบคุมดูแล และ การมองเห็น Transformers Need Registers
โมเดล DINOv2 สร้างคุณสมบัติการมองเห็นที่มีประสิทธิภาพสูงซึ่งสามารถนำไปใช้โดยตรงกับตัวแยกประเภทได้ง่ายเหมือนกับเลเยอร์เชิงเส้นในงานคอมพิวเตอร์วิทัศน์ที่หลากหลาย คุณลักษณะด้านภาพเหล่านี้มีประสิทธิภาพและทำงานได้ดีทั่วทั้งโดเมนโดยไม่มีข้อกำหนดในการปรับแต่งอย่างละเอียด โมเดลได้รับการฝึกล่วงหน้าบนชุดข้อมูลอิมเมจ 142 ล้านอิมเมจ โดยไม่ต้องใช้ป้ายกำกับหรือคำอธิบายประกอบใดๆ
แบบอย่าง | # ของ พารามิเตอร์ | กับ ลงทะเบียน | อิมเมจเน็ต เค-เอ็นเอ็น | อิมเมจเน็ต เชิงเส้น | ดาวน์โหลด |
---|---|---|---|---|---|
ViT-S/14 กลั่น | 21 ม | 79.0% | 81.1% | กระดูกสันหลังเท่านั้น | |
ViT-S/14 กลั่น | 21 ม | 79.1% | 80.9% | กระดูกสันหลังเท่านั้น | |
ViT-B/14 กลั่น | 86 ม | 82.1% | 84.5% | กระดูกสันหลังเท่านั้น | |
ViT-B/14 กลั่น | 86 ม | 82.0% | 84.6% | กระดูกสันหลังเท่านั้น | |
ViT-L/14 กลั่น | 300 ม | 83.5% | 86.3% | กระดูกสันหลังเท่านั้น | |
ViT-L/14 กลั่น | 300 ม | 83.8% | 86.7% | กระดูกสันหลังเท่านั้น | |
ViT-g/14 | 1,100 ม | 83.5% | 86.5% | กระดูกสันหลังเท่านั้น | |
ViT-g/14 | 1,100 ม | 83.7% | 87.1% | กระดูกสันหลังเท่านั้น |
โปรดปฏิบัติตามคำแนะนำที่นี่เพื่อติดตั้ง PyTorch (การพึ่งพาที่จำเป็นสำหรับการโหลดโมเดลเท่านั้น) ขอแนะนำอย่างยิ่งให้ติดตั้ง PyTorch พร้อมรองรับ CUDA
การ์ดโมเดลที่เกี่ยวข้องจะรวมอยู่ในที่เก็บ
import torch
# DINOv2
dinov2_vits14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14' )
dinov2_vitb14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14' )
dinov2_vitl14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14' )
dinov2_vitg14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14' )
# DINOv2 with registers
dinov2_vits14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_reg' )
dinov2_vitb14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_reg' )
dinov2_vitl14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_reg' )
dinov2_vitg14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_reg' )
กระดูกสันหลัง | กับ ลงทะเบียน | ดาวน์โหลด |
---|---|---|
อิมเมจเน็ต | ||
ViT-S/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-S/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-B/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-B/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-L/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-L/14 กลั่น | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-g/14 | หัวเชิงเส้น (1 ชั้น 4 ชั้น) | |
ViT-g/14 | หัวเชิงเส้น (1 ชั้น 4 ชั้น) |
โมเดลลักษณนาม (เต็ม) สามารถโหลดได้ผ่าน PyTorch Hub:
import torch
# DINOv2
dinov2_vits14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_lc' )
dinov2_vitb14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_lc' )
dinov2_vitl14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_lc' )
dinov2_vitg14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_lc' )
# DINOv2 with registers
dinov2_vits14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_reg_lc' )
dinov2_vitb14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_reg_lc' )
dinov2_vitl14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_reg_lc' )
dinov2_vitg14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_reg_lc' )
กระดูกสันหลัง | ดาวน์โหลดหัว | |
---|---|---|
นิวยอร์ค | กิตติ | |
ViT-S/14 กลั่น | เชิงเส้น (1 ชั้น 4 ชั้น), DPT | เชิงเส้น (1 ชั้น 4 ชั้น), DPT |
ViT-B/14 กลั่น | เชิงเส้น (1 ชั้น 4 ชั้น), DPT | เชิงเส้น (1 ชั้น 4 ชั้น), DPT |
ViT-L/14 กลั่น | เชิงเส้น (1 ชั้น 4 ชั้น), DPT | เชิงเส้น (1 ชั้น 4 ชั้น), DPT |
ViT-g/14 | เชิงเส้น (1 ชั้น 4 ชั้น), DPT | เชิงเส้น (1 ชั้น 4 ชั้น), DPT |
กระดูกสันหลัง | ดาวน์โหลดโมเดล | ดาวน์โหลดหัว | |
---|---|---|---|
ADE20K | ADE20K | วีโอซี2012 | |
ViT-S/14 กลั่น | เชิงเส้นหลายขนาด | เชิงเส้นหลายขนาด | |
ViT-B/14 กลั่น | เชิงเส้นหลายขนาด | เชิงเส้นหลายขนาด | |
ViT-L/14 กลั่น | เชิงเส้นหลายขนาด | เชิงเส้นหลายขนาด | |
ViT-g/14 | Mask2อดีต | เชิงเส้นหลายขนาด | เชิงเส้นหลายขนาด |
โค้ดการฝึกอบรมและการประเมินผลต้องใช้ PyTorch 2.0 และ xFormers 0.0.18 รวมถึงแพ็คเกจจากบุคคลที่สามอื่นๆ อีกจำนวนหนึ่ง โปรดทราบว่าโค้ดได้รับการทดสอบกับเวอร์ชันที่ระบุเท่านั้นและต้องใช้สภาพแวดล้อม Linux ด้วย หากต้องการตั้งค่าการขึ้นต่อกันที่จำเป็นทั้งหมดสำหรับการฝึกอบรมและการประเมินผล โปรดทำตามคำแนะนำด้านล่าง:
conda (แนะนำ) - โคลนพื้นที่เก็บข้อมูล จากนั้นสร้างและเปิดใช้งานสภาพแวดล้อม conda dinov2
โดยใช้คำจำกัดความสภาพแวดล้อมที่ให้มา:
conda env create -f conda.yaml
conda activate dinov2
pip - โคลนพื้นที่เก็บข้อมูล จากนั้นใช้ requirements.txt
ที่ให้มาเพื่อติดตั้งการขึ้นต่อกัน:
pip install -r requirements.txt
สำหรับงานที่มีความหนาแน่นสูง (การประมาณความลึกและการแบ่งส่วนความหมาย) มีการขึ้นต่อกันเพิ่มเติม (เวอร์ชันเฉพาะของ mmcv
และ mmsegmentation
) ซึ่งบันทึกไว้ในข้อกำหนดการขึ้นต่อกัน extras
:
conda (แนะนำ) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
ปิ๊ป :
pip install -r requirements.txt -r requirements-extras.txt
ไดเร็กทอรีรากของชุดข้อมูลควรเก็บเนื้อหาต่อไปนี้:
<ROOT>/test/ILSVRC2012_test_00000001.JPEG
<ROOT>/test/[..]
<ROOT>/test/ILSVRC2012_test_00100000.JPEG
<ROOT>/train/n01440764/n01440764_10026.JPEG
<ROOT>/train/[...]
<ROOT>/train/n15075141/n15075141_9993.JPEG
<ROOT>/val/n01440764/ILSVRC2012_val_00000293.JPEG
<ROOT>/val/[...]
<ROOT>/val/n15075141/ILSVRC2012_val_00049174.JPEG
<ROOT>/labels.txt
การใช้งานชุดข้อมูลที่ให้มาคาดว่าจะมีไฟล์ข้อมูลเมตาเพิ่มเติมสองสามไฟล์ปรากฏภายใต้ไดเรกทอรีเพิ่มเติม:
<EXTRA>/class-ids-TRAIN.npy
<EXTRA>/class-ids-VAL.npy
<EXTRA>/class-names-TRAIN.npy
<EXTRA>/class-names-VAL.npy
<EXTRA>/entries-TEST.npy
<EXTRA>/entries-TRAIN.npy
<EXTRA>/entries-VAL.npy
ไฟล์ข้อมูลเมตาเหล่านี้สามารถสร้างขึ้นได้ (ครั้งเดียว) ด้วยบรรทัดโค้ด Python ต่อไปนี้:
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
โปรดทราบว่ารูทและไดเร็กทอรีเพิ่มเติมไม่จำเป็นต้องเป็นไดเร็กทอรีที่แตกต่างกัน
โปรดปรับคลาสชุดข้อมูลให้ตรงกับการตั้งค่าในเครื่องของคุณ
dinov2
ไว้ในพาธการค้นหาโมดูล Python กล่าวคือ เพียงเติมคำสั่งนำหน้าเพื่อรันด้วย PYTHONPATH=.
-
รันการฝึกอบรม DINOv2 บนโหนด A100-80GB 4 โหนด (32 GPU) ในสภาพแวดล้อมคลัสเตอร์ SLURM ด้วยการส่ง:
python dinov2/run/train/train.py
--nodes 4
--config-file dinov2/configs/train/vitl16_short.yaml
--output-dir < PATH/TO/OUTPUT/DIR >
train.dataset_path=ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
เวลาการฝึกอบรมประมาณ 1 วัน และจุดตรวจสอบผลลัพธ์ควรถึง 81.6% สำหรับการประเมิน k-NN และ 82.9% สำหรับการประเมินเชิงเส้น
รหัสการฝึกอบรมจะบันทึกน้ำหนักของครูไว้ในโฟลเดอร์ eval
ทุกๆ 12,500 ครั้งเพื่อการประเมินผล
รันการฝึกอบรม DINOv2 บนโหนด A100-80GB 12 โหนด (96 GPU) ในสภาพแวดล้อมคลัสเตอร์ SLURM ด้วยการส่ง:
python dinov2/run/train/train.py
--nodes 12
--config-file dinov2/configs/train/vitl14.yaml
--output-dir < PATH/TO/OUTPUT/DIR >
train.dataset_path=ImageNet22k:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
เวลาการฝึกอบรมประมาณ 3.3 วัน และจุดตรวจสอบผลลัพธ์ควรถึง 82.0% สำหรับการประเมิน k-NN และ 84.5% สำหรับการประเมินเชิงเส้น
รหัสการฝึกอบรมจะบันทึกน้ำหนักของครูไว้ในโฟลเดอร์ eval
ทุกๆ 12,500 ครั้งเพื่อการประเมินผล
รหัสการฝึกอบรมจะบันทึกน้ำหนักของครูเป็นประจำ เพื่อประเมินโมเดล ให้รันการประเมินต่อไปนี้บนโหนดเดียว:
python dinov2/run/eval/knn.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/knn
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
python dinov2/run/eval/log_regression.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/logreg
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
python dinov2/run/eval/linear.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/linear
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
เราปล่อยน้ำหนักจากการประเมินรุ่นต่างๆ:
แบบอย่าง | กับ ลงทะเบียน | อิมเมจเน็ต ด้านบน-1 | การประเมินเชิงเส้น |
---|---|---|---|
ViT-S/14 กลั่น | 81.1% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-S/14 กลั่น | 80.8% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-B/14 กลั่น | 84.5% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-B/14 กลั่น | 84.4% | ตุ้มน้ำหนักศีรษะเชิงเส้น | |
ViT-L/14 กลั่น | 86.3% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-L/14 กลั่น | 86.5% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-g/14 | 86.5% | ตุ้มน้ำหนักหัวเชิงเส้น | |
ViT-g/14 | 87.0% | ตุ้มน้ำหนักหัวเชิงเส้น |
ประสิทธิภาพของตุ้มน้ำหนักแบบจำลองที่ได้รับการฝึกล่วงหน้าที่ให้มาสามารถประเมินได้ดังต่อไปนี้บน ImageNet-1k:
python dinov2/run/eval/linear.py
--config-file dinov2/configs/eval/vitg14_pretrain.yaml
--pretrained-weights https://dl.fbaipublicfiles.com/dinov2/dinov2_vitg14/dinov2_vitg14_pretrain.pth
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
มีการจัดเตรียมสมุดบันทึกจำนวนหนึ่งเพื่อช่วยให้ชุมชนใช้ประโยชน์จากโมเดลและโค้ด:
รหัส DINOv2 และน้ำหนักโมเดลเผยแพร่ภายใต้ Apache License 2.0 ดูใบอนุญาตสำหรับรายละเอียดเพิ่มเติม
ดูการบริจาคและจรรยาบรรณ
หากคุณพบว่าพื้นที่เก็บข้อมูลนี้มีประโยชน์ โปรดติดดาวและอ้างอิง ?:
@misc{oquab2023dinov2,
title={DINOv2: Learning Robust Visual Features without Supervision},
author={Oquab, Maxime and Darcet, Timothée and Moutakanni, Theo and Vo, Huy V. and Szafraniec, Marc and Khalidov, Vasil and Fernandez, Pierre and Haziza, Daniel and Massa, Francisco and El-Nouby, Alaaeldin and Howes, Russell and Huang, Po-Yao and Xu, Hu and Sharma, Vasu and Li, Shang-Wen and Galuba, Wojciech and Rabbat, Mike and Assran, Mido and Ballas, Nicolas and Synnaeve, Gabriel and Misra, Ishan and Jegou, Herve and Mairal, Julien and Labatut, Patrick and Joulin, Armand and Bojanowski, Piotr},
journal={arXiv:2304.07193},
year={2023}
}
@misc{darcet2023vitneedreg,
title={Vision Transformers Need Registers},
author={Darcet, Timothée and Oquab, Maxime and Mairal, Julien and Bojanowski, Piotr},
journal={arXiv:2309.16588},
year={2023}
}