[PYTHON] YOLO avec Chainer

introduction

YOLO est une abréviation pour You Only Look Once, mais est-ce une supposition? Il s'agit d'un réseau neuronal spécifique à la vitesse pour la détection et la reconnaissance d'images, et est construit sur un cadre basé sur C appelé darknet. L'article original est ici. La caractéristique est que la probabilité de classe et les coordonnées de la boîte englobante de l'objet sont soudainement déduites de toutes les images. Contrairement à R-CNN etc., vous n'avez pas à déduire plusieurs zones candidates plusieurs fois, c'est donc rapide car il ne regarde qu'une fois.

Il semble qu'il existe déjà un exemple de conversion vers TensorFlow, donc cette fois je vais essayer d'en faire un chaîneur. Le but de la conversion de ce qui est construit en C en langage de script est de comprendre le contenu. Dans cet article, je ne ferai que des inférences en utilisant les coefficients appris, mais quand je lirai l'article, la procédure d'apprentissage semble être l'une des fonctionnalités les plus importantes, j'aimerais donc la retracer bientôt.

Voir ici pour le code.

Acquisition de données de coefficients entraînés

Il semble que YOLO ait une taille normale, petite, petite, etc., mais cette fois, seule la taille minuscule est convertie.

tiny-yolo et yolo-tiny semblent être des versions différentes. tiny-yolo utilise la normalisation par lots et ainsi de suite, qui est plus moderne, mais cette fois j'utiliserai l'ancien yolo-tiny qui a déjà été converti en modèle tensorflow.

Le coefficient de yolo-tiny pour la version TensorFlow est dans ici, donc le coefficient est craché avec numpy.

import tensorflow as tf
from YOLO_tiny_tf import *
import numpy as np

c=YOLO_TF()
with c.sess.as_default():
    for v in tf.trainable_variables():
        name = v.name
        ary = v.eval()
        np.save("npy/"+name, ary)

Vous pouvez maintenant écrire les coefficients sous le dossier npy au format numpy. Avec tf.trainable_valiables (), vous pouvez lister les paramètres contenus dans Link dans le chainer. eval () est les données dans le chainer.

De plus, dans YOLO_tensorflow, modified darknet est utilisé pour écrire le coefficient sous forme de texte. ) Est utilisé pour convertir le coefficient du darknet.

Chainer

Nous allons le convertir en un chainer.

La configuration de yolo-tiny est this selon l'histoire de github. C'est un kanji qui répète la convolution 3x3 et le pooling max. Je décrirai Chain selon cette description.

Si vous connaissez le modèle d'origine avec un si grand nombre d'étapes, il est plus facile d'écrire en séquentiel sans faire la distinction entre Link et Function comme Keras.

À propos, le coefficient de chaîne construit de cette manière est remplacé, mais comme le chaînage est défini par exécution, W et b etc. ne peuvent pas être accédés en premier lieu sans effectuer un calcul avant une fois. Cette fois, j'ai réécrit les poids après avoir inséré la matrice 0 et l'avoir transmise. Je pense qu'il peut être spécifié par initialW, initial_bias, etc.

Les poids de Convolution_2d sont assez différents entre TensorFlow et Chainer,

--TensorFlow: [Kernel Vertical, Kernel Horizontal, Output Channel, Input Channel] --Chainer: [canal de sortie, canal d'entrée, noyau vertical, noyau horizontal]

Ils sont alignés comme ça, alors soyez prudent lors du tri. Les directions verticale et horizontale sont également inversées pour toutes les connexions.

Notez également que la pente de leaky_relu est de 0,2 pour le chainer, mais de 0,1 pour YOLO.

Le code pour écrire et convertir Chain est ici. D'autres variantes telles que petites devraient également être possibles.

Interprétation de sortie

Les coefficients ont été optimisés pour un ensemble de données de 20 problèmes de classification appelé Pascal VOC.

Divisez tout l'écran en grilles 7x7 et fournissez directement toutes les informations sur la probabilité de classe pour chaque grille, jusqu'à deux boîtes englobantes avec un centre dans cette grille et la fiabilité des deux boîtes englobantes. Déduire.

Les coordonnées de la boîte englobante sont les racines carrées de x et y à la position centrale normalisée de 0 à 1,0 dans la taille de la grille, et la taille est la racine carrée de la largeur et de la hauteur normalisées de 0 à 1,0 dans la taille de l'image. La raison de l'utilisation de la racine carrée est qu'il veut réduire la pénalité d'erreur lorsque la taille augmente.

Le vecteur de sortie de l'étape finale est

--20 probabilité de classe par grille 7x7x20

Après le remodelage, identifiez le cadre de sélection fiable et récupérez ses coordonnées et sa classe.

Au moment de l'inférence, il suffit de multiplier la probabilité de classe et la fiabilité de la boîte englobante et de couper à la valeur seuil, mais au moment de l'apprentissage, il semble concevoir de manière à ce qu'il soit facile d'accéder à la fonction de perte uniquement dans la partie importante.

Exemple d'utilisation

Essayez-le à partir des images autorisées pour l'utilisation commerciale et les mods de Flickr.

Train train_marked.png Ça m'a l'air bien.

Sheep sheep_marked.png C'est un mouton.

Bicycle bicycle_marked.png La zone de délimitation de la personne a légèrement changé. La foule ne se fera pas prendre.

Birds birds_marked.png J'aimerais que vous trouviez également la personne à droite. Je me demande s'il sortira si le seuil est abaissé.

Cat cat_marked.png C'est un chat.

PottedPlant plant_marked.png Est-ce que c'est comme ça? ..

Impressions

Comme il est écrit à plusieurs reprises dans l'article, il s'agit d'une structure en gras qui produit soudainement les coordonnées de la boîte englobante avec un réseau. Je pense que le but est le processus d'apprentissage pour que l'idée audacieuse fonctionne correctement.

En revanche, comme mentionné dans l'article, la précision du cadre de délimitation n'est pas si bonne, surtout en minuscule. Je pense que ce domaine dépend de l'application.

J'ai fait la conversion de modèle entre TensorFlow et chainer pour la première fois, mais il semble que cela puisse être fait en ne prêtant attention qu'à la disposition des coefficients. Je pense que je peux le faire avec des outils à usage général, mais cela semble dépasser le cadre de mes loisirs.

Postscript

YOLO est sorti en version ver2.

Recommended Posts

YOLO avec Chainer
Installez Chainer 1.5.0 sur Windows
Installer Chainer sur CentOS 6.7
Préparer l'environnement Chainer sous Windows
Installez Chainer 1.6 (GPU) sur Windows 7.
Exécutez YOLO v3 sur AWS v2
[Python] [Chainer] [Windows] Installer Chainer sous Windows
Exécutez YOLO v3 sur AWS
Installez OpenCV et Chainer sur Ubuntu
Installez CUDA 8.0 et Chainer sur Ubuntu 16.04
Échantillons de chaîne
Apprendre Paints Chainer avec Macbook Pro ~ Fonctionnement
J'ai essayé d'exécuter YOLO v3 avec Google Colab