Pytorch Emplement ของ EfficientDet อย่างเป็นทางการอีกครั้งพร้อมประสิทธิภาพ SOTA แบบเรียลไทม์ลิงก์กระดาษต้นฉบับ: https://arxiv.org/abs/1911.09070
หากคุณมีปัญหาในการฝึกอบรมชุดข้อมูลและหากคุณยินดีที่จะแบ่งปันชุดข้อมูลของคุณกับสาธารณะหรือเปิดอยู่แล้วให้โพสต์ปัญหาเกี่ยวกับ help wanted แท็กฉันอาจพยายามช่วยฝึกอบรมให้คุณถ้าฉันว่างซึ่งไม่รับประกัน
ความต้องการ:
จำนวนภาพทั้งหมดของชุดข้อมูลไม่ควรมีขนาดใหญ่กว่า 10k ความจุควรต่ำกว่า 5GB และควรดาวน์โหลดได้ฟรีเช่น Baiduyun
ชุดข้อมูลควรอยู่ในรูปแบบของ repo นี้
หากคุณโพสต์ชุดข้อมูลของคุณใน repo นี้มันจะเปิดให้ทั่วโลก ดังนั้นโปรดอย่าอัปโหลดชุดข้อมูลที่เป็นความลับของคุณ!
หากชุดข้อมูลผิดกฎหมายหรือบุกรุกความเป็นส่วนตัวโปรดติดต่อฉันเพื่อลบ
สิ่งสำคัญที่สุดคือคุณไม่สามารถเรียกร้องให้ฉันฝึกได้เว้นแต่ฉันต้องการ
ฉันจะโพสต์น้ำหนักที่ผ่านการฝึกอบรมใน repo นี้พร้อมกับผลการประเมิน
หวังว่ามันจะช่วยให้ใครก็ตามที่ต้องการลองใช้ EfficientDet ใน Pytorch
ตัวอย่างการฝึกอบรมสามารถพบได้ที่นี่ บทเรียน น้ำหนักที่ผ่านการฝึกอบรมสามารถพบได้ที่นี่ น้ำหนัก
การแสดงอยู่ใกล้กับกระดาษมากมันยังคงเป็นโซตา
การทดสอบความเร็ว/FPS รวมถึงเวลาของการโพสต์โดยไม่มีเคล็ดลับความแม่นยำ JIT/ข้อมูล
| ค่าสัมประสิทธิ์ | pth_download | GPU MEM (MB) | FPS | Extreme FPS (batchsize 32) | แผนที่ 0.5: 0.95 (repo นี้) | แผนที่ 0.5: 0.95 (เป็นทางการ) |
|---|---|---|---|---|---|---|
| D0 | EfficientDet-d0.pth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | EfficientDet-d1.pth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | EfficientDet-d2.pth | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | EfficientDet-d3.pth | 2190 | 22.73 | - | 45.6 | 45.8 |
| D4 | EfficientDet-d4.pth | 2446 | 14.75 | - | 48.8 | 49.4 |
| D5 | EfficientDet-D5.Pth | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | EfficientDet-d6.pth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | EfficientDet-d7.pth | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7X | EfficientDet-d8.pth | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23] รองรับ EfficientDet-D7X, MAP 53.9 โดยใช้ EfficientNet-B7 เป็นกระดูกสันหลังและระดับพีระมิดที่ลึกกว่าของ BIFPN เพื่อความเรียบง่ายขอเรียกมันว่า EfficientTetet-D8
[2020-07-15] อัปเดตน้ำหนัก EfficientDet-D7, แผนที่ 52.7
[2020-05-11] เพิ่มการแปลงสตริงบูลีนเพื่อให้แน่ใจว่า head_only ทำงานได้
[2020-05-10] แทนที่ NMS ด้วย batched_nms เพื่อปรับปรุงแผนที่เพิ่มเติม 0.5 ~ 0.7 ขอบคุณ Laughing-Q
[2020-05-04] แก้ไขข้อผิดพลาด ID หมวดหมู่ Coco ที่ไม่ตรงกัน แต่ไม่ควรส่งผลกระทบต่อการฝึกอบรมในชุดข้อมูลที่กำหนดเอง
[2020-04-14] บั๊กฟังก์ชั่นการสูญเสียแก้ไข โปรดดึงรหัสล่าสุด
[2020-04-14] สำหรับผู้ที่ต้องการความช่วยเหลือหรือไม่สามารถได้รับผลลัพธ์ที่ดีหลังจากช่วงเวลาหลายครั้งลองดูบทช่วยสอนนี้ คุณสามารถเรียกใช้บน colab ด้วยการสนับสนุน GPU
[2020-04-10] บิดเบือนฟังก์ชั่นการสูญเสียภายในรูปแบบการฝึกอบรมเพื่อให้การใช้หน่วยความจำจะมีความสมดุลเมื่อการฝึกอบรมด้วย GPU หลายตัวช่วยให้การฝึกอบรมด้วย batchsize ที่ใหญ่กว่า
[2020-04-10] เพิ่ม D7 (D6 ที่มีขนาดอินพุตที่ใหญ่ขึ้นและสเกลสมอที่ใหญ่กว่า) และทดสอบแผนที่
[2020-04-09] อนุญาตเครื่องชั่งและอัตราส่วนจุดยึดแบบกำหนดเอง
[2020-04-08] เพิ่มการสนับสนุน D6 และทดสอบแผนที่
[2020-04-08] เพิ่มสคริปต์การฝึกอบรมและเอกสาร อัปเดตสคริปต์การประเมินและสคริปต์การอนุมานที่ง่าย
[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
การฝึกอบรม EfficientDet เป็นงานที่เจ็บปวดและใช้เวลานาน คุณไม่ควรคาดหวังว่าจะได้ผลลัพธ์ที่ดีภายในหนึ่งหรือสองวัน กรุณาอดทน
ตรวจสอบบทช่วยสอนนี้หากคุณยังใหม่กับสิ่งนี้ คุณสามารถเรียกใช้บน colab ด้วยการสนับสนุน 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.
Q1. ทำไมต้องใช้สิ่งนี้ในขณะที่มีโครงการ Pytorch ที่มีประสิทธิภาพหลายโครงการอยู่แล้ว
A1: เพราะ AFAIK ไม่มีใครในการกู้คืนอัลกอริทึมที่แท้จริงของ EfficientDet อย่างเป็นทางการอย่างเต็มที่นั่นเป็นสาเหตุที่ชุมชนของพวกเขาไม่สามารถบรรลุหรือมีช่วงเวลาที่ยากลำบากเพื่อให้ได้คะแนนเช่นเดียวกับ EfficientDet อย่างเป็นทางการโดยการฝึกอบรมตั้งแต่เริ่มต้น
Q2: อะไรคือความแตกต่างระหว่างที่เก็บนี้และที่อื่น ๆ คืออะไร?
A2: ตัวอย่างเช่นทั้งสองนี้เป็น EfficientDet-Pytorch ที่ได้รับความนิยมมากที่สุด
https://github.com/toandaominh1997/efficientdet.pytorch
https://github.com/signatrix/efficientdet
นี่คือปัญหาและทำไมสิ่งเหล่านี้จึงยากที่จะได้คะแนนเช่นเดียวกับอย่างเป็นทางการ:
คนแรก:
อันที่สอง:
batchNormalization ของ Pytorch นั้นแตกต่างจาก tensorflow เล็กน้อย, momentum_pytorch = 1 - momentum_tensorflow ฉันไม่ได้ตระหนักถึงกับดักนี้ถ้าฉันจ่ายเงินน้อยลง Signatrix/EfficientDet ประสบความสำเร็จในพารามิเตอร์จาก TensorFlow ดังนั้น BN จะทำงานได้ไม่ดีเนื่องจากค่าเฉลี่ยการทำงานและความแปรปรวนของการทำงานจะถูกครอบงำโดยอินพุตใหม่
การดำเนินการผิดพลาดของ conv2d ที่แยกออกไม่ได้ conv2d แบบแยกส่วนที่แยกได้คือ depthwise-conv2d และ pointwise-conv2d และ biasadd มีเพียง biasadd หลังจากสอง conv2d ในขณะที่ signatrix/efficientDet มี biasadd พิเศษบน depthwise-conv2d
เข้าใจผิดพารามิเตอร์แรกของ MaxPooling2D พารามิเตอร์แรกคือ KERNEL_SIZE แทนที่จะก้าวย่าง
หายไป bn หลังจาก downchannel ของคุณสมบัติของเอาต์พุต EfficientNet
การใช้คุณสมบัติเอาต์พุตที่ไม่ถูกต้องของ EfficientNet นี่คือสิ่งที่ยิ่งใหญ่ ต้องใช้ผลลัพธ์ที่มีความเชื่อมั่นของ 2 แต่มันผิด มันควรจะเป็นคนที่ conv.stride ต่อไปคือ 2 หรือผลลัพธ์สุดท้ายของ EfficientNet
ไม่ได้ใช้ช่องว่างภายในแบบเดียวกันกับ Conv2D และการรวมกลุ่ม
การเปิดใช้งาน Swish หายไปหลังจากการดำเนินการหลายครั้ง
การดำเนินการที่หายไป/BN ใน BIFPN, regressor และตัวจําแนก อันนี้ยุ่งยากมากถ้าคุณไม่ขุดลึกลงไปในการใช้งานอย่างเป็นทางการมีการดำเนินการเดียวกันกับน้ำหนักที่แตกต่างกัน
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 จาก EfficientNet-Pytorch ไม่ได้ทำงานเช่น TensorFlow กลยุทธ์การขยายนั้นแตกต่างกัน ดังนั้นฉันจึงใช้ conv2dstaticsamepadding และ maxpool2dstaticsamepadding ตัวเอง
แม้จะมีปัญหาข้างต้นพวกเขาเป็นที่เก็บที่ดีที่ให้ความกระจ่างแก่ฉันดังนั้นจึงมีที่เก็บนี้
พื้นที่เก็บข้อมูลนี้ส่วนใหญ่ขึ้นอยู่กับ EfficientDet ด้วยการเปลี่ยนแปลงที่ทำให้แน่ใจว่ามันทำงานได้ใกล้เคียงที่สุดเท่าที่จะเป็นไปได้
BTW การดีบักกราฟ Tensorflow V1 นั้นเจ็บปวดจริงๆ อย่าพยายามส่งออกด้วยเครื่องมืออัตโนมัติเช่น TF-ONNX หรือ MMDNN พวกเขาจะทำให้เกิดปัญหามากขึ้นเนื่องจากการดำเนินงานที่กำหนดเอง/ซับซ้อน
และแม้ว่าคุณจะประสบความสำเร็จอย่างที่ฉันทำคุณจะต้องจัดการกับรหัสที่สร้างขึ้นมาอย่างบ้าคลั่งภายใต้คลาสเดียวกันกับที่ใช้เวลาในการ refactor มากกว่าการแปลมันตั้งแต่เริ่มต้น
Q3: ฉันควรทำอย่างไรเมื่อพบข้อผิดพลาด?
A3: ตรวจสอบบันทึกการอัปเดตหากได้รับการแก้ไขแล้วดึงรหัสล่าสุดเพื่อลองอีกครั้ง หากไม่ช่วยสร้างปัญหาใหม่และอธิบายรายละเอียด
สรุป: พวกเขาให้ความแม่นยำเกือบเท่ากัน เคล็ดลับ: SET force_input_size=1920 repo อย่างเป็นทางการใช้ขนาดภาพดั้งเดิมในขณะที่ repo นี้ใช้ขนาดอินพุตเครือข่ายเริ่มต้น หากคุณพยายามเปรียบเทียบ repos สองตัวนี้คุณต้องตรวจสอบให้แน่ใจว่าขนาดอินพุตนั้นสอดคล้องกัน
ชื่นชมผลงานที่ยอดเยี่ยมจากที่เก็บต่อไปนี้:
หากคุณชอบพื้นที่เก็บข้อมูลนี้หรือหากคุณต้องการสนับสนุนผู้แต่งด้วยเหตุผลใดก็ตามคุณสามารถบริจาคให้กับผู้แต่งได้ อย่าลังเลที่จะส่งชื่อของคุณหรือแนะนำหน้าฉันจะตรวจสอบให้แน่ใจว่าชื่อของคุณในรายการผู้สนับสนุน
ขอขอบคุณอย่างจริงใจสำหรับความเอื้ออาทรของคุณ
Cndylan Claire-S11