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.
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.
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.
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é.
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.
・ Processeur Intel (R) Core (TM) i7-5820K 3,30 GHz ・ GPU NVIDIA Quadro RTX 5000 16 Go
・ 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
Le programme de formation est disponible sur GitHub.
ssmd_training.py
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.
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.
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.
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é.
Le résultat n'est pas bon. Je voudrais essayer à nouveau de détecter des objets.
Microsoft COCO Common Objects in Context
Computer Vision : Image Classification Part2 - Training CNN model Computer Vision : Object Detection Part1 - Bounding Box preprocessing
Recommended Posts