[PYTHON] Ce que j'ai appris en mettant en œuvre comment créer une boîte par défaut pour SSD

J'ai essayé d'analyser comment créer une boîte par défaut pour SSD

Il y a quelques mois, j'étais un peu inquiet du manque de connaissances sur les détails du SSD (Single Shot Multibox Detector), j'ai donc décidé de construire mon propre SSD petit à petit en regardant les papiers et l'implémentation trouvés dans Github etc. C'était. Pour être honnête, ce n'est pas encore fini, mais j'ai appris comment créer une Default Box (Prior), une fonctionnalité importante pour les SSD, alors j'aimerais la partager avec vous.

Qu'est-ce que Default Box?

Si vous lisez cet article, vous savez probablement ce qu'est la boîte par défaut, mais je vais l'expliquer un peu au cas où. Lors du traitement d'une image, le SSD produit une image alambiquée appelée Feature Map. La carte des caractéristiques, le nombre et la taille sont spécifiés dans les paramètres du modèle, mais il s'agit essentiellement de 5 ou 6. Afin de reconnaître l'objet à partir de la carte des caractéristiques, la zone dans laquelle l'objet est susceptible d'apparaître est spécifiée, et cette zone est appelée la zone par défaut (parfois appelée Prior) et est utilisée pour la classification et la régression. Je suis.

Cela ressemble à ceci lorsque vous visualisez un ensemble de boîtes par défaut. Avec mes paramètres de modèle, un total de 8732 sera créé. example.png Ceci est une image de COCO Dataset 2017.

Explication du calcul de la boîte par défaut de papier SSD

Selon l'explication de l'article, pour calculer la boîte par défaut, nous avons besoin de l'échelle (il n'y a pas de définition spécifique, mais quelque chose comme l'échelle d'un objet, les proportions) et la taille de la carte des caractéristiques.

Dans l'article, l'échelle est définie par cette fonction. m est le nombre de cartes de caractéristiques et k le nombre de cartes de caractéristiques. Et s_min et s_max sont déterminés par la taille de l'objet dans l'image. Je voudrais dire qu'il existe une manière de décider, mais il semble qu'il n'y ait pas de manière particulière.

La fonction elle-même semble un peu compliquée, mais en un mot, elle divise s_min et s_max de manière égale en la même quantité que le nombre de cartes d'entités. image.png Par exemple, si s_min = 0,2, s_max = 0,9 et m = 6, alors s_k serait [0,2, 0,34, 0,48, 0,62, 0,76, 0,9]. Chaque échelle est également séparée par 0,14.

Les proportions, comme s_min et s_max, sont déterminées par l'objet. Le document indique que le rapport hauteur / largeur de {1, 2, 3, 1/2, 1/3} a été utilisé. C'était un peu flou rien qu'en regardant le papier, mais (2, 1/2) et (3, 1/3) sont comme une combinaison, donc si vous parlez de réduire le rapport hauteur / largeur, en gros 3 et 1/3 Cela signifie que le rapport hauteur / largeur n'est pas utilisé.

Les cartes de caractéristiques étaient la partie la plus (personnellement) simple, mais simplement la taille de la sortie de la couche de convolution à passer à la tête de classification et de régression dans le SSD. Par exemple, dans mon modèle, la première sortie est 38 x 38 et la dernière sortie est 1 x 1.

Une fois que vous avez les pièces nécessaires ci-dessus, vous pouvez calculer la boîte par défaut. Cette fonction calcule la hauteur et la largeur de la boîte par défaut.

image.png image.png

Et vous pouvez maintenant calculer les points cx et cy du point central de la boîte par défaut. F_k ici est simplement la taille de la carte des caractéristiques (par exemple 38).

image.png

À propos, le motif [cx, cy, w, h] est commun lors de la représentation de la boîte par défaut.

Créer une boîte par défaut

Les calculs pour cx, cy et w, h décrits ci-dessus sont effectués pour chaque rapport hauteur / largeur dans chaque carte de caractéristiques. Cependant, 1 est une petite exception. S'il vaut 1, deux boîtes par défaut sont calculées. Il est calculé avec la boîte par défaut calculée avec une échelle normale et une autre échelle. Une autre méthode de calcul de l'échelle est définie par la fonction suivante. Il peut être calculé par l'échelle de la carte des caractéristiques actuelle et l'échelle d'un niveau supérieur.

image.png

Il existe une boîte par défaut pour le rapport hauteur / largeur de 1. Pour {1, 2, 3, 1/2, 1/3}, chaque bloc crée six boîtes par défaut. Dans le cas de {1, 2, 1/2}, quatre sont créés.

Différences entre les papiers SSD et les implémentations SSD

J'ai regardé certaines implémentations pour comprendre comment créer une boîte par défaut, mais à un moment donné, je n'ai pas compris après avoir lu l'article.

Tout d'abord, nous voyons souvent une variable appelée étapes. f_k est calculé en divisant la taille de l'image par étape. Il n'y a aucune explication nulle part et ce n'est pas écrit dans le papier, mais les étapes sont calculées en divisant la taille de l'image par la taille de la carte des caractéristiques. Par exemple, diviser 300 par 38 donne 7,89-> 8. steps: [8, 16, 32, 64, 100, 300]

L'autre chose qui est restée bloquée est le réglage du rapport hauteur / largeur. Il y a plusieurs façons d'écrire comme ça. aspect_ratios: [[2], [2,3], [2,3], [2,3], [2], [2]] Je n'avais pas 1/2 ou 1/3, alors j'ai pensé, "Qu'est-ce que c'est?", Mais je peux simplement laver 2 et 1/2 avec seulement 2, et exprimer 3 et 1/3 avec seulement 3. [2,3] signifie {1, 2, 3, 1/2, 1/3}.

Il est courant d'écrire de tels paramètres pour les échelles. scales: [30, 60, 111, 162, 213, 264, 315] Il s'agit de la taille de l'image multipliée par le s_k déjà calculé. Si s_k vaut 0,1, la valeur des échelles sera 30.

Enfin, cela peut sembler évident pour certaines personnes, mais lors du calcul des 2 et 1/2 boîtes par défaut, seuls 2 w et h sont calculés, et la 1/2 boîte par défaut est de 2 h. Utilisez comme w et utilisez w comme h. La raison en est que sqrt (2) == 1 / sqrt (1/2) et sqrt (1/2) == 1 / sqrt (2).

finalement

Merci d'avoir lu jusqu'au bout! Ma langue maternelle n'est pas le japonais, il peut donc y avoir des choses que je ne peux pas bien expliquer ou utiliser des mots étranges. Si vous avez des questions, n'hésitez pas à commenter et j'essaierai d'y répondre autant que possible!

J'aimerais publier de plus en plus lors de la mise en œuvre du SSD, alors attendez-vous au prochain article!

Recommended Posts

Ce que j'ai appris en mettant en œuvre comment créer une boîte par défaut pour SSD
Comment créer une boîte de saisie Kivy 1 ligne
Ce que j'ai pensé et appris à étudier pendant 100 jours dans une école de programmation
[Go] Comment créer une erreur personnalisée pour Sentry
Comment créer un référentiel local pour le système d'exploitation Linux
J'ai essayé de créer un bot pour annoncer un événement Wiire
Je veux créer un Dockerfile pour le moment.
Comment créer un package Conda
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
Comment créer un fichier de configuration
Comment créer une étiquette (masque) pour la segmentation avec labelme (masque de segmentation sémantique)
Ce que j'ai appris en écrivant une Pull Request Python pour la première fois de ma vie
J'ai essayé de créer un linebot (implémentation)
Comment créer un clone depuis Github
Comment créer un dossier git clone
J'ai essayé de créer un linebot (préparation)
Comment créer un fichier * .spec pour pyinstaller.
Comment créer un référentiel à partir d'un média
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
Je souhaite créer facilement un modèle de bruit
Comment créer un objet fonction à partir d'une chaîne
Comment écrire une instruction ShellScript Bash for
Je souhaite créer un type d'implémentation pouvant être branché
J'ai lu "Comment créer un laboratoire de piratage"
[Note] Comment créer un environnement de développement Ruby
Procédure de création d'application multi-plateforme avec kivy
Comment créer une API Rest dans Django
[Note] Comment créer un environnement de développement Mac
Ce que vous pouvez comprendre parce que vous êtes un débutant Comment créer un fichier (premier message)
Comment mettre Pyenv sur Amazon Linux et Ubuntu pour créer un environnement Python 3.6.0
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Comment créer une propriété de relations qui peuvent être prefetch_related par des conditions spécifiques
J'ai oublié d'utiliser VIM, j'ai donc fait une vidéo pour la mémorisation. 3 vidéos par niveau
Ce que j'ai appris en lançant un site photo à l'aide de données administratives et de plusieurs API
Créer un ensemble de données d'images à utiliser pour la formation
J'ai réfléchi à la façon d'apprendre la programmation gratuitement.
Je souhaite créer manuellement une légende avec matplotlib
Comment enregistrer une table récupérée par python en csv
Comment créer un environnement de développement pour TensorFlow (1.0.0) (Mac)
Comment créer un simple script serveur / client TCP
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comparez comment écrire le traitement des listes par langue
Ce que j'ai appris en participant aux qualifications ISUCON10
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Comment créer un enregistrement en collant une relation au modèle source d'héritage dans le modèle hérité par Django
Je souhaite créer une source sonore de karaoké en séparant les instruments et les voix en utilisant Python
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Comment gérer un README pour github et PyPI
J'ai fait une boîte pour me reposer avant que Pepper ne se fatigue
Comment créer un maillage de flux autour d'un cylindre avec SnappyHexMesh