[PYTHON] Versuchen Sie, Shanimas-Charakterbilder mit YOLO v3 zu erkennen und zu unterscheiden

Einführung

Kennen Sie THE IDOLM @ STER SHINY COLORS?

Wenn Sie es nicht wissen, spielen Sie einfach Shanimas. Die Community und die Karten sind großartig. Sie können das Wiedergabevideo auch auf Youtube ansehen. Bitte schauen Sie es sich trotzdem an.

Übrigens, wenn Sie mit Originaldaten trainieren, möchten Sie dies mit Ihrem Lieblingsinhalt tun, also eine Aufzeichnung des Versuchs der Bilderkennung mit Shanimas-Zeichen.

Ich bin mir nicht sicher, ob die Bedingungen korrekt sind.

Umgebung

PC lernen

Da einige Arbeiten auf dem Mac ausgeführt wurden, wurden einige Screenshots auf dem Mac aufgenommen.

Da die gesamte verwendete Software von Python erstellt wird, kann sie unabhängig vom Betriebssystem verwendet werden.

Vor dem Training

Ich möchte, dass du Darknet irgendwie vorstellst. Die spezifische Installationsmethode wird hier nicht erläutert.

Wenn Sie das übliche Bild erhalten, können Sie loslegen. テスト.png

Nachdem Sie bestätigt haben, dass es funktioniert, können Sie loslegen!

Sammlung von Bildern

Um das Bild beurteilen zu können, muss das Bild zuerst vorbereitet werden.

Vorbereitung und Installation des Crawlers

Da es sehr schwierig ist, einen nach dem anderen herunterzuladen, verwenden wir dieses Mal ein Tool namens icrawler. Dieses Tool lädt automatisch Bildsuchergebnisse herunter, sodass Sie Bilder einfach vorbereiten können.

Weil Python enthalten sein sollte, wenn Darknet installiert ist

pip install icrawler

Kann mit installiert werden.

Lauf

Schreiben Sie Code, um Bilder zu sammeln.

So sammeln Sie Shanimas-Idole: Ich hatte den Eindruck, dass es nur wenige stehende Bilder gab, daher könnte es eine gute Idee sein, "Character Name Community" usw. hinzuzufügen.


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","Tour 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","Höhepunkt Mädchen nach der Schule"]

max_num = 100 #Die Anzahl der Bildersammlungen 100 ist das Limit in Google
#Toru Asakura", "Hinana Ichikawa","Enka Higuchi","Fukumaru Koito", "Noctil Shanimas" #Kommentar aus, da Noctchill am Tag nach der Bildaufnahme angekündigt wurde

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


Speichern Sie es als Python-Datei und führen Sie es aus. Anschließend wird der Ordner / shiny erstellt und das erfasste Bild gespeichert. crawl結果.png

Datei überarbeiten

Die diesmal heruntergeladene Datei enthält zusätzlich zur Erweiterung jpg png und gif.

Wenn dies unverändert bleibt, wird das Lernen behindert, sodass diese Dateien gelöscht werden. Es gibt eine Problemumgehung zum Konvertieren der Erweiterung, die jedoch problematisch ist. Daher habe ich sie durch Löschen behoben. Es wird Löcher in den Seriennummern geben, aber es ist mir egal, weil es keine Wirkung gibt.

Wir haben dieses Mal auch Shanimas-Kartenillustrationen verwendet, um zu lernen. Ich werde nicht erklären, wie man es herunterlädt, aber es wird leicht zu finden sein.

Wenn Multi-Byte-Zeichen gemischt werden, ist dies ebenfalls problematisch. Konvertieren Sie sie daher entsprechend. Einfache Möglichkeit, eine große Anzahl von Dateien mit Seriennummern umzubenennen (Standard-Windows-Funktion)

Anmerkung

Wenn das Bild fertig ist, handelt es sich schließlich um eine Anmerkung. Es ist sehr schwierig, 2700 Bilder mit Anmerkungen zu versehen (tatsächlich sind es ungefähr 2500, da einige von ihnen gelöscht wurden).

Versuchen Sie nicht, alles auf einmal zu tun, sondern teilen Sie es in mehrere Tage auf.

Vorbereitung des Anmerkungswerkzeugs

Dieses Mal haben wir labelimg zum Kommentieren verwendet.

Installation

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

sudo apt install pyqt5-dev-tools

cd labelImg

make qt5py3

Lauf

python3 labelimg.py

Kann mit ausgeführt werden.

Dateivorbereitung

Verschieben Sie die vorbereitete Bilddatei einmal in den Ordner labelimg.

Ändern Sie außerdem predefined_class.txt in der Klasse labelimg / data. Auf diese Weise wird der Anfangswert der Klasse festgelegt, was die Annotation etwas erleichtert.

Geben Sie die Namen von 24 Personen ein, die durch Zeilenumbrüche getrennt sind, und speichern Sie sie.

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

Ausführung der Annotation

Öffnen Sie den Bildordner mit Open Dir </ b> und geben Sie das Speicherziel mit Save Dir </ b> an.

Geben Sie diesmal denselben Ordner an. ラベリング保存場所.png Wählen Sie dann PscalVOC unter Speichern und wechseln Sie zu YOLO </ b>. Wenn Sie es nicht ändern, werden Sie weinen sehen, also seien Sie vorsichtig!

Kommentieren Sie, wann ein Bild angezeigt wird. Drücken Sie die Taste "W", um den Bereichsspezifikationsmodus aufzurufen. Wählen Sie daher den Bereich der Leerlauffläche aus. Der Bildschirm zur Auswahl des Klassennamens wird angezeigt. Wählen Sie das richtige Idol aus und klicken Sie auf OK.

ラベリング中.png

Dies wird für immer wiederholt.

ラベリング.png

Wenn Sie "Ansicht-> Automatischer Speichermodus" aktivieren, wird es automatisch gespeichert. Dann kann der größte Teil der Arbeit nur durch Tastatureingabe erledigt werden.

"W" → Bereich angeben → Anfangsbuchstaben des Leerlaufnamens eingeben → Mit den Pfeiltasten auswählen → Eingabe → Mit "D" zum nächsten Bild wechseln

Kann man sagen.

Vorsichtsmaßnahmen beim Kommentieren

Da mehr als 2000 Anmerkungen ausgeführt werden, stürzt die Software manchmal ab. Zu diesem Zeitpunkt ist möglicherweise die Datei "classes.txt" im Bildordner beschädigt. Wenn Sie es während der Arbeit mit einem Notizblock öffnen, können Sie es sofort wiederherstellen, auch wenn es beschädigt ist.

Wenn Sie aufgrund eines Tippfehlers eine neue Klasse erstellen, können Sie diese auf die gleiche Weise korrigieren. Löschen Sie jedoch unbedingt die in der neuen Klasse angegebene Klasse.

Darüber hinaus werden Bilder, die nicht beschriftet werden können, aufgrund der bequemen Bildersammlung aufgenommen. Sie können das Bild so wie es ist überspringen.

ラベリング後.png Stellen Sie sicher, dass das Bild und die Textdatei erstellt wurden. ## Datenaufteilung

Teilen Sie die Daten im Ordner in Lehrerdaten und Lerndaten.

das ist How to train YOLOv2 to detect custom objects Wir werden einige der oben genannten Programme ändern, um die Daten automatisch zu trennen.

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

Geben Sie ihm einen geeigneten Dateinamen, speichern Sie ihn im selben Ordner wie das Bild und führen Sie ihn aus. Dadurch werden nur die Bilder mit einer Textdatei zur Datei train.txt oder test.txt hinzugefügt. Da das Verhältnis der Lehrerdaten durch Prozentsatz_Test = 10 bestimmt wird, ändern Sie es entsprechend.

Verschieben Sie den Ordner, der diese enthält, nach darknet / data / </ b> (damit es zu darknet / data / shiny wird).

Dateivorbereitung

Bereiten Sie die zum Lernen erforderlichen Dateien vor.

Vorbereiten der Gewichtsdatei

Verwenden Sie diese, da es eine offizielle vorgefertigte Gewichtsdatei gibt.

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

Sie können es unter herunterladen.

Vorbereitung der Konfigurationsdatei

  • .data
  • .names
  • .cfg

Erstellen Sie eine Datei.

Erstellen einer .data-Datei

Erstellen Sie eine .data-Datei.

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

Nennen Sie es obj_shiny.data </ b> und speichern Sie es in cfg / Erstellen Sie gleichzeitig einen Sicherungsordner unter darknet.

Erstellen einer .names-Datei

Erstellen Sie eine obj_shiny.names </ b> -Datei, sodass sie zu cfg / obj_shiny.names wird. Der Inhalt ist der gleiche wie in classes.txt, daher können Sie classes.txt unter einem neuen Namen speichern.

Erstellen einer .cfg-Datei

Kopieren Sie cfg / yolov3-voc.cfg und es gibt 3 Stellen

  • Die Anzahl der Klassen </ b> Klassen wurde auf 24 geändert.
  • Setzen Sie Filter </ b> kurz vor den Klassen auf 87, was dem Wert von (Klassen + 5) * 3 entspricht.

Wenn die Änderung abgeschlossen ist, speichern Sie sie als cfg / yolov3_shiny.cfg </ b>.

Ändern Sie die Klassen und Filter in diesem Teil.

[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

Wenn Sie ernsthaft trainieren möchten, finden Sie dies im ersten [Netto] Teil.

  • batch = 1 batch = 64 </ b>
  • Unterteilungen = 1 Unterteilungen = 8 Unterabteilungen

Ändern.

Abhängig von der Leistung der GPU kann ein Speicherfehler auftreten. Reduzieren Sie daher den Stapel oder erhöhen Sie die Unterteilungen.

Ausbildung

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

Das Training beginnt mit der Ausführung. Wenn das Diagramm nicht angezeigt wird, besteht eine hohe Wahrscheinlichkeit, dass ein Fehler aufgetreten ist. Überprüfen Sie es daher.

Versuchsergebnis

Wenn das Lernen beendet ist

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

Sie können mit überprüfen.

結果.png Natürlich können die Abbildungen der trainierten Karten identifiziert werden. 結果2.png Toru Asakura konnte nur etwa 10 Blätter vorbereiten, aber er erkannte es, wenn es sich um ein stehendes Bild handelte. 結果3.png Asahi Serizawa, eine neue Illustration, die nicht trainiert worden war, wurde erkannt und diskriminiert. 結果3.png 結果3.png Ich konnte das Profil nicht erkennen, aber ich kann sagen, dass ich lernen konnte.

Am Ende

結果3.png Es ist ein Diagramm des Lernprozesses dieses Mal, aber es wurde 50.000 Mal deutlich überlernt. Mit Blick auf die Ergebnisse überzeugten die Ergebnisse 5000 bis 7000 Mal.

Zusätzlich wurden alle Shanimas-Illustrationskarten für die Bilder verwendet, die dieses Mal zum Lernen verwendet wurden. Daher wird das Bild wie das erste, das zum Lernen verwendet wird, natürlich erkannt. Es kann gesagt werden, dass experimentellere Bilder hätten erstellt werden müssen, um zu bestätigen, dass sie wirklich erkannt wurden.

Referenzartikel

How to train YOLOv2 to detect custom objects

Lernen von YOLO-Originaldaten

Ist Ihre Bestellung YOLO! ?? (Bis zum Erlernen und Ausführen von YOLO unter Windows 10)

Ist Ihre Bestellung YOLO v3! ?? - Ausführen von YOLO v3 unter Windows-

Referenzartikel im icrawer-Teil Einfache Erfassung von Bilddaten mit dem Python-Bibliotheks-Icrawler