إعادة تنفيذ Pytorch من الفعالية الرسمية مع أداء SOTA في الوقت الحقيقي ، الرابط الورقي الأصلي: https://arxiv.org/abs/1911.09070
إذا كان لديك مشاكل في تدريب مجموعة بيانات ، وإذا كنت على استعداد لمشاركة مجموعة البيانات الخاصة بك مع الجمهور أو أنها مفتوحة بالفعل ، فقم بنشرها في المشكلات المتعلقة help wanted ، فقد أحاول المساعدة في تدريبها من أجلك ، إذا كنت مجانيًا ، وهو أمر غير مضمون.
متطلبات:
يجب ألا يكون العدد الإجمالي لصورة مجموعة البيانات أكبر من 10 آلاف ، ويجب أن تكون السعة أقل من 5 جيجابايت ، ويجب أن تكون مجانية في التنزيل ، أي Baiduyun.
يجب أن تكون مجموعة البيانات بتنسيق هذا الريبو.
إذا قمت بنشر مجموعة البيانات الخاصة بك في هذا الريبو ، فهي مفتوحة للعالم. لذا يرجى عدم تحميل مجموعات البيانات السرية الخاصة بك!
إذا كانت مجموعات البيانات ضد القانون أو تغزو خصوصية الشخص ، فلا تتردد في الاتصال بي لحذفه.
الأهم من ذلك ، لا يمكنك أن تطالبني بالتدريب إلا إذا أردت ذلك.
سأقوم بنشر الأوزان المدربة في هذا الريبو مع نتيجة التقييم.
آمل أن يساعد ذلك من يريد تجربة كفاءة في Pytorch.
يمكن العثور على أمثلة التدريب هنا. دروس. يمكن العثور على الأوزان المدربة هنا. الأوزان
الأداء قريب جدًا من الورقة ، لا يزال سوتا.
يتضمن اختبار السرعة/FPS وقت ما بعد المعالجة مع عدم وجود خدعة دقة JIT/DATA.
| معامل | PTH_Download | GPU MEM (MB) | FPS | FPS المتطرفة (BatchSize 32) | خريطة 0.5: 0.95 (هذا الريبو) | الخريطة 0.5: 0.95 (رسمية) |
|---|---|---|---|---|---|---|
| D0 | DefianctDet-D0.pth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | effaifdet-d1.pth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | effaiveDet-d2.pth | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | effaifdet-d3.pth | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | DEFAINTDET-D4.PTH | 1903 | 14.75 | - | 48.8 | 49.4 |
| D5 | DEFAINTDET-D5.PTH | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | DefianctDet-D6.pth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | effaifdet-d7.pth | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7X | effaifdet-d8.pth | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23] يدعم كفاءة D7x ، خريطة 53.9 ، باستخدام كفاءة NET-B7 كعمود الفقرة ومستوى هرم أعمق إضافي من BIFPN. من أجل البساطة ، دعنا نسميها فعالة D8.
[2020-07-15] تحديث أوزان DEFAINTDET-D7 ، خريطة 52.7
[2020-05-11] أضف تحويل سلسلة منطقية للتأكد من عمل Head_only
[2020-05-10] استبدل NMS بـ Batched_nms لزيادة تحسين الخريطة بمقدار 0.5 ~ 0.7 ، وذلك بفضل الضحك.
[2020-05-04] إصلاح خلل معرف فئة Coco ، ولكن يجب ألا يؤثر على التدريب على مجموعة البيانات المخصصة.
[2020-04-14] علة وظيفة الخسارة الثابتة. يرجى سحب أحدث الرمز.
[2020-04-14] لأولئك الذين يحتاجون إلى المساعدة أو لا يمكنهم الحصول على نتيجة جيدة بعد عدة عصر ، تحقق من هذا البرنامج التعليمي. يمكنك تشغيله على كولاب مع دعم GPU.
[2020-04-10] تشوه وظيفة الخسارة داخل نموذج التدريب ، بحيث يتم توازن استخدام الذاكرة عند التدريب مع وحدات معالجة الرسومات المتعددة ، مما يتيح التدريب مع زيادة الدفعة.
[2020-04-10] أضف D7 (D6 مع حجم إدخال أكبر ومقياس مرساة أكبر) واختبار خريطته
[2020-04-09] السماح بمقاييس ونسب مرساة مخصصة
[2020-04-08] أضف دعم D6 واختبار خريطته
[2020-04-08] أضف نصًا تدريبيًا ومستنده ؛ تحديث البرنامج النصي Eval وبرنامج النصي الاستنتاج البسيط.
[2020-04-07] خريطة D0-D5 التي تم اختبارها ، تبدو النتيجة لطيفة ، ويمكن الاطلاع على التفاصيل هنا
[2020-04-07] إصلاح استراتيجيات المراسي.
[2020-04-06] تكييف استراتيجيات المرساة.
[2020-04-05] إنشاء هذا المستودع.
# install requirements
pip install pycocotools numpy opencv-python tqdm tensorboard tensorboardX pyyaml webcolors
pip install torch==1.4.0
pip install torchvision==0.5.0
# run the simple inference script
python efficientdet_test.py
التدريب DEFIVEDET مهمة مؤلمة وتستغرق وقتًا طويلاً. يجب ألا تتوقع الحصول على نتيجة جيدة في غضون يوم أو يومين. يرجى التحلي بالصبر.
تحقق من هذا البرنامج التعليمي إذا كنت جديدًا في هذا. يمكنك تشغيله على كولاب مع دعم GPU.
# your dataset structure should be like this
datasets/
-your_project_name/
-train_set_name/
-*.jpg
-val_set_name/
-*.jpg
-annotations
-instances_{train_set_name}.json
-instances_{val_set_name}.json
# for example, coco2017
datasets/
-coco2017/
-train2017/
-000000000001.jpg
-000000000002.jpg
-000000000003.jpg
-val2017/
-000000000004.jpg
-000000000005.jpg
-000000000006.jpg
-annotations
-instances_train2017.json
-instances_val2017.json
# create a yml file {your_project_name}.yml under 'projects'folder
# modify it following 'coco.yml'
# for example
project_name: coco
train_set: train2017
val_set: val2017
num_gpus: 4 # 0 means using cpu, 1-N means using gpus
# mean and std in RGB order, actually this part should remain unchanged as long as your dataset is similar to coco.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]
# this is coco anchors, change it if necessary
anchors_scales: '[2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)]'
anchors_ratios: '[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]'
# objects from all labels from your dataset with the order from your annotations.
# its index must match your dataset's category_id.
# category_id is one_indexed,
# for example, index of 'car' here is 2, while category_id of is 3
obj_list: ['person', 'bicycle', 'car', ...]
# train efficientdet-d0 on coco from scratch
# with batchsize 12
# This takes time and requires change
# of hyperparameters every few hours.
# If you have months to kill, do it.
# It's not like someone going to achieve
# better score than the one in the paper.
# The first few epoches will be rather unstable,
# it's quite normal when you train from scratch.
python train.py -c 0 --batch_size 64 --optim sgd --lr 8e-2
# train efficientdet-d1 on a custom dataset
# with batchsize 8 and learning rate 1e-5
python train.py -c 1 -p your_project_name --batch_size 8 --lr 1e-5
# train efficientdet-d2 on a custom dataset with pretrained weights
# with batchsize 8 and learning rate 1e-3 for 10 epoches
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --num_epochs 10
--load_weights /path/to/your/weights/efficientdet-d2.pth
# with a coco-pretrained, you can even freeze the backbone and train heads only
# to speed up training and help convergence.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --num_epochs 10
--load_weights /path/to/your/weights/efficientdet-d2.pth
--head_only True
# while training, press Ctrl+c, the program will catch KeyboardInterrupt
# and stop training, save current checkpoint.
# let says you started a training session like this.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3
--load_weights /path/to/your/weights/efficientdet-d2.pth
--head_only True
# then you stopped it with a Ctrl+c, it exited with a checkpoint
# now you want to resume training from the last checkpoint
# simply set load_weights to 'last'
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3
--load_weights last
--head_only True
# eval on your_project, efficientdet-d5
python coco_eval.py -p your_project_name -c 5
-w /path/to/your/weights
# when you get bad result, you need to debug the training result.
python train.py -c 2 -p your_project_name --batch_size 8 --lr 1e-3 --debug True
# then checkout test/ folder, there you can visualize the predicted boxes during training
# don't panic if you see countless of error boxes, it happens when the training is at early stage.
# But if you still can't see a normal box after several epoches, not even one in all image,
# then it's possible that either the anchors config is inappropriate or the ground truth is corrupted.
س 1. لماذا تنفيذ هذا في حين أن هناك العديد من مشاريع Pytorch الفعالة بالفعل.
A1: نظرًا لأن AFAIK لا يستعيد أي منهم الخوارزمية الحقيقية للفعالية الرسمية ، ولهذا السبب لم تتمكن مجتمعاتهم من تحقيق أو تواجه وقتًا عصيبًا لتحقيق نفس النتيجة التي يتمتع بها كفاءة الرسمية عن طريق التدريب من نقطة الصفر.
س 2: ما هو بالضبط الفرق بين هذا المستودع والآخرين؟
A2: على سبيل المثال ، هذان الاثنان هما الأكثر شيوعًا كفاءة-بايتورش ،
https://github.com/toandaominh1997/ffectiveDet.pytorch
https://github.com/signatrix/ffectiveDet
فيما يلي القضايا ولماذا يصعب تحقيق نفس النتيجة الرسمية:
أول واحد:
الثاني:
يختلف ثياب Pytorch's Batchnormalization قليلاً عن Tensorflow ، Momentum_Pytorch = 1 - Momentum_TensorFlow. حسنًا ، لم أكن أدرك هذا الفخ إذا دفعت اهتمامًا أقل. نجحت Signatrix/Defficientdet في المعلمة من TensorFlow ، وبالتالي فإن BN ستعمل بشكل سيء لأن التشغيل المتوسط ويتم إدخال التباين الجري من قبل الإدخال الجديد.
سوء بناء Depthwise-seped-seped2d. Conv2D القابلة للشفاء Depthwise هو depthwise-conv2d و pointwise-conv2d و biasadd ، لا يوجد سوى تحيز بعد اثنين من conv2d ، في حين أن signatrix/efficafdet لديه تحيز إضافي على depthwise-conv2d.
أسيء فهم المعلمة الأولى لـ MaxPooling2D ، المعلمة الأولى هي kernel_size ، بدلاً من الخطوة.
في عداد المفقودين بعد القنوات السفلية لميزة إخراج كفاءة.
باستخدام ميزة الإخراج الخاطئة من الكفاءة. هذا كبير. يستغرق كل الناتج الذي يحتوي على مقنع 2 ، لكنه خطأ. يجب أن يكون الشخص الذي يقنعه القادم هو 2 أو الناتج النهائي من كفاءة.
لا يطبق نفس الحشو على conv2d وتجميع.
مفقود تنشيط Swish بعد عدة عمليات.
العمليات المفقودة/BN في BIFPN ، التراجع والمصنف. هذا أمر صعب للغاية ، إذا لم تقم بتعمق في التنفيذ الرسمي ، فهناك بعض العمليات نفسها ذات الأوزان المختلفة.
illustration of a minimal bifpn unit
P7_0 -------------------------> P7_2 -------->
|-------------| ↑
↓ |
P6_0 ---------> P6_1 ---------> P6_2 -------->
|-------------|--------------↑ ↑
↓ |
P5_0 ---------> P5_1 ---------> P5_2 -------->
|-------------|--------------↑ ↑
↓ |
P4_0 ---------> P4_1 ---------> P4_2 -------->
|-------------|--------------↑ ↑
|--------------↓ |
P3_0 -------------------------> P3_2 -------->
على سبيل المثال ، سوف P4 DownChannel إلى p4_0 ، ثم يذهب p4_1 ، يجوز لأي شخص أن يأخذها كأمر مسلم به أن p4_0 يذهب إلى p4_2 مباشرة ، أليس كذلك؟
لهذا السبب هم مخطئون ، يجب أن P4 يجب أن يكون القنوات مرة أخرى مع أوزان مختلفة إلى p4_0_another ، ثم يذهب إلى p4_2.
وأخيراً بعض المشكلات الشائعة ، تختلف وحدة فك ترميز المرساة والمشفرات الخاصة بهم عن القضايا الأصلية ، لكنها ليست السبب الرئيسي في أداءها بشكل سيء.
أيضًا ، لا تؤدي Conv2DstaticSamePadding من Defiancnet-Pytorch مثل Tensorflow ، فإن استراتيجية الحشو مختلفة. لذلك أقوم بتنفيذ مجموعة حقيقية على غرار TensorFlow Conf2DstaticSamePadding و MaxPool2Dstaticsamepadding.
على الرغم من القضايا المذكورة أعلاه ، فهي مستودعات رائعة تنورني ، وبالتالي هناك هذا المستودع.
يعتمد هذا المستودع بشكل أساسي على DefianctDet ، مع التغيير الذي يتأكد من أداءه أقرب قدر الإمكان مثل الورقة.
راجع للشغل ، تصحيح الأخطاء الساكنة الشحمية الفائقة V1 مؤلمة حقا. لا تحاول تصديرها باستخدام أدوات التشغيل الآلي مثل TF-Onnx أو MMDNN ، فهي ستتسبب فقط في المزيد من المشكلات بسبب عملياتها المخصصة/المعقدة.
وحتى إذا نجحت ، كما فعلت ، سيتعين عليك التعامل مع التعليمات البرمجية المجنونة التي تم إنشاؤها بواسطة الرشاشات تحت نفس الفئة التي تستغرق وقتًا أطول من إعادة ترجمتها من نقطة الصفر.
س 3: ماذا علي أن أفعل عندما أجد خطأ؟
A3: تحقق من سجل التحديث إذا تم إصلاحه ، ثم اسحب أحدث التعليمات البرمجية للمحاولة مرة أخرى. إذا لم يساعد ذلك ، قم بإنشاء مشكلة جديدة ووصفها بالتفصيل.
الخلاصة: إنهم يقدمون نفس الدقة تقريبًا. نصائح: set force_input_size=1920 . يستخدم Repo الرسمي حجم الصورة الأصلي بينما يستخدم هذا الريبو حجم إدخال الشبكة الافتراضي. إذا حاولت مقارنة هذين الإعادة ، فيجب عليك التأكد من أن حجم الإدخال متسق.
نقدر العمل العظيم من المستودعات التالية:
إذا كنت تحب هذا المستودع ، أو إذا كنت ترغب في دعم المؤلف لأي سبب ، فيمكنك التبرع للمؤلف. لا تتردد في إرسال اسمك لي أو تقديم صفحات ، وسأتأكد من اسمك (اسمك) في قائمة الرعاة.
نشكر خالص التقدير على كرمتك.
Cndylan Claire-S11