هذه هي النسخة التطويرية من الكود للورقة التالية:
Bugra Tekin، Sudipta N. Sinha و Pascal Fua، "التنبؤ بوضعية الكائن سداسي الأبعاد بدون خياطة في الوقت الحقيقي"، CVPR 2018.
يمكن العثور على المستودع الأصلي لقاعدة التعليمات البرمجية للورقة المذكورة أعلاه في الرابط التالي.
نقترح طريقة اللقطة الواحدة لاكتشاف كائن ما في صورة RGB في نفس الوقت والتنبؤ بوضعه سداسي الأبعاد دون الحاجة إلى مراحل متعددة أو الاضطرار إلى فحص فرضيات متعددة. المكون الرئيسي لطريقتنا هو بنية CNN الجديدة المستوحاة من تصميم شبكة YOLO التي تتنبأ بشكل مباشر بمواقع الصور ثنائية الأبعاد للقمم المسقطة للمربع المحيط ثلاثي الأبعاد للكائن. يتم بعد ذلك تقدير الوضعية السداسية الأبعاد للكائن باستخدام خوارزمية PnP. ورقة، أرخايف
إذا كنت تستخدم هذا الرمز، يرجى ذكر ما يلي
@inproceedings{tekin18,
TITLE = {{التنبؤ بوضعية الكائن 6D السلس في الوقت الفعلي}}، AUTHOR = {Tekin, Bugra and Sinha, Sudipta N. and Fua, Pascal},
عنوان الكتاب = {CVPR}،
العام = {2018}
}
تم إصدار SingleShotPose بموجب ترخيص MIT (ارجع إلى ملف الترخيص للحصول على التفاصيل).
تم اختبار الكود على نظام التشغيل 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] على معلومات حول تقسيمات التدريب/الاختبار ونماذج الكائنات ثلاثية الأبعاد ومعلمات الكاميرا
يحتوي [modelcfg] على معلومات حول بنية الشبكة
يحتوي [initweightfile] على أوزان التهيئة. يحتوي <
في بداية التدريب سوف ترى نتيجة مثل هذا:
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
". إذا واجهت أخطاء في ذاكرة وحدة معالجة الرسومات أثناء التدريب، فيمكنك محاولة خفض حجم الدفعة، على سبيل المثال، إلى 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 نقاط تتوافق مع النقطه الوسطى وزوايا نموذج الكائن ثلاثي الأبعاد. بالإضافة إلى ذلك، نتوقع الطبقة في كل خلية. وهذا يجعل 9x2+1 = 19 نقطة. في التدريب على كائنات متعددة، أثناء التدريب، نقوم بتعيين أي مربع ربط له الحجم الأكثر تشابهًا مع الكائن الحالي باعتباره الصندوق المسؤول عن التنبؤ بالإحداثيات ثنائية الأبعاد لذلك الكائن. لتشفير حجم الكائنات، لدينا رقمين إضافيين للنطاق في البعد x والبعد y. وبالتالي، لدينا 9x2+1+2 = 21 رقمًا.
على التوالي، 21 رقمًا يتوافق مع ما يلي: الرقم الأول: تسمية الفئة، الرقم الثاني: x0 (الإحداثي x للنقطه الوسطى)، الرقم الثالث: y0 (الإحداثي y للنقطه الوسطى)، الرقم الرابع: x1 (الإحداثي x للنقطه الوسطى) الزاوية الأولى)، العدد الخامس: y1 (إحداثي الزاوية الصادية للزاوية الأولى)، ...، العدد الثامن عشر: x8 (الإحداثي السيني للركن الثامن)، الرقم التاسع عشر: 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 التابع لجهة خارجية مفيد لإنشاء تسميات الحقيقة الأرضية لتقدير وضعية الكائن سداسي الأبعاد)،
(3) ملف نصي يحتوي على أسماء ملفات صور التدريب ( train.txt
)،
(4) ملف نصي يحتوي على أسماء ملفات صور الاختبار ( test.txt
)،
(5) ملف .ply يحتوي على نموذج الكائن ثلاثي الأبعاد (يتم تحديد وحدة نموذج الكائن بالأمتار)،
(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