Pytorch ulang implement dari EfficientDet resmi dengan kinerja SOTA secara real time, tautan kertas asli: https://arxiv.org/abs/1911.09070
Jika Anda memiliki masalah pelatihan dataset, dan jika Anda bersedia berbagi dataset dengan publik atau sudah terbuka, postinglah pada masalah dengan tag help wanted , saya mungkin mencoba membantu melatihnya untuk Anda, jika saya gratis, yang tidak dijamin.
Persyaratan:
Jumlah total gambar dataset tidak boleh lebih besar dari 10k, kapasitas harus di bawah 5GB, dan harus gratis untuk diunduh, yaitu Baiduyun.
Dataset harus dalam format repo ini.
Jika Anda memposting dataset Anda dalam repo ini, itu terbuka untuk dunia. Jadi tolong jangan unggah kumpulan data rahasia Anda!
Jika set data bertentangan dengan hukum atau menyerang privasi seseorang, jangan ragu untuk menghubungi saya untuk menghapusnya.
Yang terpenting, Anda tidak dapat meminta saya untuk berlatih kecuali saya mau.
Saya akan memposting bobot terlatih dalam repo ini bersama dengan hasil evaluasi.
Semoga membantu siapa pun yang ingin mencoba EfficientDet di Pytorch.
Contoh pelatihan dapat ditemukan di sini. tutorial. Bobot terlatih dapat ditemukan di sini. bobot
Kinerja sangat dekat dengan kertas, masih sota.
Tes kecepatan/FPS mencakup waktu pasca-pemrosesan tanpa trik presisi JIT/data.
| koefisien | pth_download | GPU mem (MB) | FPS | FPS ekstrem (Batchsize 32) | Peta 0,5: 0,95 (repo ini) | Peta 0,5: 0,95 (resmi) |
|---|---|---|---|---|---|---|
| D0 | efisiensidet-d0.pth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | efisiensidet-d1.pth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | efisiensidet-d2.pth | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | efisiensidet-d3.pth | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | efisiensidet-d4.pth | 1903 | 14.75 | - | 48.8 | 49.4 |
| D5 | efisiensidet-d5.pth | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | efisiensidet-d6.pth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | efisiensidet-d7.pth | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7X | efisiensidet-d8.pth | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23] mendukung efisiensidet-d7x, peta 53.9, menggunakan EfficientNet-B7 sebagai tulang punggungnya dan tingkat piramida BIFPN yang lebih dalam. Demi kesederhanaan, sebut saja EfficientDet-D8.
[2020-07-15] Perbarui bobot efisiensi-d7, peta 52.7
[2020-05-11] Tambahkan Konversi String Boolean untuk memastikan pekerjaan head_only
[2020-05-10] Ganti NMS dengan batched_nms untuk lebih meningkatkan peta sebesar 0,5 ~ 0,7, terima kasih tertawa-Q.
[2020-05-04] Memperbaiki Coco Category ID Mismatch Bug, tetapi seharusnya tidak memengaruhi pelatihan pada dataset khusus.
[2020-04-14] Bug fungsi kerugian tetap. Harap tarik kode terbaru.
[2020-04-14] Untuk mereka yang membutuhkan bantuan atau tidak bisa mendapatkan hasil yang baik setelah beberapa zaman, lihat tutorial ini. Anda dapat menjalankannya di Colab dengan dukungan GPU.
[2020-04-10] Warp Fungsi kerugian dalam model pelatihan, sehingga penggunaan memori akan seimbang saat pelatihan dengan beberapa GPU, memungkinkan pelatihan dengan ukuran batch yang lebih besar.
[2020-04-10] Tambahkan D7 (D6 dengan ukuran input yang lebih besar dan skala jangkar yang lebih besar) Dukungan dan uji petanya
[2020-04-09] Izinkan skala jangkar khusus dan rasio
[2020-04-08] Tambahkan dukungan D6 dan uji petanya
[2020-04-08] Tambahkan skrip pelatihan dan dokumennya; Perbarui skrip eval dan skrip inferensi sederhana.
[2020-04-07] Peta D0-D5 yang Diuji, hasilnya tampaknya bagus, detailnya dapat ditemukan di sini
[2020-04-07] Memperbaiki strategi jangkar.
[2020-04-06] Adaptasi strategi jangkar.
[2020-04-05] Buat repositori ini.
# 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
Pelatihan EfficientDet adalah tugas yang menyakitkan dan memakan waktu. Anda seharusnya tidak berharap mendapatkan hasil yang baik dalam satu atau dua hari. Harap bersabar.
Lihat tutorial ini jika Anda baru dalam hal ini. Anda dapat menjalankannya di Colab dengan dukungan 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. Mengapa mengimplementasikan ini sementara sudah ada beberapa proyek Pytorch yang efisien.
A1: Karena Afaik tidak ada dari mereka yang sepenuhnya memulihkan algoritma yang sebenarnya dari EfficientDet resmi, itulah sebabnya komunitas mereka tidak dapat mencapai atau mengalami kesulitan untuk mencapai skor yang sama dengan EfficientDet resmi dengan pelatihan dari awal.
T2: Apa sebenarnya perbedaan di antara repositori ini dan yang lainnya?
A2: Misalnya, keduanya adalah yang paling populer Efisiensi-Pytorch,
https://github.com/toandaominh1997/efficientdet.pytorch
https://github.com/signatrix/eficientdet
Inilah masalahnya dan mengapa ini sulit untuk mencapai skor yang sama dengan yang resmi:
Yang pertama:
Yang kedua:
Batchnormalisasi Pytorch sedikit berbeda dari TensorFlow, momentum_pytorch = 1 - momentum_tensorflow. Yah saya tidak menyadari perangkap ini jika saya membayar lebih sedikit perhatian. Signatrix/EfficientDet menggantikan parameter dari TensorFlow, sehingga BN akan berkinerja buruk karena menjalankan rata -rata dan varian berjalan didominasi oleh input baru.
Salah mengimplementasikan konv2d yang dapat dipisahkan secara mendalam. Conv2D yang dapat dipisahkan secara mendalam adalah depthwise-conv2D dan pointwise-conv2d dan biasadd, hanya ada biasadd setelah dua conv2d, sedangkan Signatrix/EfficientDet memiliki biasadd tambahan pada depthwise-conV2D.
Salah paham parameter pertama maxpooling2d, parameter pertama adalah kernel_size, bukan langkah.
BN yang hilang setelah downchannel fitur output EfficientNet.
Menggunakan fitur output yang salah dari EfficientNet. Ini yang besar. Dibutuhkan output apa pun yang memiliki Conv.stride 2, tapi itu salah. Itu harus menjadi orang yang conv.stride berikutnya adalah 2 atau output akhir dari EfficientNet.
Tidak menerapkan padding yang sama pada conv2d dan pooling.
Aktivasi swish yang hilang setelah beberapa operasi.
Operasi CONV/BN yang hilang di BIFPN, Regressor dan Classifier. Yang ini sangat rumit, jika Anda tidak menggali lebih dalam tentang implement resmi, ada beberapa operasi yang sama dengan bobot yang berbeda.
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 -------->
Misalnya, P4 akan turun ke P4_0, maka itu menjadi P4_1, siapa pun dapat menerima begitu saja bahwa P4_0 pergi ke P4_2 secara langsung, kan?
Itu sebabnya mereka salah, P4 harus menurunkan channel lagi dengan bobot yang berbeda dengan P4_0_Anterother, maka itu pergi ke P4_2.
Dan akhirnya beberapa masalah umum, decoder dan encoder jangkar mereka berbeda dari yang asli, tetapi itu bukan alasan utama berkinerja buruk.
Juga, conv2dstaticsAmepadding dari EfficientNet-Pytorch tidak berkinerja seperti TensorFlow, strategi padding berbeda. Jadi saya menerapkan conv2dstaticsAmepadding gaya tensorflow nyata dan maxpool2dstaticsamepadding sendiri.
Terlepas dari masalah -masalah di atas, mereka adalah repositori hebat yang mencerahkan saya, karenanya ada repositori ini.
Repositori ini terutama didasarkan pada EfficientDet, dengan perubahan yang memastikan bahwa ia berkinerja lebih dekat seperti kertas.
BTW, debugging static-graph Tensorflow V1 benar-benar menyakitkan. Jangan mencoba mengekspornya dengan alat otomatisasi seperti TF-INNX atau MMDNN, mereka hanya akan menyebabkan lebih banyak masalah karena operasi khusus/kompleksnya.
Dan bahkan jika Anda berhasil, seperti yang saya lakukan, Anda harus berurusan dengan kode yang dihasilkan mesin yang kacau di bawah kelas yang sama yang membutuhkan lebih banyak waktu untuk refactor daripada menerjemahkannya dari awal.
T3: Apa yang harus saya lakukan ketika saya menemukan bug?
A3: Lihat log pembaruan jika sudah diperbaiki, lalu tarik kode terbaru untuk mencoba lagi. Jika tidak membantu, buat masalah baru dan jelaskan secara detail.
Kesimpulan: Mereka memberikan ketepatan yang hampir sama. Kiat: Set force_input_size=1920 . Repo resmi menggunakan ukuran gambar asli sementara repo ini menggunakan ukuran input jaringan default. Jika Anda mencoba membandingkan dua repo ini, Anda harus memastikan ukuran input konsisten.
Hargai pekerjaan hebat dari repositori berikut:
Jika Anda menyukai repositori ini, atau jika Anda ingin mendukung penulis dengan alasan apa pun, Anda dapat menyumbang kepada penulis. Jangan ragu untuk mengirimi saya nama Anda atau memperkenalkan halaman, saya akan memastikan nama Anda di daftar sponsor.
Dengan tulus terima kasih atas kemurahan hati Anda.
Cndylan Claire-S11