El reimplamento Pytorch del Det Efficient Det oficial con el rendimiento de Sota en tiempo real, enlace de papel original: https://arxiv.org/abs/1911.09070
Si tiene problemas para capacitar un conjunto de datos, y si está dispuesto a compartir su conjunto de datos con el público o ya está abierto, publíquelo en problemas con la etiqueta help wanted , podría intentar ayudarlo por usted, si soy libre, lo que no está garantizado.
Requisitos:
El número total de la imagen del conjunto de datos no debe ser mayor que 10k, la capacidad debe estar por debajo de 5 GB, y debe ser gratuita, es decir, Baiduyun.
El conjunto de datos debe estar en el formato de este repositorio.
Si publica su conjunto de datos en este repositorio, está abierto al mundo. ¡Así que por favor no cargue sus conjuntos de datos confidenciales!
Si los conjuntos de datos están en contra de la ley o invaden la privacidad, no dude en ponerse en contacto conmigo para eliminarlo.
Lo más importante es que no puedes exigirme entrenar a menos que quisiera.
Publicaré los pesos entrenados en este repositorio junto con el resultado de la evaluación.
Espero que ayude a quien quiera probar eficiente Det en Pytorch.
Se pueden encontrar ejemplos de capacitación aquí. tutoriales. Los pesos entrenados se pueden encontrar aquí. pesas
El rendimiento está muy cerca del periódico, todavía es Sota.
La prueba de velocidad/FPS incluye el tiempo de postprocesamiento sin truco de precisión JIT/Data.
| coeficiente | pth_download | GPU MEM (MB) | FPS | FPS extremo (BatchSize 32) | Mapa 0.5: 0.95 (este repositorio) | Mapa 0.5: 0.95 (oficial) |
|---|---|---|---|---|---|---|
| D0 | eficienteDet-d0.pth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | eficienteDet-D1.pth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | eficiente DET-D2.PTH | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | eficiente det-d3.pth | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | eficiente DET-D4.PTH | 1903 | 14.75 | - | 48.8 | 49.4 |
| D5 | eficiente det-d5.tth | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | eficiente det-d6.pth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | eficiente DET-D7.PTH | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7x | eficiente DET-D8.PTH | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23] admite eficiente DET-D7X, MAP 53.9, utilizando EfficientNet-B7 como su columna vertebral y un nivel piramidal más profundo de BIFPN. En aras de la simplicidad, llamémoslo eficiente Det-D8.
[2020-07-15] Actualizar pesos eficientes de DET-D7, mapa 52.7
[2020-05-11] Agregue la conversión de cadenas booleanas para asegurarse de que funcione Head_only
[2020-05-10] Reemplace NMS con Batched_NMS para mejorar aún más el MAP en 0.5 ~ 0.7, gracias a Rishing-Q.
[2020-05-04] corrige el error de desajuste de ID de la categoría Coco, pero no debería afectar la capacitación en un conjunto de datos personalizado.
[2020-04-14] Se corrigió el error de la función de pérdida. Por favor, extraiga el último código.
[2020-04-14] Para aquellos que necesitan ayuda o no pueden obtener un buen resultado después de varias épocas, consulte este tutorial. Puede ejecutarlo en Colab con soporte de GPU.
[2020-04-10] deforma la función de pérdida dentro del modelo de entrenamiento, de modo que el uso de la memoria se equilibrará cuando se entrene con múltiples GPU, lo que permite el entrenamiento con mayor lotes.
[2020-04-10] Agregue D7 (D6 con un tamaño de entrada más grande y escala de anclaje más grande) Apoye y pruebe su mapa
[2020-04-09] Permitir escalas y proporciones de anclaje personalizadas
[2020-04-08] Agregue el soporte D6 y pruebe su mapa
[2020-04-08] Agregar guión de entrenamiento y su DOC; Actualizar el script eval y el script de inferencia simple.
[2020-04-07] Mapa D0-D5 probado, el resultado parece bueno, los detalles se pueden encontrar aquí
[2020-04-07] Arreglar las estrategias de anclajes.
[2020-04-06] adaptar estrategias de anclaje.
[2020-04-05] Cree este repositorio.
# 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
Entrenar eficiente Det es una tarea dolorosa y que requiere mucho tiempo. No debe esperar obtener un buen resultado en uno o dos días. Por favor, sea paciente.
Mira este tutorial si eres nuevo en esto. Puede ejecutarlo en Colab con soporte de 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. ¿Por qué implementar esto mientras ya hay varios proyectos de Pytorch eficiente?
A1: Debido a que AFAIK ninguno de ellos recupera completamente el algoritmo verdadero del Det EficeTient Official, por eso sus comunidades no pudieron lograr o tener dificultades para lograr el mismo puntaje que el Dettet Oficial al entrenar desde cero.
P2: ¿Cuál es exactamente la diferencia entre este repositorio y los demás?
A2: Por ejemplo, estos dos son el más popular eficiente Det-Pytorch,
https://github.com/toandaominh1997/eficienteDet.pytorch
https://github.com/signatrix/eficienceDet
Aquí están los problemas y por qué estos son difíciles de lograr el mismo puntaje que el oficial:
El primero:
El segundo:
La batchnormalización de Pytorch es ligeramente diferente de TensorFlow, Momentum_Pytorch = 1 - Momentum_tensorflow. Bueno, no me di cuenta de esta trampa si pagaba menos atenciones. Signatrix/EfficientDet sucedió el parámetro de TensorFlow, por lo que el BN funcionará mal porque la media de ejecución y la varianza de ejecución están siendo dominadas por la nueva entrada.
Implemento erróneo de Conv2d de profundidad-separable. Conv2D de profundidad se separe es profundamente-Conv2D y Pointwise-Conv2D y BiSAdd, solo hay un sesgado después de dos conv2d, mientras que Signatrix/EfficientDet tiene un sesado adicional en profundidad-Conv2d.
Informe el primer parámetro de Maxpooling2d, el primer parámetro es Kernel_Size, en lugar de Stride.
Falta BN después del canal descendente de la característica de la salida EficeTientNet.
Uso de la función de salida incorrecta de EficeTientNet. Este es grande. Se necesita cualquier salida que tenga el Conv.fastide de 2, pero está mal. Debe ser el que el próximo stride conv. Es 2 o la salida final de eficiente NET.
No aplica el mismo acolchado en conv2d y agrupación.
Falta activación de Swish después de varias operaciones.
Operaciones de Conv/BN faltantes en BIFPN, regresor y clasificador. Este es muy complicado, si no profundiza en el implemento oficial, hay algunas mismas operaciones con diferentes pesos.
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 -------->
Por ejemplo, P4 Downchannel a P4_0, luego se va P4_1, cualquiera puede dar por sentado que P4_0 va a P4_2 directamente, ¿verdad?
Es por eso que están equivocados, P4 debe volver a canalizar con un peso diferente a P4_0_ANOTHER, luego va a P4_2.
Y finalmente algunos problemas comunes, su decodificador y codificador de anclaje son diferentes de los originales, pero no es la razón principal por la que funciona mal.
Además, Conv2DStaticsApadding de EfficientNet-Pytorch no funciona como TensorFlow, la estrategia de relleno es diferente. Así que implemento un verdadero Conv2DStaticsApadding de estilo tensorflow y Maxpool2DStaticsAmepadding.
A pesar de los problemas anteriores, son excelentes repositorios que me iluminan, por lo tanto, existe este repositorio.
Este repositorio se basa principalmente en eficiente DET, con el cambio que asegura que funcione lo más cerca posible como el documento.
Por cierto, la depuración de tensorflow de gráfico estático es realmente doloroso. No intente exportarlo con herramientas de automatización como TF-ONNX o MMDNN, solo causarán más problemas debido a sus operaciones personalizadas/complejas.
E incluso si tuvo éxito, como lo hice yo, tendrá que lidiar con el código generado por la ametralladora loca bajo la misma clase que lleva más tiempo para refactorizar que traducirlo desde cero.
P3: ¿Qué debo hacer cuando encuentro un error?
A3: Consulte el registro de actualización si se ha solucionado, luego extraiga el último código para intentarlo nuevamente. Si no ayuda, cree un nuevo problema y descrita en detalle.
Conclusión: están proporcionando casi la misma precisión. Consejos: set force_input_size=1920 . El repositorio oficial utiliza el tamaño de la imagen original, mientras que este repositorio utiliza el tamaño de entrada de red predeterminado. Si intenta comparar estos dos repos, debe asegurarse de que el tamaño de entrada sea consistente.
Aprecia el gran trabajo de los siguientes repositorios:
Si le gusta este repositorio, o si desea apoyar al autor por algún motivo, puede donar al autor. No dude en enviarme su nombre o presente páginas, me aseguraré de que su (s) nombre (s) en la lista de patrocinadores.
Sinceramente gracias por su generosidad.
Cndylan Claire-S11