[PYTHON] Vision par ordinateur: Détection d'objets Part2-Détecteur multi-coup unique

Cible

Il s'agit d'une continuation de la détection d'objets à l'aide du Microsoft Cognitive Toolkit (CNTK).

Dans la partie 2, la détection d'objet par CNTK sera effectuée à l'aide des données d'apprentissage préparées dans la partie 1. On suppose que CNTK et NVIDIA GPU CUDA sont installés.

introduction

Dans Computer Vision: Object Detection Part1 --Bounding Box preprocessing, à partir de Microsoft Common Object in Context (COCO) [1], le cadre de sélection Nous avons préparé une étiquette de catégorie et une boîte d'ancrage.

Dans la partie 2, nous allons créer et entraîner un modèle de détection d'objets en 1 étape à l'aide d'un réseau de neurones.

Structure du réseau neuronal

Cette fois, j'ai créé un modèle qui combine la carte des caractéristiques multi-échelles du SSD [2] et la prédiction de localisation directe de YOLOv2 [3]. Le contour du réseau neuronal mis en œuvre est illustré dans la figure ci-dessous.

ssmd.png

Ajoutez une couche de convolution à la carte des caractéristiques obtenue à partir du réseau neuronal de convolution pré-entraîné (CNN) sous-jacent. La couche de convolution ajoutée n'adopte pas le terme de polarisation, la fonction d'activation adopte les unités linéaires exponentielles (ELU) [[4]](# référence) et la normalisation par lots [[5]](# référence) est appliquée. Je vais.

Dans la couche de convolution de sortie finale, le terme de biais est adopté sans utiliser la fonction d'activation non linéaire et la normalisation par lots pour effectuer la boîte englobante, l'objectivité et la catégorisation.

L'idée était d'utiliser une carte des caractéristiques 26x26 pour détecter les petits objets, une carte des caractéristiques 13x13 pour détecter les objets moyens et une carte des caractéristiques 7x7 pour détecter les grands objets. Les boîtes d'ancrage utilisées sont (0,06, 0,08) pour 26x26, (0,19. 0,28), (0,31, 0,67), (0,66, 0,35) pour 13x13, (0,31, 0,67), (0,66, 0,35), ( 0,83, 0,83) est utilisé.

L'algorithme de YOLO est utilisé pour prédire la boîte englobante.

x = \sigma(t_x) + c_x \\
y = \sigma(t_y) + c_y \\
w = p_w \log(1 + e^{t_w}) \\
h = p_h \log(1 + e^{t_h}) \\
objectness = \sigma(t_o)

Maintenant, appliquez la fonction sigmoïde à la sortie réseau $ t_x, t_y $, puis ajoutez les coordonnées en haut à gauche $ c_x, c_y $ de chaque cellule de la grille pour prédire les coordonnées centrales de chaque cellule de la grille. Pour prédire la largeur et la hauteur, appliquez la fonction soft plus à la sortie réseau $ t_w, t_h $, puis multipliez par la case d'ancrage. Appliquez la fonction sigmoïde à la sortie $ t_o $ pour l'objectivité.

Paramètres en formation

La valeur initiale du paramètre de couche de convolution ajouté a été définie sur la distribution normale de He [6].

Cette fois, nous utiliserons la fonction de perte multitâche. Utilisez la perte IoU généralisée [7] pour la régression de la boîte englobante, l'entropie croisée binaire pour prédire l'objectivité et l'erreur d'entropie croisée pour la catégorisation. Les détails de la fonction de perte seront expliqués plus loin.

Loss = Generalized IoU Loss + Binary Cross Entropy + Cross Entropy Error

Adam [8] a été utilisé comme algorithme d'optimisation. L'hyperparamètre d'Adam $ β_1 $ est défini sur 0,9 et $ β_2 $ sur la valeur par défaut de CNTK.

Pour le taux d'apprentissage, utilisez le taux d'apprentissage cyclique (CLR) [9], le taux d'apprentissage maximal est de 1e-3, le taux d'apprentissage de base est de 1e-5, la taille du pas est 10 fois le nombre d'époques et la politique est Réglez sur triangular2.

La formation du modèle a effectué 100 Epoch par formation en mini-lots.

la mise en oeuvre

Environnement d'exécution

Matériel

・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 5000 16 Go

Logiciel

・ Windows 10 Professionnel 1909 ・ CUDA 10.0 ・ CuDNN 7.6 ・ Python 3.6.6 ・ Cntk-gpu 2.7 ・ Cntkx 0.1.13 ・ H5py 2.9.0 ・ Numpy 1.17.3 ・ Pandas 0.25.0 ・ Scikit-learn 0.21.3

Programme à exécuter

Le programme de formation est disponible sur GitHub.

ssmd_training.py


Commentaire

Je compléterai le contenu principal de cette implémentation.

Generalized IoU Loss L'erreur quadratique [10] et la perte L1 lisse [2] [11] sont utilisées pour la fonction de perte de régression de la boîte englobante. L'intersection sur Union (IoU), qui indique le degré de chevauchement entre le cadre englobant et le rectangle englobant correct, peut être adopté.

Cependant, IoU a le problème d'avoir plus de points de selle dans l'optimisation, car la valeur sera 0 si les deux boîtes englobantes ne se chevauchent pas du tout. Celui qui y est proposé est l'IoU généralisée (GIoU).

En supposant que la boîte englobante prédictive est $ A $ et que la boîte englobante correcte est $ B $, GIoU sera comme suit.

IoU = \frac{A \cap B}{A \cup B} \\
GIoU = IoU  - \frac{C - (A \cup B)}{C} \\
GIoU Loss = 1 - GIoU

Où $ C $ représente la plus petite zone rectangulaire qui entoure les deux cadres de délimitation. GIoU prend une valeur de [-1, 1].

Multi-Task Loss Lors de la formation d'un réseau neuronal qui effectue plusieurs tâches, une fonction de perte est définie pour chaque tâche. Comme mentionné ci-dessus, cette fonction de perte comprend les fonctions de perte suivantes.

Loss = Generalized IoU Loss + Binary Cross Entropy + Cross Entropy Error

La perte IoU généralisée concerne les coordonnées du centre et la largeur / hauteur du cadre de délimitation, l'entropie croisée binaire permet à Objectness de déterminer si un objet existe et l'erreur d'entropie croisée est destinée à la catégorisation d'objets. Calculez la fonction de perte.

Par conséquent, la formule de la fonction de perte est:

Loss = \lambda^{coord}_{obj} \sum^N \sum^B \left\{1 - \left(IoU - \frac{C - (A \cup B)}{C} \right) \right\} +
\lambda^{coord}_{noobj} \sum^N \sum^B \left\{1 - \left(IoU - \frac{C - (A \cup B')}{C} \right) \right\} \\
+ \lambda^{conf}_{obj} \sum^N \sum^B -t \log(\sigma(t_o)) + \lambda^{conf}_{noobj} \sum^N \sum^B -(1 - t) \log(1 - \sigma(t_o)) \\
+ \lambda^{prob}_{obj} \sum^N \sum^B -t \log(p_c) + \lambda^{prob}_{noobj} \sum^N \sum^B -t \log(p_c) \\

\lambda^{coord}_{obj} = 1.0, \lambda^{coord}_{noobj} = 0.1, \lambda^{conf}_{obj} = 1.0, \lambda^{conf}_{noobj} = 0.1, \lambda^{prob}_{obj} = 1.0, \lambda^{prob}_{noobj} = 0.0

Ici, $ A, B et C $ représentent respectivement la zone de délimitation prévue, la zone de délimitation correcte et la plus petite zone rectangulaire entourant les deux zones de délimitation, et $ B '$ représente la zone de délimitation par défaut. La zone de délimitation par défaut signifie une zone de délimitation dont les coordonnées centrales et la largeur / hauteur de chaque cellule de la grille ont la même taille que la zone d'ancrage.

La contribution de chaque fonction de perte est ajustée par le coefficient $ \ lambda $, qui est fixé à 1,0 si l'objet est présent et à 0,1 ou 0,0 si l'objet n'est pas présent.

Dynamic Target Assignment Dans la formation réseau, toutes les boîtes englobantes prédictives ne correspondent pas aux données correctes. Par conséquent, nous prendrons la mesure d'attribuer dynamiquement la bonne boîte englobante et l'étiquette de catégorie.

Par exemple, lorsque la figure supérieure gauche de la figure ci-dessous est l'image d'entrée, la zone de délimitation sortie par le réseau sera la zone de délimitation rouge dans la figure supérieure droite si un objet existe. Cependant, la zone de délimitation correcte est la zone de délimitation verte dans la figure inférieure gauche. Ici, calculez l'IoU de la zone de délimitation de sortie et de la zone de délimitation correcte, puis affectez la zone de délimitation correcte et l'étiquette de catégorie correcte à la zone de délimitation prévue avec la plus grande IoU. La figure en bas à droite montre la zone de délimitation prévue affectée à la zone de délimitation correcte en bleu.

Cependant, certaines zones de délimitation auxquelles la zone de délimitation correcte n'a pas été affectée ont des valeurs IoU élevées, alors affectez-leur également la zone de délimitation correcte et l'étiquette de catégorie correcte. La zone de délimitation prévue à laquelle la zone de délimitation correcte est attribuée par ce processus est indiquée en bleu clair dans la figure inférieure droite.

dynamic_target_assignment.png

Si la zone de délimitation correcte ne peut pas être affectée, l'objet n'existe pas et la zone de délimitation par défaut est affectée.

résultat

Training loss and error

La figure ci-dessous est une visualisation de chaque fonction de perte pendant l'entraînement. À partir de la gauche, GIoU Loss pour la régression de la boîte englobante, Entropie croisée binaire pour l'objectivité et Erreur d'entropie croisée pour la catégorisation. L'axe horizontal représente le nombre d'époques et l'axe vertical représente la valeur de la fonction de perte.

ssmd416x416_logging.png

Validation mAP score

Maintenant que nous avons formé un modèle de détection d'objets en 1 étape, nous avons évalué les performances à l'aide de données de vérification.

Pour cette évaluation des performances, nous avons calculé la précision moyenne moyenne (mAP). J'ai utilisé sklearn pour calculer le mAP et définir l'IoU sur 0,5. L'utilisation de val2014 comme données de validation a donné les résultats suivants:

mAP50 Score 10.3

FPS and demo

J'ai également mesuré le FPS, qui est un indice de vitesse d'exécution. La mesure utilisait le temps standard du module Python et le matériel utilisé était le GPU NVIDIA GeForce GTX 1060 6 Go.

39.9 FPS

Vous trouverez ci-dessous une vidéo d'une tentative de détection d'objets avec un modèle entraîné.

ssmd.gif

Le résultat n'est pas bon. Je voudrais essayer à nouveau de détecter des objets.

référence

Microsoft COCO Common Objects in Context

Computer Vision : Image Classification Part2 - Training CNN model Computer Vision : Object Detection Part1 - Bounding Box preprocessing

  1. Tsung-Yi Lin, Michael Maire, Serge Belongie, Lubomir Bourdev, Ross Girshick, James Hays, Pietro Perona, Deva Ramanan, C. Lawrence Zitnick, and Piotr Dollár. "Microsoft COCO: Common Objects in Context", European Conference on Computer Vision. 2014, pp 740-755.
  2. Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, and Alexander C. Berg. "SSD: Single Shot MultiBox Detector", arXiv preprint arXiv:1512.02325 (2016). European Conference on Computer Vision. 2016, pp 21-37.
  3. Joseph Redmon and Ali Farhadi. "YOLO9000: better, faster, stronger", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2017, pp 7263-7271.
  4. Djork-Arné Clevert, Thomas Unterthiner, and Sepp Hochreiter. "Fast and accurate deep network learning by exponential linear units (ELUs)." arXiv preprint arXiv:1511.07289 (2015).
  5. Ioffe Sergey and Christian Szegedy. "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift", arXiv preprint arXiv:1502.03167 (2015).
  6. Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification", The IEEE International Conference on Computer Vision (ICCV). 2015, pp 1026-1034.
  7. Hamid Rezatofighi, Nathan Tsoi, JunYoung Gwak, Amir Sadeghian, Ian Reid, and Silvio Savarese., "Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2019, pp 658-666.
  8. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  9. Leslie N. Smith. "Cyclical Learning Rates for Training Neural Networks", 2017 IEEE Winter Conference on Applications of Computer Vision. 2017, pp 464-472.
  10. Joseph Redmon, Santosh Divvala, Ross Girshick, and Ali Farhadi. "You Only Look Once: Unified, Real-Time Object Detection", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp 779-788.
  11. Ross Girshick. "Fast R-CNN", The IEEE International Conference on Computer Vision (ICCV). 2015, pp 1440-1448.

Recommended Posts

Vision par ordinateur: Détection d'objets Part2-Détecteur multi-coup unique
Vision par ordinateur: détection d'objets - Suppression non maximale
Computer Vision: Object Detection Part1 - Prétraitement de la boîte englobante
Vision par ordinateur: détection d'objets - Suppression non maximale
Vision par ordinateur: Détection d'objets Part2-Détecteur multi-coup unique
Computer Vision: Object Detection Part1 - Prétraitement de la boîte englobante
[Tutoriel PyTorch ①] Qu'est-ce que PyTorch?
Détection d'objet (Détecteur MultiBox Single Shot) Interface graphique de création de fichier XML pour les données d'image