O reimplemento de Pytorch do eficácia oficial com desempenho SOTA em tempo real, link de papel original: https://arxiv.org/abs/1911.09070
Se você tiver problemas para treinar um conjunto de dados e, se estiver disposto a compartilhar seu conjunto de dados com o público ou já está aberto, publique -o em problemas com a tag help wanted , eu posso tentar ajudar a treiná -lo para você, se estiver livre, o que não é garantido.
Requisitos:
O número total da imagem do conjunto de dados não deve ser maior que 10k, a capacidade deve estar abaixo de 5 GB e deve ser gratuita para download, por exemplo, Baiduyun.
O conjunto de dados deve estar no formato deste repo.
Se você postar seu conjunto de dados neste repositório, ele será aberto ao mundo. Portanto, não envie seus conjuntos de dados confidenciais!
Se os conjuntos de dados forem contra a lei ou invadirem a privacidade de alguém, não hesite em entrar em contato comigo para excluí -la.
Mais importante, você não pode me exigir treinar, a menos que eu queira.
Vou postar os pesos treinados neste repositório junto com o resultado da avaliação.
Espero que ajude quem quiser experimentar eficientes em Pytorch.
Exemplos de treinamento podem ser encontrados aqui. tutoriais. Os pesos treinados podem ser encontrados aqui. pesos
O desempenho está muito próximo do artigo, ainda é SOTA.
O teste de velocidade/FPS inclui o tempo de pós-processamento, sem truque de precisão JIT/Data.
| coeficiente | pth_download | GPU MEM (MB) | FPS | Extreme FPS (BatchSize 32) | Mapa 0.5: 0,95 (este repo) | Mapa 0.5: 0,95 (oficial) |
|---|---|---|---|---|---|---|
| D0 | eficientedet-d0.tth | 1049 | 36.20 | 163.14 | 33.1 | 33.8 |
| D1 | eficientedet-d1.tth | 1159 | 29.69 | 63.08 | 38.8 | 39.6 |
| D2 | eficientedet-d2.pth | 1321 | 26.50 | 40.99 | 42.1 | 43.0 |
| D3 | eficienteDet-D3.PTH | 1647 | 22.73 | - | 45.6 | 45.8 |
| D4 | eficientedet-d4.pth | 1903 | 14.75 | - | 48.8 | 49.4 |
| D5 | eficienteDet-D5.Pth | 2255 | 7.11 | - | 50.2 | 50.7 |
| D6 | eficientedet-d6.tth | 2985 | 5.30 | - | 50.7 | 51.7 |
| D7 | eficientedet-d7.pth | 3819 | 3.73 | - | 52.7 | 53.7 |
| D7x | eficientedet-d8.tth | 3983 | 2.39 | - | 53.9 | 55.1 |
[2020-07-23] suporta eficienteDET-D7X, mapa 53.9, usando eficientesNET-B7 como backbone e um nível extra mais profundo da pirâmide de BIFPN. Por uma questão de simplicidade, vamos chamá-lo de eficácia-D8.
[2020-07-15] Atualizar pesos eficientes-D7, mapa 52.7
[2020-05-11] Adicione a conversão booleana de cordas para garantir que o Head_only
[2020-05-10] Substitua o NMS por Batched_NMs para melhorar ainda mais o mapa em 0,5 ~ 0,7, graças a rir-Q.
[2020-05-04] Corrija o bug de incompatibilidade do ID da categoria Coco, mas não deve afetar o treinamento no conjunto de dados personalizado.
[2020-04-14] Bug da função de perda fixa. Puxe o código mais recente.
[2020-04-14] Para aqueles que precisam de ajuda ou não podem obter um bom resultado após várias épocas, confira este tutorial. Você pode executá -lo no COLAB com suporte à GPU.
[2020-04-10] deformar a função de perda no modelo de treinamento, para que o uso da memória seja equilibrado ao treinar com várias GPUs, permitindo o treinamento com lotes maiores.
[2020-04-10] Adicionar D7 (D6 com tamanho de entrada maior e maior escala de âncora) e teste seu mapa
[2020-04-09] Permitir escalas e proporções de âncora personalizadas
[2020-04-08] Adicione suporte D6 e teste seu mapa
[2020-04-08] Adicionar script de treinamento e seu DOC; Atualize o script de avaliação e o script de inferência simples.
[2020-04-07] Testado mapa d0-d5, resultado parece bom, detalhes podem ser encontrados aqui
[2020-04-07] Corrija estratégias de âncoras.
[2020-04-06] Adaptar estratégias de âncora.
[2020-04-05] Crie este repositório.
# 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
O treinamento eficiente de eficiente é uma tarefa dolorosa e demorada. Você não deve esperar obter um bom resultado dentro de um ou dois dias. Por favor, seja paciente.
Confira este tutorial se você é novo nisso. Você pode executá -lo no COLAB com suporte à 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 que implementar isso enquanto existem vários projetos eficientes do Pytorch já.
A1: Como o Afaik nenhum deles recupera completamente o verdadeiro algoritmo do eficiente oficial oficial, é por isso que suas comunidades não conseguiram alcançar ou ter dificuldade em alcançar a mesma pontuação que o eficiente oficial treinando do zero.
P2: Qual é exatamente a diferença nesse repositório e os outros?
A2: por exemplo, esses dois são os mais populares eficientesdet-pytorch,
https://github.com/toandaominhh1997/effecitydet.pytorch
https://github.com/signatrix/effectdet
Aqui estão os problemas e por que eles são difíceis de alcançar a mesma pontuação que a oficial:
O primeiro:
O segundo:
A Normalização em Batch de Pytorch é ligeiramente diferente do TensorFlow, MomMum_Pytorch = 1 - MomMum_tensorFlow. Bem, eu não percebi essa armadilha se pagasse menos atenção. Signatrix/eficientedet sucedeu o parâmetro do TensorFlow, para que o BN tenha um desempenho ruim porque a média de execução e a variação em execução está sendo dominada pela nova entrada.
MALMPLEMENTO DE CONV2D SEMPARABILIÁRIO DE APRESENTE. O CONV2D profundamente se separado é profundamente-CONV2D e Pointwise-ConV2D e BiasAdd, há apenas um viés após dois conv2d, enquanto o Signatrix/EficienteDet tem um viés extra em profundidade-conflito.
Remunha mal o primeiro parâmetro do maxpooling2D, o primeiro parâmetro é Kernel_size, em vez do stride.
Falta BN após o donquannel do recurso da saída EFIFIFITFYNET.
Usando o recurso de saída errado do eficienteNET. Este é grande. É preciso qualquer saída que tenha a luta de 2, mas está errado. Deve ser aquele cuja próxima convocação é 2 ou a saída final do eficienteNET.
Não aplica o mesmo preenchimento no Conv2d e agrupamento.
Faltando a ativação do SWISH após várias operações.
Operações de Conv/BN ausentes no BIFPN, regressor e classificador. Este é muito complicado, se você não se aprofundar no implemento oficial, existem algumas mesmas operações com pesos diferentes.
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 exemplo, o P4 será donChannel para P4_0, então é P4_1, alguém pode dar como certo que o P4_0 vai para P4_2 diretamente, certo?
É por isso que eles estão errados, o P4 deve ser don -shannel novamente com pesos diferentes para P4_0_ANOTHER, então ele vai para P4_2.
E, finalmente, alguns problemas comuns, seu decodificador e codificador de âncora são diferentes dos originais, mas não é a principal razão pela qual ele tem um desempenho ruim.
Além disso. Por isso, implementei um verdadeiro Conv2dStaticsamePadding de Tensorflow e Maxpool2dstaticsamepadding.
Apesar das questões acima, são grandes repositórios que me iluminam, portanto, existe esse repositório.
Esse repositório é baseado principalmente no eficienteDet, com a alteração que garante que ela tenha o desempenho mais próximo possível do papel.
BTW, depurar tensorflow V1 estático é realmente doloroso. Não tente exportá-lo com ferramentas de automação como TF-NONX ou MMDNN, eles causarão apenas mais problemas devido às suas operações personalizadas/complexas.
E mesmo que você tenha conseguido, como eu, terá que lidar com o código maluco gerado por máquina, sob a mesma classe que leva mais tempo para refatorar do que traduzi-lo do zero.
Q3: O que devo fazer quando encontrar um bug?
A3: Confira o log de atualização, se ele foi corrigido e puxe o código mais recente para tentar novamente. Se não ajudar, crie um novo problema e descreva -o em detalhes.
Conclusão: Eles estão fornecendo quase a mesma precisão. Dicas: set force_input_size=1920 . O repositório oficial usa o tamanho da imagem original, enquanto este repositório usa o tamanho de entrada de rede padrão. Se você tentar comparar esses dois repositórios, deverá garantir que o tamanho da entrada seja consistente.
Aprecie o excelente trabalho dos seguintes repositórios:
Se você gosta deste repositório, ou se quiser apoiar o autor por qualquer motivo, poderá doar ao autor. Sinta -se à vontade para me enviar seu nome ou apresentar páginas, vou garantir que seu (s) nome (s) na lista de patrocinadores.
Agradeço sinceramente por sua generosidade.
CNDYLAN CLAIRE-S11