[PYTHON] Essayez de reconnaître et de discriminer les images de caractères Shanimas en utilisant YOLO v3

introduction

Connaissez-vous THE IDOLM @ STER SHINY COLORS?

Si vous ne savez pas, jouez simplement Shanimas. La communauté et les cartes sont super. Vous pouvez également regarder la vidéo de lecture sur youtube, veuillez donc la regarder quand même.

En passant, si vous vous entraînez avec des données originales, vous voulez le faire avec votre contenu préféré, donc un record d'essayer la reconnaissance d'image avec des caractères Shanimas.

Je ne sais pas si les termes sont corrects.

environnement

PC d'apprentissage

Comme certains travaux ont été effectués sur mac, certaines captures d'écran ont été prises sur mac.

Puisque tous les logiciels utilisés sont fabriqués par python, il peut être utilisé quel que soit le système d'exploitation.

Avant l'entraînement

Je veux que vous présentiez Darknet d'une manière ou d'une autre. La méthode d'installation spécifique n'est pas expliquée ici.

Si vous pouvez obtenir l'image habituelle, vous êtes prêt à partir. テスト.png

Après avoir confirmé que cela fonctionne, vous êtes prêt à partir!

Collection d'images

Afin de juger l'image, l'image doit d'abord être préparée.

Préparation et installation du robot d'exploration

Comme il est très difficile de télécharger un par un, nous utiliserons cette fois un outil appelé icrawler. Cet outil télécharge automatiquement les résultats de la recherche d'images afin que vous puissiez facilement préparer des images.

Parce que python doit être inclus lorsque darknet est installé

pip install icrawler

Peut être installé avec.

Courir

Écrivez du code pour collecter des images.

Pour collectionner les idoles Shanimas: J'avais l'impression qu'il y avait peu de photos debout, donc ce serait peut-être une bonne idée d'ajouter "Communauté de noms de personnages" etc.


from icrawler.builtin import GoogleImageCrawler

google_crawler = GoogleImageCrawler(
    feeder_threads = 1,
    parser_threads = 2,
    downloader_threads = 4,
    storage = {'root_dir': 'shiny'}
    )

filters = dict(
    size = 'large'
    )

words = ["Idol Master Shiny Colors","Shanimas","Mano Sakuragi","Akari Kazeno","Visite Hachinomiya",
"Tsukioka Koibane","Mami Tanaka","Yuka Mitsumine","Sakuya Shirase", "Kiriko Yuya","Jinka Osaki","Kana Osaki","Chiyuki Kuwayama",
"Kaho Komiya","Juri Saijo","Rinyo Morino","Chiyoko Sonoda","Arisugawa Natsuha","Asahi Serizawa","Ai Izumi", "Yuko Mayuyu",
"L’Antica","illumination STARS","ALSTROEMERIA Shanimas","Straylight","Filles à l'apogée après l'école"]

max_num = 100 #Le nombre de collections d'images 100 est la limite dans Google
#Toru Asakura", "Hinana Ichikawa","Enka Higuchi","Fukumaru Koito", "Noctil Shanimas" #Commentez parce que Noctchill a été annoncé le lendemain de la collecte de l'image

for i in range(len(words)):
    google_crawler.crawl(keyword=words[i], filters=filters, max_num=max_num, file_idx_offset=i*max_num)


Enregistrez-le en tant que fichier python et exécutez-le. Ensuite, le dossier / shiny est créé et l'image acquise est enregistrée. crawl結果.png

Retravailler le fichier

Le fichier téléchargé cette fois a png et gif en plus de l'extension jpg.

Si cela est laissé tel quel, l'apprentissage sera entravé, donc ces fichiers seront supprimés. Il existe une solution de contournement pour convertir l'extension, mais elle est gênante, alors je l'ai traitée en la supprimant. Il y aura des trous dans les numéros de série, mais je m'en fiche car il n'y a aucun effet.

Nous avons également utilisé des illustrations de cartes Shanimas pour apprendre cette fois. Je n'expliquerai pas comment le télécharger, mais il sera facile à trouver.

De plus, si des caractères multi-octets sont mélangés, c'est gênant, alors convertissez-les correctement. Moyen simple de renommer un grand nombre de fichiers avec des numéros de série (fonction Windows standard)

Annotation

Lorsque l'image est prête, c'est finalement une annotation. Il est très difficile d'annoter 2700 images (en fait ce sera environ 2500 car certaines d'entre elles ont été supprimées).

N'essayez pas de tout faire en même temps, mais divisez-le en plusieurs jours.

Préparation de l'outil d'annotation

Cette fois, nous avons utilisé labelimg pour annoter.

Installation

git clone https://github.com/tzutalin/labelImg.git

sudo apt install pyqt5-dev-tools

cd labelImg

make qt5py3

Courir

python3 labelimg.py

Peut être exécuté avec.

Préparation du dossier

Déplacez une fois le fichier image préparé dans le dossier labelimg.

Modifiez également predefined_class.txt dans la classe labelimg / data. Ce faisant, la valeur initiale de la classe est définie, ce qui facilite un peu l'annotation.

Entrez les noms de 24 personnes séparés par des sauts de ligne et enregistrez.

Sakuragi Mano
Kazano Hiori
Hachimiya Meguru
Tanaka Mamimi
Yukoku Kiriko
Tsukioka Kogane
Mitsumine Yuika
Shirase Sakuya
Morino Rinze
Sonoda Chiyoko
Komiya Kaho
Saijo Juri
Arisugawa Natsuha
Osaki Amana
Osaki Tenka
Kuwayama Chiyuki
Serizawa Asahi
Mayuzumi Fuyuko
Izumi Mei
Ichikawa Hinana
Asakura Toru
Higuchi Madoka
Fukumaru Koito
Nanakusa Hazuki

Exécution d'annotation

Ouvrez le dossier d'image avec Open Dir </ b> et spécifiez la destination d'enregistrement avec Change Save Dir </ b>.

Cette fois, spécifiez le même dossier. ラベリング保存場所.png Sélectionnez ensuite PscalVOC sous Enregistrer et passez à YOLO </ b>. Si vous ne le changez pas, vous verrez des pleurs, alors faites attention!

Annoter lorsqu'une image apparaît. Appuyez sur la touche "W" pour entrer dans le mode de spécification de plage, sélectionnez donc la plage de la face inactive. L'écran de sélection du nom de la classe apparaît. Sélectionnez l'idole correcte et cliquez sur OK.

ラベリング中.png

Cela se répète à jamais.

ラベリング.png

De plus, en activant "Affichage-> Mode d'enregistrement automatique", il sera enregistré automatiquement. Ensuite, la plupart du travail ne peut être effectué que par une entrée clé.

"W" → Spécifier la plage → Saisir la lettre initiale du nom inactif → Sélectionner avec les touches fléchées → Valider → Passer à l'image suivante avec "D"

Peut être dit.

Précautions lors de l'annotation

Puisque plus de 2000 annotations sont effectuées, le logiciel plante parfois. À ce stade, le fichier «classes.txt» dans le dossier image est peut-être endommagé. Si vous l'ouvrez avec un bloc-notes pendant que vous travaillez, vous pouvez le récupérer immédiatement même s'il est endommagé.

De plus, si vous créez une nouvelle classe en raison d'une faute de frappe, vous pouvez la corriger de la même manière, mais veillez à supprimer celle étiquetée dans la nouvelle classe.

De plus, les images qui ne peuvent pas être étiquetées sont incluses en raison de la commodité de la collecte d'images. Vous pouvez ignorer l'image telle quelle.

ラベリング後.png Confirmez que l'image et le fichier texte ont été créés. ## Division des données

Divisez les données du dossier en données d'enseignant et données d'apprentissage.

c'est How to train YOLOv2 to detect custom objects Nous modifierons certains des programmes ci-dessus pour séparer automatiquement les données.

import glob, os

# Current directory
current_dir = os.path.dirname(os.path.abspath(__file__))

# Directory where the data will reside, relative to 'darknet.exe'
path_data = 'data/obj/'

# Percentage of images to be used for the test set
percentage_test = 10

# Create and/or truncate train.txt and test.txt
file_train = open('train.txt', 'w')  
file_test = open('test.txt', 'w')

# Populate train.txt and test.txt
counter = 1  
index_test = round(100 / percentage_test)  
texts = glob.glob(os.path.basename(os.path.join(current_dir, "*.txt")))
for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg ")):  
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))
    if (title + ".txt") in texts:
        if counter == index_test:
            counter = 1
            file_test.write(path_data + title + '.jpg' + "\n")
        else:
            file_train.write(path_data + title + '.jpg' + "\n")
            counter = counter + 1

Donnez-lui un nom de fichier approprié, enregistrez-le dans le même dossier que l'image et exécutez-le. Cela ajoutera uniquement les images contenant un fichier texte au fichier train.txt ou test.txt. Puisque le rapport des données d'enseignant est déterminé par pourcentage_test = 10, modifiez-le si nécessaire.

Déplacez le dossier contenant ces derniers vers darknet / data / </ b> (pour qu'il devienne darknet / data / shiny)

Préparation du dossier

Préparez les fichiers nécessaires à l'apprentissage.

Préparation du fichier de poids

Puisqu'il existe un fichier de poids pré-formé officiel, utilisez-le.

wget https://pjreddie.com/media/files/darknet53.conv.74

Vous pouvez le télécharger sur.

Préparation du fichier de configuration

  • .data
  • .names
  • .cfg

Créez un fichier.

Créer un fichier .data

Créez un fichier .data.

classes= 24
train  = data/shiny/train.txt  
valid  = data/shiny/test.txt  
names = cfg/obj_shiny.names
backup = backup/  

Nommez-le obj_shiny.data </ b> et enregistrez-le dans cfg / En même temps, créez un dossier de sauvegarde sous darknet.

Créer un fichier .names

Créez un fichier obj_shiny.names </ b> pour qu'il devienne cfg / obj_shiny.names. Le contenu est le même que celui de classes.txt, vous pouvez donc enregistrer classes.txt sous un nouveau nom.

Créer un fichier .cfg

Copiez cfg / yolov3-voc.cfg et il y a 3 endroits

  • Changement du nombre de classes classes </ b> à 24.
  • Définissez filtres </ b> juste avant les classes sur 87, qui est la valeur de (classes + 5) * 3.

Lorsque la modification est terminée, enregistrez-la sous cfg / yolov3_shiny.cfg </ b>.

Modifiez les classes et les filtres dans cette partie.

[convolutional]
size=1
stride=1
pad=1
filters=87
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=24
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

De plus, si vous voulez vous entraîner sérieusement, c'est dans la première partie [nette].

  • lot = 1 lot = 64 </ b>
  • subdivisions = 1 subdivisions = 8 </ b>

Changer en.

En fonction des performances du GPU, une erreur de mémoire peut se produire, alors réduisez le lot ou augmentez les subdivisions.

entraînement

darknet.exe detector train cfg/obj_shiny.data cfg/yolov3_shiny.cfg darknet53.conv.74

La formation commence par son exécution. Si le graphique n'apparaît pas, il y a de fortes chances qu'une erreur se soit produite, alors vérifiez-le.

Résultat expérimental

Lorsque l'apprentissage est terminé

darknet.exe detector test cfg/obj_shiny.data cfg/yolov3_shiny.cfg backup/yolov3-obj_last.weights

Vous pouvez vérifier avec.

結果.png Bien entendu, les illustrations des cartes formées peuvent être identifiées. 結果2.png Toru Asakura ne pouvait préparer qu'environ 10 feuilles, mais il la reconnaissait si c'était une photo debout. 結果3.png Asahi Serizawa, une nouvelle illustration qui n'avait pas été formée, a été reconnue et discriminée. 結果3.png 結果3.png Je n'ai pas pu reconnaître le profil, mais je peux dire que j'ai pu apprendre.

À la fin

結果3.png C'est un graphique du processus d'apprentissage cette fois, mais il a été clairement sur-appris à 50 000 fois. En regardant les résultats, les résultats ont été convaincants 5000 à 7000 fois.

De plus, toutes les cartes d'illustration Shanimas ont été utilisées pour les images utilisées pour l'apprentissage cette fois. Par conséquent, l'image comme la première utilisée pour l'apprentissage sera naturellement reconnue. On peut dire que des images plus expérimentales auraient dû être préparées afin de confirmer qu'elles étaient réellement reconnues.

Article de référence

How to train YOLOv2 to detect custom objects

Apprendre les données originales de YOLO

Votre commande est-elle YOLO! ?? (Jusqu'à l'apprentissage et l'exécution de YOLO sous Windows 10)

Votre commande est-elle YOLO v3! ?? -Exécution de YOLO v3 sur Windows-

Article de référence dans la partie icrawer Collecte facile de données d'image à l'aide de la bibliothèque python icrawler