La réimplément Pytorch de l'efficacité officielle avec les performances SOTA en temps réel, lien papier d'origine: https://arxiv.org/abs/1911.09070
Si vous avez des problèmes à former un ensemble de données, et si vous êtes prêt à partager votre ensemble de données avec le public ou il est déjà ouvert, publiez-le sur les problèmes avec une balise help wanted , je pourrais essayer de vous aider à former pour vous, si je suis libre, ce qui n'est pas garanti.
Exigences:
Le nombre total de l'image de l'ensemble de données ne doit pas être supérieur à 10k, la capacité doit être inférieure à 5 Go, et elle devrait être gratuite à télécharger, c'est-à-dire Baiduyun.
L'ensemble de données doit être dans le format de ce dépôt.
Si vous publiez votre ensemble de données dans ce dépôt, il est ouvert au monde. Veuillez donc ne pas télécharger vos ensembles de données confidentiels!
Si les ensembles de données sont contre la loi ou envahissent sa vie privée, n'hésitez pas à me contacter pour le supprimer.
Plus important encore, vous ne pouvez pas me demander de m'entraîner à moins que je le veuille.
Je publierai les poids qualifiés dans ce dépôt ainsi que le résultat d'évaluation.
J'espère que cela aide celui qui veut essayer EfficientDet à Pytorch.
Des exemples de formation peuvent être trouvés ici. tutoriels. Les poids formés peuvent être trouvés ici. poids
Les performances sont très proches du journal, c'est toujours Sota.
Le test Speed / FPS comprend le temps de post-traitement sans astuce JIT / Data Precision.
| coefficient | pth_download | GPU MEM (MB) | FPS | FPS extrêmes (BatchSize 32) | Carte 0,5: 0,95 (ce repo) | Carte 0,5: 0,95 (officiel) |
|---|---|---|---|---|---|---|
| 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 | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | EfficientDet-D4.pth | 1903 | 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] prend en charge EfficientDet-D7x, Map 53.9, en utilisant EfficientNet-B7 comme squelette et un niveau pyramide supplémentaire plus profond de BIFPN. Par souci de simplicité, appelons-le efficace de D8.
[2020-07-15] Mettez à jour les poids EfficientDet-D7, carte 52.7
[2020-05-11] Ajoutez une conversion de chaîne booléenne pour s'assurer que Head_only fonctionne
[2020-05-10] Remplacez les NMS par BatchED_NMS pour améliorer encore MAP de 0,5 à 0,7, grâce à rire-Q.
[2020-05-04] Correction d'un bug de décalage d'identification de la catégorie CoCo, mais cela ne devrait pas affecter la formation sur l'ensemble de données personnalisé.
[2020-04-14] Correction du bug de la fonction de perte. Veuillez extraire le dernier code.
[2020-04-14] Pour ceux qui ont besoin d'aide ou qui ne peuvent pas obtenir un bon résultat après plusieurs époques, consultez ce tutoriel. Vous pouvez l'exécuter sur Colab avec le support GPU.
[2020-04-10] Déterrent la fonction de perte dans le modèle de formation, afin que l'utilisation de la mémoire soit équilibrée lors de la formation avec plusieurs GPU, permettant une formation avec un lot plus grand.
[2020-04-10] Ajouter D7 (D6 avec une plus grande taille d'entrée et une plus grande échelle d'ancrage) et tester sa carte
[2020-04-09] Autoriser les échelles et les ratios d'ancrage personnalisés
[2020-04-08] Ajouter la prise en charge D6 et tester sa carte
[2020-04-08] Ajouter un script de formation et son doc; Mettez à jour le script EVAL et le script d'inférence simple.
[2020-04-07] Tested D0-D5 Map, le résultat semble sympa, les détails peuvent être trouvés ici
[2020-04-07] Correction des stratégies d'ancrage.
[2020-04-06] Adapter les stratégies d'ancrage.
[2020-04-05] Créez ce référentiel.
# 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
La formation EfficientDet est une tâche douloureuse et longue. Vous ne devriez pas vous attendre à obtenir un bon résultat dans un jour ou deux. Soyez patient.
Consultez ce tutoriel si vous êtes nouveau dans ce domaine. Vous pouvez l'exécuter sur Colab avec le support 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. Pourquoi mettre en œuvre cela bien qu'il existe déjà plusieurs projets Pytorch efficaces.
A1: Parce qu'Afaik aucun ne récupère pleinement le véritable algorithme de l'efficacité officielle, c'est pourquoi leurs communautés n'ont pas pu réaliser ou avoir du mal à atteindre le même score que l'efficacité officielle en s'entraînant à partir de zéro.
Q2: Quelle est exactement la différence entre ce référentiel et les autres?
A2: Par exemple, ces deux sont les plus populaires EfficientDet-Pytorch,
https://github.com/toandaominh1997/efficientdet.pytorch
https://github.com/signatrix/efficientdet
Voici les problèmes et pourquoi ceux-ci sont difficiles à atteindre le même score que celui officiel:
Le premier:
Le second:
Le BatchNormalisation de Pytorch est légèrement différent de TensorFlow, momentum_pytorch = 1 - momentum_tensorflow. Eh bien, je ne réalisais pas ce piège si je payais moins d'attentions. Signatrix / EfficientDet a succédé au paramètre de TensorFlow, donc le BN fonctionnera gravement parce que la moyenne exécutée et la variance d'exécution sont dominées par la nouvelle entrée.
Merfection de la mise en œuvre de Conv2d séparable dans le sens de la profondeur. Conv2D, séparable dans le sens de la profondeur, est en profondeur-Conv2d et PointWise-Conv2d et BIASADD, il n'y a qu'un biaisadd après deux conv2D, tandis que Signatrix / EfficientDet a un biasadd supplémentaire sur la profondeur-Conv2D.
Misonction du premier paramètre de Maxpooling2d, le premier paramètre est Kernel_Size, au lieu de la foulée.
BN manquant après le canal descendant de la fonctionnalité de la sortie efficace.
Utilisation de la mauvaise fonction de sortie de l'efficacité. C'est grand. Il faut la sortie qui a la diffusion conv. de 2, mais c'est mal. Ce devrait être celui dont le prochain Conv.stride est 2 ou la sortie finale d'EfficientNet.
N'applique pas le même rembourrage sur Conv2D et la mise en commun.
L'activation passante manquante après plusieurs opérations.
Opérations Conv / BN manquantes dans BIFPN, régresseur et classificateur. Celui-ci est très délicat, si vous ne creusez pas plus profondément dans l'outil officiel, il y a des mêmes opérations avec des poids différents.
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 -------->
Par exemple, P4 sera en descente à P4_0, puis il va P4_1, n'importe qui peut prendre pour acquis que P4_0 va à P4_2 directement, non?
C'est pourquoi ils ont tort, P4 devrait à nouveau Downchannel avec un poids différent de P4_0_another, puis il passe à P4_2.
Et enfin, certains problèmes courants, leur décodeur d'ancrage et leur encodeur sont différents de l'original, mais ce n'est pas la principale raison pour laquelle il fonctionne mal.
En outre, Conv2DStaticsAmEpadding à partir de l'efficacité-pytorch ne fonctionne pas comme TensorFlow, la stratégie de rembourrage est différente. Je mets donc en œuvre un véritable CONV2DStaticsAmEpadding de style TensorFlow et maxpool2dstaticsaPadding.
Malgré les problèmes ci-dessus, ce sont de grands référentiels qui m'éclairent, il y a donc ce référentiel.
Ce référentiel est principalement basé sur EfficientDet, avec le changement qui s'assure qu'il fonctionne aussi plus que possible que le papier.
BTW, le débogage de Tensorflow V1 de débogage est vraiment douloureux. N'essayez pas de l'exporter avec des outils d'automatisation tels que TF-SNEX ou MMDNN, ils ne causeront plus de problèmes en raison de ses opérations personnalisées / complexes.
Et même si vous avez réussi, comme je l'ai fait, vous devrez faire face au code fou généré par la machine dans la même classe qui prend plus de temps à refactor que de le traduire à partir de zéro.
Q3: Que dois-je faire lorsque je trouve un bug?
A3: Consultez le journal de mise à jour s'il a été corrigé, puis retirez le dernier code pour réessayer. Si cela n'aide pas, créez un nouveau problème et décrivez-le en détail.
Conclusion: Ils fournissent presque la même précision. Conseils: Set force_input_size=1920 . Le repo officiel utilise la taille d'image d'origine tandis que ce repo utilise la taille de l'entrée du réseau par défaut. Si vous essayez de comparer ces deux dépositions, vous devez vous assurer que la taille de l'entrée est cohérente.
Appréciez le grand travail des référentiels suivants:
Si vous aimez ce référentiel, ou si vous souhaitez soutenir l'auteur pour quelque raison que ce soit, vous pouvez faire un don à l'auteur. N'hésitez pas à m'envoyer votre nom ou à introduire des pages, je m'assurerai que vos noms sur la liste des sponsors.
Merci sincèrement pour votre générosité.
Cndylan Claire-S11