YOLOv4 - a rede neural em tempo real mais precisa no conjunto de dados Microsoft COCO

O Darknet YOLOv4 é mais rápido / preciso do que o Google TensorFlow EfficientDet e o FaceBook Pytorch / Detectron RetinaNet / MaskRCNN.

O mesmo artigo em medium : medium
Código : github.com/AlexeyAB/darknet
Artigo : arxiv.org/abs/2004.10934


Mostraremos algumas nuances de comparação e uso de redes neurais para detectar objetos.

Nosso objetivo era desenvolver um algoritmo de detecção de objetos para uso em produtos reais, e não apenas avançar a ciência. A precisão da rede neural YOLOv4 (608x608) é de 43,5% AP / 65,7% AP50 Microsoft-COCO-testdev.

62 FPS - YOLOv4 (lote 608x608 = 1) no Tesla V100 - usando o framework Darknet
400 FPS - YOLOv4 (lote 416x416 = 4) no RTX 2080 Ti - usando TensorRT + tkDNN
32 FPS - YOLOv4 (lote 416x416 = 1) no Jetson AGX Xavier - usando TensorRT + tkDNN




Primeiro, alguns links úteis.




Nossa rede neural YOLOv4 e nossa própria estrutura Darknet DL (C / C ++ / CUDA) são melhores em velocidade de FPS e precisão AP50: 95 e AP50 em conjuntos de dados Microsoft COCO do que estruturas DL e redes neurais: Google TensorFlow EfficientDet, FaceBook Detectron RetinaNet / MaskRCNN, PyTorch Yolov3-ASFF e muitos outros ... O YOLOv4 alcança precisão de 43,5% AP / 65,7% AP50 no teste Microsoft COCO a uma velocidade de 62 FPS TitanV ou 34 FPS RTX 2070. Ao contrário de outros detectores modernos, o YOLOv4 pode treinar qualquer pessoa com quem tiver a placa gráfica da nVidia para jogos com VRAM de 8 a 16 GB. Agora, não apenas as grandes empresas podem treinar uma rede neural em centenas de GPU / TPUs para usar tamanhos grandes de mini lotes para obter maior precisão, por isso estamos devolvendo o controle da inteligência artificial aos usuários comuns, porque para o YOLOv4 não é necessário um mini lote grande,pode ser limitado a um tamanho de 2 a 8.

YOLOV4 é ideal para usar em tempo real, porque a rede está na curva de otimização de Pareto no gráfico AP (precisão) / FPS (velocidade).



Gráficos de precisão (AP) e velocidade (FPS) de muitas redes neurais para a detecção de objetos medidos nas GPUs TitanV / TeslaV100, TitanXP / TeslaP100, TitanX / TeslaM40 para os dois principais indicadores de precisão AP50: 95 e AP50

Para uma comparação justa , coletamos dados de artigos e compare apenas na GPU com a mesma arquitetura.

As tarefas mais práticas têm os requisitos mínimos necessários para os detectores - são a precisão e velocidade aceitáveis ​​mínimas. Geralmente, a velocidade mínima permitida de 30 FPS (quadros por segundo) e superior para sistemas em tempo real.

Como pode ser visto nos gráficos, em sistemas em tempo real com FPS 30 ou mais:

  • YOLOv4-608 RTX 2070 450$ (34 FPS) 43.5% AP / 65.7% AP50
  • EfficientDet-D2 TitanV 2250$ (42 FPS) 43.0% AP / 62.3% AP50
  • EfficientDet-D0 RTX 2070 450$ (34 FPS) 33.8% AP / 52.2% AP50

Essa. O YOLOv4 requer equipamentos 5 vezes mais baratos e com mais precisão do que o EfficientDet-D2 (Google-TensorFlow). Você pode usar o EfficientDet-D0 (Google-TensorFlow), pois o custo do equipamento será o mesmo, mas a precisão será 10% mais baixa.
Além disso, alguns sistemas industriais têm limitações na dissipação de calor ou no uso de um sistema de resfriamento passivo - nesse caso, você não pode usar o TitanV mesmo com dinheiro.

Ao usar o YOLOv4 (416x416) em uma GPU RTX 2080 Ti usando TensorRT + tkDNN, atingimos uma velocidade duas vezes mais rápida e, ao usar batch = 4, é 3x-4x vezes mais rápido - para uma comparação honesta, não apresentamos esses resultados em um artigo sobre arxiv. org:

YOLOv4 rede neural (416x416) FP16 (Tensor núcleos) do lote = 1 atinge a 32 FPS calculadora nVidia Jetson AGX Xavier utilizando bibliotecas + tkDNN TensorRT: github.com/ceccocats/tkDNN
velocidade ligeiramente mais lenta dá biblioteca OpenCV-dnn compilado com CUDA: docs .opencv.org / master / da / d9d / tutorial_dnn_yolo.html

Às vezes, a velocidade (FPS) de algumas redes neurais nos artigos é indicada ao usar um tamanho de lote alto ou ao testar com software especializado (TensorRT), que otimiza a rede e mostra um valor aumentado de FPS. A comparação de algumas redes no TRT com outras redes sem o TRT não é justa. O uso de um tamanho de lote alto aumenta o FPS, mas também aumenta a latência (em vez de diminuí-lo) em comparação com o lote = 1. Se a rede com lote = 1 mostrar 40 FPS e com lote = 32 mostrar 60 FPS, o atraso será de 25 ms para o lote = 1 e ~ 500 ms para o lote = 32, porque apenas ~ 2 pacotes (32 imagens cada) serão processados ​​por segundo, e é por isso que usar batch = 32 não é aceitável em muitos sistemas industriais. Portanto, comparamos os resultados nos gráficos apenas com o lote = 1 e sem o uso do TensorRT.

Qualquer processo pode ser controlado por pessoas ou por computadores. Quando um sistema de computador age com um grande atraso devido à baixa velocidade e comete muitos erros, não pode ser confiado a ele um controle completo das ações; nesse caso, a pessoa controla o processo, e o sistema de computador apenas fornece dicas - este é um sistema de recomendação - a pessoa trabalha e apenas o sistema informa onde foram cometidos erros. Quando o sistema trabalha rapidamente e com alta precisão, esse sistema pode controlar o processo de forma independente, e uma pessoa só cuida dele. Portanto, a precisão e a velocidade do sistema são sempre importantes. Se você acha que 120 FPS para YOLOv4 416x416 é demais para sua tarefa, e é melhor usar o algoritmo com mais lentidão e precisão, então provavelmente em tarefas reais você usará algo mais fraco que o Tesla V100 250 Watt,por exemplo, RTX 2060 / Jetson-Xavier 30-80 Watt, nesse caso, você obterá 30 FPS no YOLOv4 416x416 e outras redes neurais a 1-15 FPS ou nem iniciará.

Características do treinamento de várias redes neurais


Você precisa treinar o EfficientDet com mini-lote = tamanho 128 em várias GPUs Tesla V100 de 32GB, enquanto o YOLOv4 foi treinado em apenas uma GPU Tesla V100 32GB com mini-lote = 8 = lote / subdivisões e pode ser treinado em jogos regulares placa gráfica 8-16GB GPU-VRAM.
A próxima nuance é a dificuldade de treinar uma rede neural para detectar seus próprios objetos. Não importa quanto tempo você treine outras redes na mesma GPU 1080 Ti, você não obterá a precisão declarada mostrada no gráfico acima. A maioria das redes (EfficientDet, ASFF, ...) precisa ser treinada em 4 a 128 GPUs (com um tamanho grande de minicatch usando syncBN) e é necessário treinar novamente a cada resolução de rede, sem atender a ambas as condições, é impossível obter a precisão de AP ou AP50 declarada por eles.


Você pode ver a dependência da precisão da detecção de objetos no tamanho do minibatch em outros detectores, ou seja, usando 128 placas de vídeo em vez de 8 placas de vídeo e a velocidade de aprendizado é 10 vezes maior e a precisão final é 1,5 AP maior - MegDet: um detector grande de objetos em lotes

pequenos arxiv.org/abs/1711.07240 Yolo ASFF: arxiv.org/abs/1911.09516
A seguir [43], introduzimos uma série de truques no processo de treinamento, como o algoritmo de mixagem [12], o cronograma da taxa de aprendizado do cosseno [26] e a técnica de normalização de lote sincronizada [30].

EfficientDet: arxiv.org/abs/1911.09070
A normalização de lote sincronizada é adicionada após cada convolução com decaimento da norma de lote 0,99 e epsilon 1e-3.

Cada modelo é treinado 300 épocas com tamanho total de lote 128 em 32 núcleos TPUv3.

cloud.google.com/tpu/docs/types-zones#europe
v3-32 TPU type (v3) – 32 TPU v3 cores – 512 GiB Total TPU memory

Você deve usar TPU / GPU-RAM de 512 GB para treinar o modelo EfficientDet com normalização de lote sincronizado no lote = 128, enquanto mini-lote = 8 e apenas GPU-RAM de 32 GB foram usados ​​para treinar o YOLOv4. Apesar disso, o YOLOv4 é mais rápido / preciso do que as redes públicas, embora seja treinado apenas uma vez com uma resolução de 512x512 por 1 GPU (Tesla V100 32GB / 16GB). Ao mesmo tempo, o uso de um tamanho menor de minilote e o GPU-VRAM não leva a uma perda de precisão tão dramática como em outras redes neurais:


Fonte: arxiv.org/abs/2004.10934

Para que você possa treinar inteligência artificial localmente no seu PC, em vez de baixar Conjunto de dados na nuvem - isso garante a proteção de seus dados pessoais e disponibiliza treinamento de inteligência artificial para todos.

Basta treinar nossa rede uma vez com uma resolução de rede de 512x512 e, em seguida, pode ser usada com diferentes resoluções de rede no intervalo: [416x416 - 512x512 - 608x608].

A maioria dos outros modelos precisa ser treinada cada vez separadamente para cada resolução de rede, por isso, o treinamento leva muitas vezes mais tempo.

Recursos para medir a precisão dos algoritmos de detecção de objetos


Você sempre pode encontrar uma imagem na qual um algoritmo funcione mal e outro funcione bem e vice-versa. Portanto, para testar algoritmos de detecção, é usado um grande conjunto de ~ 20.000 imagens e 80 tipos diferentes de objetos - conjunto de dados MSCOCO test-dev.

Para que o algoritmo não tente simplesmente se lembrar do hash de cada imagem e das coordenadas nela (ajuste excessivo), a precisão da detecção de objetos é sempre verificada nas imagens e nos rótulos que o algoritmo não viu durante o treinamento - isso garante que o algoritmo possa detectar objetos nas imagens / vídeos que ele nunca vi.

Para que ninguém cometa um erro no cálculo da precisão, no domínio público existem apenas imagens de teste test-dev nas quais você detecta e envia os resultados ao servidor de avaliação CodaLab, no qual o próprio programa compara seus resultados com anotações de teste que não são acessíveis a ninguém .

O conjunto de dados MSCOCO consiste em 3 partes

  1. Tutorial: 120.000 imagens e um arquivo json com as coordenadas de cada objeto
  2. Conjunto de validação: 5.000 imagens e um arquivo json com as coordenadas de cada objeto
  3. Conjunto de testes: 41.000 imagens jpg sem as coordenadas dos objetos (algumas dessas imagens são usadas para determinar a precisão nas tarefas: detecção de objetos, segmentação de instância, pontos-chave, ...)

Características do desenvolvimento do YOLOv4


Ao desenvolver o YOLOv4, tive que desenvolver a rede neural do YOLOv4 e a estrutura Darknet no C / C ++ / CUDA. Porque no Darknet não há diferenciação automática e execução automática de regra de cadeia; todos os gradientes precisam ser implementados manualmente. Por outro lado, podemos nos afastar da estrita adesão à regra da cadeia, alterar a retropropagação e tentar coisas muito não triviais para aumentar a estabilidade e a precisão do aprendizado.

Descobertas adicionais ao criar redes neurais


  • Nem sempre a melhor rede para classificar objetos será a melhor como espinha dorsal da rede usada para detectar objetos
  • O uso de pesos treinados com recursos que aumentaram a precisão na classificação pode afetar adversamente a precisão do detector (em algumas redes)
  • Nem todos os recursos declarados em vários estudos melhoram a precisão da rede.
  • .
  • BFLOPS , BFLOPS
  • , receptive field , stride=2 / conv3x3, weights (filters) .

YOLOv4


A detecção de objetos usando modelos YOLOv4 treinados é incorporada à biblioteca OpenCV-dnn github.com/opencv/opencv/issues/17148, para que você possa usar o YOLOv4 diretamente do OpenCV sem usar a estrutura Darknet. A biblioteca OpenCV suporta a implementação de redes neurais na CPU, GPU (nVidia GPU), VPU (Intel Myriad X). Mais detalhes: docs.opencv.org/master/da/d9d/tutorial_dnn_yolo.html Estrutura do

OpenCV (dnn):


Quadro Darknet :


tkDNN + TensorRT - Velocidade máxima de detecção de objeto usando o YOLOv4: TensorRT + tkDNN github.com/ceccocats/tkDNN

  • 400 FPS - YOLOv4 (lote de 416x416 = 4) no RTX 2080 Ti
  • 32 FPS - YOLOv4 (lote de 416x416 = 1) no Jetson AGX Xavier

O uso do YOLOv4 pode ser expandido para detectar caixas-rotativas em 3D ou pontos-chave / pontos faciais, por exemplo:

github.com/ouyanghuiyu/darknet_face_with_landmark


All Articles