[PYTHON] Détection d'objets de cuisson par classification d'images Yolo +

Ces données

git Données pour la vérification de l'apprentissage

introduction

Je voulais détecter des objets dans des plats préparés et extraire des noms de plats individuels, j'ai donc essayé de détecter des objets dans des plats. Cette fois, j'ai pensé qu'il serait difficile de séparer les types détaillés de plats uniquement par détection d'objet, donc je pense qu'il serait possible de détecter des plats fins en utilisant la détection d'objet + la classification d'image et deux CNN. J'ai donc décidé de séparer «détection de cuisson» et «classification des images de cuisson». Cette fois, j'expliquerai la détection d'objets avec son propre jeu de données.

Le réseau utilisé est

Il y en a deux.

Google Colaboratory J'ai utilisé Google Colaboratory (ci-après colab) comme principal environnement d'apprentissage cette fois-ci. colab est un environnement d'exécution Python qui vous permet d'utiliser le GPU gratuitement. C'est très pratique lorsqu'il n'y a pas d'environnement car il faut du temps pour savoir s'il n'y a pas d'environnement GPU où vous pouvez apprendre localement. Étant donné que l'environnement requis pour l'apprentissage automatique est également en place, la création de l'environnement ne prend pas de temps. Cependant, si le moteur d'exécution est déconnecté après une durée de fonctionnement continue de 12 heures, les fichiers du laboratoire seront également réinitialisés. Pour plus d'informations sur Colaboratory, cliquez sur [Introduction à Python sans créer d'environnement! Veuillez consulter Comment utiliser Google Colaboratory d'une manière simple à comprendre.

environnement

Comme mentionné ci-dessus, j'ai principalement utilisé Colaboratory cette fois, mais comme le prétraitement prend du temps pour l'apprentissage sur colab, seul le prétraitement des données est effectué dans l'environnement local et colab est utilisé au moment de l'apprentissage. Je l'ai fait en téléchargeant et en apprenant. L'environnement d'exécution réellement utilisé cette fois est

Il est devenu.

YOLO Tout d'abord, nous allons apprendre à détecter les objets dans YOLO et effectuer réellement la détection d'objets.

Création de l'ensemble de données

Pour apprendre avec YOLO, vous avez besoin d'un ensemble de données avec l'image à apprendre et les données de coordonnées de cette image sous forme d'étiquette. Cette fois, vous devez vous étiqueter pour apprendre vos propres données. Vous pouvez l'étiqueter manuellement, mais cela prendra beaucoup de temps, donc cette fois, l'outil de création de jeux de données d'entraînement pour YOLO labelImg J'ai utilisé.

Pour savoir comment utiliser labelImg, reportez-vous à Yolo Learning Dataset Creation Tool: labelImg. Vous pouvez procéder efficacement.

À propos, le jeu de données créé pour apprendre à détecter les objets de cuisson est cette fois

Ils sont cinq. Nous avons étiqueté environ 700 feuilles par classe. Si vous souhaitez améliorer la précision, il est préférable d'étiqueter et de préparer environ 1000 feuilles par classe.

Se préparer à apprendre

Cette fois, nous utiliserons yolo de darknet pour l'apprentissage, nous allons donc effectuer un prétraitement pour l'apprentissage.

** 1. Installation de darknet ** Nous téléchargerons le darknet nécessaire à l'apprentissage. Le site officiel de darknet est ici. Télécharger selon le site officiel

$ git clone https://github.com/pjreddie/darknet.git
$ cd darknet

Téléchargez au fur et à mesure et accédez au dossier darknet.

** 2. Stockez l'ensemble de données créé ** Je pense qu'il existe deux types, l'image utilisée dans labelImg et les données txt contenant les données d'étiquette créées. Je vais déplacer ces deux vers darknet pour apprendre. La hiérarchie des données image et txt est

darknet

data

images

images001.jpg images002.jpg ....

labels

images001.txt images002.txt ....

Ce sera. Même si plusieurs classes sont créées avec labelImg, elles sont stockées dans le même dossier images et laels que les autres classes.

** 3. Divisez en train et testez ** L'ensemble de données stocké précédemment dans les données doit être divisé en données d'entraînement et données de test. La séparation des données d'entraînement et des données de test avec darknet prend également beaucoup de temps si elle est effectuée manuellement, donc process.py J'utiliserai .py). Avec ce code source

percentage_test = 20;

Les données sont divisées aléatoirement par test20% et train80% en fonction de l'image, et ces chemins sont affichés avec les noms de fichier "test.txt" et "train.txt". Mettez ce "process.py" dans darknet / data. ensuite,

$ python process.py

Créera "train.txt" et "test.txt". Si vous souhaitez modifier le rapport entre les données d'entraînement et de test, essayez de remplacer "pourcentage_test = 20;" par la valeur souhaitée.

** 4. Apprentissage du prétraitement ** Nous allons modifier divers paramètres dans darknet pour l'apprentissage.

** ・ Réglage du nom de la classe ** Définissez le nom de la classe à apprendre sur darknet. Dans les fichiers nommés obj.names et names.list, écrivez les noms de classe à apprendre ligne par ligne. La structure du dossier est

darknet

data

images

obj.names images001.jpg images002.jpg ....

labels names.list

Ce sera. Dans le cas de la détection de parabole utilisée cette fois

obj.names/names.list


rice
miso soup
griled fish
salad
noodle

J'écrirai.

** - Définissez le nombre de classes et le chemin des données ** Il est nécessaire de définir le nombre de classes et le chemin des données comme l'un des prétraitements de yolo. Nous allons changer le contenu de cfg / obj.data. Le contenu de obj.data

obj.data


classes=5 #Nombre de cours
train = data/images/train.txt 
valid = data/images/test.txt 
labels = data/images/obj.names 
backup = backup/

Et entrez le chemin du fichier que vous avez créé précédemment.

Ensuite, modifiez les paramètres de chaque version que vous souhaitez utiliser. Si vous souhaitez utiliser yolo v2, dupliquez darknet / cfg / yolov2-voc.cfg, et si vous souhaitez utiliser v3, dupliquez darknet / cfg / yolov3-voc.cfg dans cfg. Ouvrez ce goro-obj.data

Lot de 3ème ligne=64
Subdivision de 4e ligne=8
   classes=5(Nombre de cours)
      filters=35(Pour yolov2(classes + coords + 1) * 5)
                (Pour yolov3(classes + +5) * 3)

Veuillez changer en.

** ・ À propos de la détection de la boîte englobante ** Cette fois, je voulais détecter chaque plat avec yolo, puis utiliser un autre réseau pour détecter les plats en détail, donc j'ai besoin de détecter la boîte englobante de la sortie afin de détecter chaque plat. Veuillez remplacer darknet / src / image.c par here pour la détection de la boîte englobante. Les données de coordonnées sont sorties au format .txt.

** ・ Poids initial ** Lors de l'apprentissage pour la première fois, il est facile pour les résultats d'apprentissage de converger en téléchargeant les pondérations appropriées. Pour le poids initial de l'apprentissage fichier de poids initial yolov2 https://pjreddie.com/media/files/darknet19_448.conv.23 fichier de poids initial yolov3 https://pjreddie.com/media/files/darknet53.conv.74 Téléchargez-le ici et placez-le dans le dossier darknet.

Passer au laboratoire pour l'apprentissage et la détection

À ce stade, le prétraitement est enfin terminé, et nous allons enfin commencer à apprendre sur le colaboratoire.

** 1. Télécharger le dossier ** Tout d'abord, je vais télécharger le dossier darknet qui a été prétraité cette fois et étiqueté et défini. Il y a une limite de 12 heures pour colaboratory, et tous les fichiers sur colaboratory seront réinitialisés. Donc, au lieu de télécharger directement sur colab, téléchargez-le sur Google Drive et montez-le sur lecteur sur colab pour éviter de devoir télécharger à chaque fois (je pense que cela prendra un temps considérable à télécharger une fois. .). Veuillez donc vous connecter à votre compte Google et télécharger chaque dossier darknet ** sur le lecteur que vous utilisez. Il est possible de compresser puis de télécharger et de décompresser sur colab, mais comme le code de décompression n'est pas inclus dans le code de colab utilisé cette fois, si vous utilisez la source telle quelle, téléchargez sans compresser Je vous remercie.

** 2. Apprendre et détecter sur colab ** Pour l'apprentissage et la détection, téléchargez le ** code source de here en tant que .ipynd, téléchargez-le sur le disque, démarrez-le et exécutez-le par le haut **. Vous devriez pouvoir apprendre et détecter des objets avec. Placez l'image que vous souhaitez détecter dans le dossier darknet et modifiez le chemin et le nom du fichier dans la partie «Effectuer la détection d'objet» du code source. (Cela peut ne pas être possible en raison de la version de cuda etc. téléchargée sur colab. Dans ce cas, veuillez passer à la dernière version et exécuter pip etc.) Puisqu'il est monté sur le lecteur, le chemin du fichier changera en fonction de la disposition du lecteur, etc. ** Veuillez faire attention au chemin du fichier! ** **

De plus, la sortie des poids d'apprentissage pendant l'apprentissage est automatiquement enregistrée dans darknet / backup. Si vous voulez apprendre les poids une fois appris, changez le chemin de poids de la partie "Apprendre avec yolo" en votre propre ** buckup / yolo-XXX.weights **.

Couper l'image détectée

Si vous continuez avec le code source ipynd, l'image recadrée sera enregistrée. Lorsqu'elle est exécutée, l'emplacement des coordonnées est découpé à partir de l'image utilisée pour la détection d'objet à l'aide de la sortie des coordonnées de la zone de délimitation pendant la détection d'objet, et l'image est enregistrée dans le dossier d'image.

Apprendre la cuisine individuelle

Cette fois, nous avons effectué la classification d'images en apprenant à l'aide de VGG-16, qui a été appris par transfert à l'aide d'un ensemble de données appelé UEC-FOOD100. En gros, vous pouvez l'utiliser en l'exécutant par le haut selon le code source. Cependant, cette fois, nous avons effectué un apprentissage par transfert pour la vérification de la cuisson, alors comprenez que ceux qui apprennent à partir de 0 devront créer un ensemble de données pour cela. De plus, si vous souhaitez vérifier avec les pondérations que vous avez créées cette fois, veuillez faire attention au chemin du fichier.

Résultat de détection réel

Ce sera la détection de la zone objet de notre cuisson. Le premier est la perte (fonction de perte). キャプチャ.JPG Ça ressemble à ça. Le nombre d'apprentissage était de 4 073 et la valeur de la perte était de «0,09». On a dit que cela tomberait à environ 0,06, alors je pense qu'il aurait été normal d'étudier un peu plus.

Ensuite, voici l'entrée réelle de l'image pour détecter l'objet.

図1.jpg

N'est-ce pas mauvais? Ceci est un exemple de quelque chose comme ça. Je pense que c'est un bon exemple que le riz, le misoso, le poisson grillé et l'étiquette apprise cette fois ont pu être détectés fermement. Ce qui suit est le résultat de la détection plus détaillée de ceux-ci à l'aide de l'apprentissage par transfert Vgg-net.

図2.png

図3.png

図4.png

Ça ressemble à ça. Puisqu'il a été re-reconnu comme riz blanc à partir de la détection de zone d'objet exprimée en riz, il semble que la classification fine ait réussi cette fois à partir de la détection de zone approximative de l'objectif. Cependant, le dernier poisson grillé a un résultat de détection complètement différent tel que l'Omuraisu.

Si vous souhaitez simplement vérifier à l'aide des poids formés

Si vous souhaitez utiliser le poids du résultat de détection d'objet de cuisson ci-dessus pour effectuer uniquement la détection https://drive.google.com/open?id=1F8hbp5OGM5syGDQLpFPxbP1n9yFz804K Décompressez ces données, téléchargez-les sur le lecteur et exécutez la détection d'objet .ipynd à partir du dessus. Je pense que nous pouvons détecter les objets des plats que nous avons appris. Notez également que vous devrez modifier vous-même le chemin du fichier **! ** **

Les références

Chats, espace, musique et comptage d'objets à l'aide de darknet (YOLO) sur Google Colab [Reconnaissance d'image] https://wakuphas.hatenablog.com/entry/2018/09/19/025941#Google-Colaboratory%E3%81%A8%E3%81%AF site officiel de darknet https://pjreddie.com/darknet/yolo/ YOLO V3: apprendre les données originales http://demura.net/misc/14458.html

Recommended Posts

Détection d'objets de cuisson par classification d'images Yolo +
Détection de visage avec YOLO Face (Windows10, Python3.6)
Classification d'images avec un jeu de données d'images de fond d'oeil grand angle
Classification d'image avec Keras - Du prétraitement au test de classification -
Essayez la détection d'objets avec Raspberry Pi 4 + Coral
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.0) sur un processeur Windows!
J'ai essayé la détection d'objets avec YOLO v3 (TensorFlow 2.1) sur le GPU de windows!
Classification d'image MNIST (numéro manuscrit) avec Perceptron multicouche
Challenge classification des images par TensorFlow2 + Keras 3 ~ Visualiser les données MNIST ~
[Résumé] Modèle de détection d'objets utilisant Transformer "Détection d'objets de bout en bout avec des transformateurs"
Traitement d'image avec MyHDL
Traitement d'image avec PIL
2020/02 Python 3.7 + TensorFlow 2.1 + Keras 2.3.1 + YOLOv3 Détection d'objets avec la dernière version
Classification d'images avec un réseau de neurones auto-fabriqué par Keras et PyTorch
"Classer les déchets par image!" Journal de création d'application day2 ~ Mise au point avec VGG16 ~
[Apprentissage en profondeur] Classification d'images avec un réseau neuronal convolutif [DW jour 4]