นี่คือเวอร์ชันการพัฒนาของโค้ดสำหรับเอกสารต่อไปนี้:
Bugra Tekin, Sudipta N. Sinha และ Pascal Fua, "การทำนายท่าทางวัตถุ 6D ช็อตเดียวที่ไร้รอยต่อแบบเรียลไทม์", CVPR 2018
ที่เก็บต้นฉบับสำหรับ codebase สำหรับบทความด้านบนสามารถพบได้ในลิงค์ต่อไปนี้
เราเสนอวิธีการถ่ายภาพครั้งเดียวสำหรับการตรวจจับวัตถุในภาพ RGB ไปพร้อมๆ กัน และคาดการณ์ท่าทาง 6D ของมันโดยไม่ต้องอาศัยหลายขั้นตอนหรือต้องตรวจสอบสมมติฐานหลายข้อ องค์ประกอบสำคัญของวิธีการของเราคือสถาปัตยกรรม CNN ใหม่ที่ได้รับแรงบันดาลใจจากการออกแบบเครือข่าย YOLO ซึ่งคาดการณ์ตำแหน่งภาพ 2 มิติของจุดยอดที่ฉายของกล่องขอบเขต 3 มิติของวัตถุได้โดยตรง จากนั้นประมาณท่าทาง 6 มิติของวัตถุโดยใช้อัลกอริธึม PnP กระดาษ, arXiv
หากคุณใช้รหัสนี้ โปรดอ้างอิงสิ่งต่อไปนี้
@กำลังดำเนินการ{tekin18,
TITLE = {{การคาดการณ์ท่าโพสของวัตถุ 6 มิตินัดเดียวไร้รอยต่อแบบเรียลไทม์}}, ผู้แต่ง = {Tekin, Bugra และ Sinha, Sudipta N. และ Fua, Pascal},
ชื่อหนังสือ = {CVPR},
ปี = {2018}
-
SingleShotPose ได้รับการเผยแพร่ภายใต้ใบอนุญาต MIT (ดูรายละเอียดในไฟล์ LICENSE)
รหัสได้รับการทดสอบบน Windows ด้วย CUDA v8 และ cudNN v5.1 การใช้งานจะขึ้นอยู่กับ PyTorch 0.4.1 และทดสอบบน Python3.6 โค้ดต้องการการขึ้นต่อกันต่อไปนี้ที่สามารถติดตั้งด้วย conda หรือ pip: numpy, scipy, PIL, opencv-python สำหรับเวอร์ชันก่อนหน้าที่เข้ากันได้กับ PyTorch 0.3.1 และทดสอบบน Python2.7 โปรดดูโฟลเดอร์ py2
ภายในไดเร็กทอรีโค้ดหลัก ให้รันสิ่งต่อไปนี้เพื่อดาวน์โหลดและแยก (1) ชุดข้อมูล LINEMOD ที่ประมวลผลล่วงหน้า (2) โมเดลที่ได้รับการฝึกสำหรับชุดข้อมูล LINEMOD (3) โมเดลที่ได้รับการฝึกสำหรับชุดข้อมูล OCCLUSION (4) ภาพพื้นหลังจาก VOC2012 ชุดข้อมูลตามลำดับ
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
หรือคุณสามารถไปที่ลิงก์ด้านบนโดยตรงแล้วดาวน์โหลดและแตกไฟล์ด้วยตนเองที่ไดเร็กทอรีที่เกี่ยวข้อง กระบวนการดาวน์โหลดทั้งหมดอาจใช้เวลานาน (ประมาณ 60 นาที) โปรดทราบว่าการเข้าถึง OneDrive ในบางประเทศอาจถูกจำกัด
เพื่อฝึกการรันโมเดล
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
เช่น
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
หากคุณต้องการเริ่มต้นจากน้ำหนักเริ่มต้นของ ImageNet หรือ
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
หากคุณต้องการเริ่มต้นด้วยโมเดล LINEMOD ที่ได้รับการฝึกฝนไว้ล่วงหน้าแล้ว เพื่อการบรรจบกันที่เร็วขึ้น
[datacfg] มีข้อมูลเกี่ยวกับการแยกการฝึก/การทดสอบ โมเดลวัตถุ 3 มิติ และพารามิเตอร์ของกล้อง
[modelcfg] มีข้อมูลเกี่ยวกับโครงสร้างเครือข่าย
[initweightfile] มีน้ำหนักการเริ่มต้น <<darknet19_448.conv.23>> มีน้ำหนักเครือข่ายที่ได้รับการฝึกล่วงหน้าบน ImageNet น้ำหนัก "backup/[OBJECT_NAME]/init.weights" ได้รับการฝึกล่วงหน้าบน LINEMOD เพื่อการบรรจบกันที่เร็วขึ้น เราพบว่ามีประสิทธิภาพในการฝึกโมเดลล่วงหน้าโดยไม่ต้องประมาณค่าความเชื่อมั่นก่อน และปรับแต่งเครือข่ายในภายหลังด้วยการประมาณค่าความเชื่อมั่นเช่นกัน "init.weights" มีน้ำหนักของเครือข่ายที่ได้รับการฝึกอบรมเหล่านี้ อย่างไรก็ตาม คุณยังคงสามารถฝึกอบรมเครือข่ายจากการเริ่มต้นที่หยาบกว่านี้ได้ (ด้วยการฝึกตุ้มน้ำหนักบน ImageNet) ซึ่งมักจะส่งผลให้การบรรจบกันช้าลงและบางครั้งก็แย่ลงเล็กน้อย คุณสามารถค้นหาไฟล์ <<darknet19_448.conv.23>> ในโฟลเดอร์ cfg/ ซึ่งรวมน้ำหนักเครือข่ายที่ได้รับการฝึกล่วงหน้าบน ImageNet
เมื่อเริ่มต้นการฝึกอบรม คุณจะเห็นผลลัพธ์ดังนี้:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
สิ่งนี้จะกำหนดโครงสร้างเครือข่าย ในระหว่างการฝึก โมเดลเครือข่ายที่ดีที่สุดจะถูกบันทึกลงในไฟล์ "model.weights" หากต้องการฝึกเครือข่ายสำหรับวัตถุอื่น เพียงเปลี่ยนชื่อวัตถุในขณะที่เรียกใช้ฟังก์ชันรถไฟ เช่น " python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". หากคุณพบข้อผิดพลาดของหน่วยความจำ GPU ขณะฝึก คุณอาจลองลดขนาดแบตช์ลง เช่น 16 หรือ 8 เพื่อให้พอดีกับหน่วยความจำ โค้ดเวอร์ชันโอเพ่นซอร์สได้รับการปรับโครงสร้างใหม่อย่างเข้มงวด และยิ่งไปกว่านั้นบางโมเดลยังต้องได้รับการฝึกอบรมใหม่อีกด้วย โมเดลที่ได้รับการอบรมใหม่ที่เราจัดเตรียมให้ไม่ได้เปลี่ยนแปลงไปมากนักจากผลลัพธ์เบื้องต้นที่เรามอบให้ (บางครั้งก็แย่กว่าเล็กน้อยและบางครั้งก็ดีขึ้นเล็กน้อย)
เพื่อทดสอบการรันโมเดล
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
เช่น
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
คุณยังสามารถใช้ valid.ipynb เพื่อทดสอบโมเดลและแสดงภาพผลลัพธ์ได้
ภายในโฟลเดอร์ multi_obj_pose_estimation/
การทดสอบ:
python valid_multi.py cfgfile weightfile
เช่น
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
การฝึกอบรม:
python train_multi.py datafile cfgfile weightfile
เช่น
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
ไฟล์ป้ายกำกับของเราประกอบด้วยค่าความจริงพื้นฐาน 21 ค่า เราคาดการณ์ 9 จุดที่สอดคล้องกับจุดศูนย์กลางและมุมของโมเดลวัตถุ 3 มิติ นอกจากนี้ เรายังทำนายคลาสในแต่ละเซลล์ด้วย นั่นทำให้ 9x2+1 = 19 แต้ม ในการฝึกแบบหลายวัตถุ ในระหว่างการฝึก เราจะกำหนดกล่องยึดใดก็ตามที่มีขนาดใกล้เคียงกับวัตถุปัจจุบันมากที่สุดให้เป็นกล่องที่รับผิดชอบในการทำนายพิกัด 2D สำหรับวัตถุนั้น ในการเข้ารหัสขนาดของวัตถุ เรามีตัวเลขเพิ่มเติม 2 ตัวสำหรับช่วงในมิติ x และมิติ y ดังนั้นเราจึงมีตัวเลข 9x2+1+2 = 21 ตัว
ตามลำดับ ตัวเลข 21 ตัวสอดคล้องกับสิ่งต่อไปนี้: หมายเลขที่ 1: ป้ายกำกับคลาส หมายเลขที่ 2: x0 (พิกัด x ของเซนทรอยด์) หมายเลขที่ 3: y0 (พิกัด y ของเซนทรอยด์) หมายเลขที่ 4: x1 (พิกัด x ของ มุมแรก) ตัวเลขที่ 5: y1 (พิกัด y ของมุมแรก), ..., ตัวเลขที่ 18: x8 (พิกัด x ของ มุมที่แปด) หมายเลขที่ 19: y8 (พิกัด y ของมุมที่แปด) หมายเลขที่ 20: ช่วง x หมายเลขที่ 21: ช่วง y
พิกัดจะถูกทำให้เป็นมาตรฐานด้วยความกว้างและความสูงของภาพ: x / image_width
และ y / image_height
สิ่งนี้มีประโยชน์ที่จะมีช่วงเอาต์พุตที่คล้ายกันสำหรับงานการถดถอยของพิกัดและงานการจัดหมวดหมู่ออบเจ็กต์
เราฝึกและทดสอบโมเดลของเราบนชุดข้อมูล LINEMOD โดยใช้การแยกรถไฟ/การทดสอบเดียวกันกับวิธี BB8 เพื่อตรวจสอบความถูกต้องของแนวทางของเรา หากคุณต้องการฝึกโมเดลบนชุดข้อมูลของคุณเอง คุณสามารถสร้างโครงสร้างโฟลเดอร์เดียวกันกับชุดข้อมูล LINEMOD ที่ให้มา และปรับเส้นทางใน cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt และ ไฟล์ [DATASET]/[OBJECT]/test.txt โฟลเดอร์สำหรับแต่ละออบเจ็กต์ควรมีสิ่งต่อไปนี้:
(1) โฟลเดอร์ที่มีไฟล์รูปภาพ
(2) โฟลเดอร์ที่มีไฟล์ป้ายกำกับ (โปรดดูลิงก์นี้สำหรับคำอธิบายโดยละเอียดเกี่ยวกับวิธีการสร้างป้ายกำกับ คุณยังสามารถค้นหากล่องเครื่องมือ ObjectDatasetTools ของบุคคลที่สามที่มีประโยชน์ในการสร้างป้ายกำกับความจริงภาคพื้นดินสำหรับการประมาณค่าท่าทางของวัตถุ 6D)
(3) ไฟล์ข้อความที่มีชื่อไฟล์สำหรับรูปภาพการฝึกอบรม ( train.txt
)
(4) ไฟล์ข้อความที่มีชื่อไฟล์สำหรับภาพทดสอบ ( test.txt
)
(5) ไฟล์ .ply ที่มีโมเดลวัตถุ 3 มิติ (หน่วยของโมเดลวัตถุมีหน่วยเป็นเมตร)
(6) ทางเลือก โฟลเดอร์ที่มีมาสก์การแบ่งส่วน (หากคุณต้องการเปลี่ยนพื้นหลังของรูปภาพการฝึกของคุณให้แข็งแกร่งยิ่งขึ้นสำหรับพื้นหลังที่หลากหลาย สิ่งนี้จะจำเป็นสำหรับความสามารถในการวางนัยทั่วไปที่ดีขึ้น)
โปรดตรวจสอบให้แน่ใจว่าได้ปรับค่าต่อไปนี้ในไฟล์การกำหนดค่าข้อมูลและแบบจำลองตามความต้องการของคุณ:
diam
" ในไฟล์กำหนดค่าข้อมูลด้วยเส้นผ่านศูนย์กลางของโมเดลออบเจ็กต์ที่มีอยู่yolo-pose.cfg
) และพารามิเตอร์การเพิ่มข้อมูลบางส่วน (การกระวนกระวายใจ เฉดสี ความอิ่มตัว พารามิเตอร์การรับแสงใน dataset.py
) อาจจำเป็นต้องปรับเพื่อให้ชุดข้อมูลของคุณมาบรรจบกันได้ดีขึ้นyolo-pose-multi.cfg
) โปรดตรวจสอบให้แน่ใจว่าใช้จำนวนคลาสที่ถูกต้องและระบุใน yolo-pose-multi.cfg
fx
, fy
, u0
, v0
, width
, height
) ในไฟล์การกำหนดค่าข้อมูลด้วยไฟล์เฉพาะสำหรับชุดข้อมูลของคุณ ในขณะที่สร้างชุดข้อมูลการฝึกอบรม การสุ่มตัวอย่างมุมมอง/ระยะทางจำนวนมาก และการสร้างแบบจำลองความแปรปรวนขนาดใหญ่ของการตั้งค่าการส่องสว่าง/การบดบัง/พื้นหลังจะมีความสำคัญในการเพิ่มความสามารถในการวางลักษณะทั่วไปของแนวทางในชุดข้อมูลของคุณ หากคุณต้องการปรับพารามิเตอร์โมเดลและการสูญเสีย (เช่น ปัจจัยการชั่งน้ำหนักสำหรับเงื่อนไขการสูญเสียที่แตกต่างกัน) เพื่อวัตถุประสงค์ของคุณเอง คุณสามารถทำได้ในไฟล์การกำหนดค่าโมเดล ( yolo-pose.cfg
)
รหัสนี้เขียนโดย Bugra Tekin และสร้างขึ้นจากการใช้งาน YOLOv2 ของผู้ใช้ github @marvis
หากมีคำถามหรือรายงานข้อผิดพลาด โปรดติดต่อ Bugra Tekin