[PYTHON] Gesichtserkennung für Momokuro-Mitglieder durch TensorFlow (Teil 1)

Zweite Abkochung ist unvollständig, aber ich kann nicht anders, als zu schreiben, was ich getan habe.

Ein Softwareentwickler, der mit maschinellem Lernen und tiefem Lernen völlig neu ist, hat eine App erstellt, die ein Faltungsnetzwerk verwendet, um die Gesichter von Mitgliedern von "Momoiro Clover Z" zu identifizieren.

Was ich gemacht habe

Es läuft auf ec2. Es ist jedoch schwer, weil es t2.micro ist.

Momokuro Bildklassifizierer http://momomind.kenmaz.net

Code https://github.com/kenmaz/momo_mind

スクリーンショット 2016-05-23 3.02.48.png

Hintergrund

Ich (@kenmaz) habe in den letzten Jahren bei der Arbeit nur iOS-Apps (objc / swift) geschrieben. Davor habe ich auch Web-Apps, Server-Apps, Entwicklungstools usw. in Java / Ruby / PHP geschrieben. Mein Wissen über maschinelles Lernen und künstliche Intelligenz war also fast Null.

Selbst sprechende & Nachschlagewerke

Ich werde darüber schreiben, warum ich beschlossen habe, eine App wie den Titel zu erstellen, zusammen mit der Einführung einiger Bücher.

"Übersteigt künstliche Intelligenz den Menschen?"

Es gab ein Buch "Übersteigt künstliche Intelligenz den Menschen?", Das Ende letzten Jahres ein heißes Thema wurde, aber es war so interessant, dass ich tatsächlich tiefes Lernen lernen und es ausprobieren wollte.

https://www.amazon.co.jp/ Übersteigt künstliche Intelligenz den Menschen? Kakugawa EPUB-Auswahlbuch-Matsuo-Yutaka-ebook / dp / B00UAAK07S

Ich habe Angst vor Singularität! Ich dachte, aber SF geht es gut, nicht wahr?

"Einführung in die Theorie des maschinellen Lernens für IT-Ingenieure"

Zuerst las ich "Einführung in die Theorie des maschinellen Lernens für IT-Ingenieure". Dies ist auch ein beliebtes Buch, das flach im Buchladen gestapelt ist.

http://gihyo.jp/book/2015/978-4-7741-7698-7

Es reicht von den Grundlagen des maschinellen Lernens bis hin zu Erklärungen verwandter Mathematik und Statistik wie der Methode der kleinsten Quadrate und der wahrscheinlichsten Schätzmethode. Deep Learning wird nicht so oft erwähnt, aber die Themen rund um Perceptron, Klassifizierungsalgorithmen basierend auf logistischer Regression und Bayes'sche Schätzung schienen maschinelles Lernen zu lernen und reagierten.

"Beginnen wir mit maschinellem Lernen"

Dies ist eine Web-Serialisierung. Wird es vom selben Autor wie ↑ serialisiert? Ich habe das auch gelesen.

http://gihyo.jp/dev/serial/01/machine-learning

"Mathematik für die Physik"

Also, hier, Differenzierung / Integration hey, ja ja ... ich hätte es tun sollen, aber hey, also machte ich einen kleinen Umweg und Mr. Haruaki Tazaki von der Gakuin Universität gab es kostenlos frei. Ich habe beschlossen, das Dokument "Mathematik für Physik" zu lesen. Es wurde irgendwo als Mathematiklehrbuch für die erste Klasse der High School / Universität empfohlen.

http://www.gakushuin.ac.jp/~881791/mathbook/

Ich druckte es aus und las es, als ich am Neujahrstag nach Hause kam. Wenn ich jetzt darüber nachdenke, frage ich mich, ob es in Ordnung war, wenn ich es nicht separat gelesen habe. ..

"Deep Learning (maschinelles Lernen professionelle Serie)"

Ich fand Mathematik gut und las die obige "Einführung in die Theorie des maschinellen Lernens" noch einmal, aber ich dachte, ich wollte in das tiefe Lernen einbeißen, und ich dachte "tiefes Lernen (Machine Learning Professional Series)". ) "war.

http://www.amazon.co.jp/ Deep Learning-Maschinelles Lernen Professional Series-Okaya-Takayuki / dp / 4061529021

Wie der Titel schon sagt, können Sie etwas über tiefes Lernen lernen. Neuronales Netzwerk, Rückausbreitung, Selbstcodierung, Faltungs-Neuronales Netz, Rekursives Neuronales Netz usw. .. .. Ich bin kein Spezialist, aber ich habe das Gefühl, dass es wichtige Themen im Zusammenhang mit Deep Learning abdeckt. Wenn Sie den Teil lesen, den Sie in der ersten Runde nach dem eigentlichen Schreiben des Codes nicht gut verstanden haben, ein Phänomen wie "Ah, diese unklare Formel, hängt sie mit dem Teil dieses Codes zusammen, den ich zuvor geschrieben habe?" Kommt oft vor, deshalb ist es gut, ein Gefühl des Lernens zu haben.

Das Schockierendste war die Beschreibung: "Es gibt einige Dinge, die Forscher nicht wirklich verstehen, warum das Hinzufügen einer verborgenen Schicht die Genauigkeit verbessert", und ich fühlte Romantik.

Jetzt, Ungefähr zu dieser Zeit dachte ich, es sei in Ordnung, ein Buch zu lesen, ich wollte etwas schreiben, und ich begann darüber nachzudenken, etwas mit TensorFlow zu machen, was zu dieser Zeit ein heißes Thema war.

Dies ist schließlich das Hauptthema (lange Einführung).

Was zu machen

Wie Sie dem Titel entnehmen können, entspricht der, den ich diesmal gemacht habe, fast dem Inhalt des Blog-Artikels von Herrn Sugiyan.

Identifizieren Sie das Gesicht des Idols mit tiefem Lernen mit TensorFlow <http://d.hatena.ne.jp/sugyan/20160112/1452558576

Wie erwartet ist es dasselbe, genau dasselbe zu machen. Selbst wenn es dieselbe Funktion hat, dachte ich, dass sich das Analyseziel zumindest von dem schwarzen, aber schweren Mononov im Oberschenkel unterscheiden sollte Als Ingenieur konnte ich nicht anders, als zu genießen, was Mr. Sugiyan tat, und entschied mich schließlich, dasselbe Material zu verwenden. Entschuldigung für den zweiten Sud.

Programmübersicht

Es besteht aus vier Komponenten.

crawler
Ruby-Skript, das schwarze Bilder aus dem Web sammelt

face_detect
Python-Skript, das den Gesichtsteil aus dem vom Crawler gesammelten Bild herausschneidet

deeplearning
TensorFlow, der Gesichtsbilder als Trainings- / Testdaten lernt+Python-Skript

web
Ein Python-Skript, das die Gesichtserkennung als Web-App mithilfe eines Modells der Lernergebnisse bietet

Ich bin mir bei Python nicht sicher, also schreiben wir das meiste zuerst in Ruby! Ich dachte, aber ich dachte, dass Python für den Umgang mit openCV (und natürlich TensorFlow) vorteilhafter ist, also wechselte ich von der Mitte zu Python als Hauptsprache. Deshalb ist nur Crawler Ruby und alles andere ist Python. Verwenden wir Python gehorsam.

crawler

https://github.com/kenmaz/momo_mind/blob/master/crawler/url_fetch.rb Führen Sie zunächst in "url_fetch.rb" eine Bing-Bildsuche mit dem Namen des schwarzen Oberschenkelelements als Schlüsselwort durch und ermitteln Sie die Bild-URL. Es gibt nichts Besonderes. Als Reflexionspunkt trifft das Suchergebnis der Bing-Bildsuche nur das Bild des alten Oberschenkelschwarzes, und es war schwierig, das neueste Bild zu erfassen. Ich dachte, es wäre besser, das Bild vom Amebro des Mitglieds zu ziehen, aber vorerst ist es nur über Bing.

https://github.com/kenmaz/momo_mind/blob/master/crawler/download.rb Sobald Sie die URL-Liste erhalten haben, laden Sie das hämmernde Bild mit download.rb herunter. Als ich es nachts laufen ließ und morgens aufwachte, hatte ich viel davon.

Gelegentlich existiert dieselbe URL und die Bilder werden dupliziert. Daher habe ich zum Zeitpunkt des Speicherns den Hashwert der Bildbinärdatei als Dateinamen verwendet, um eine Duplizierung so weit wie möglich zu vermeiden.

Wie oben erwähnt, war es ein gewöhnlicher Crawler.

face_detect Als nächstes extrahieren wir aus den gesammelten Bildern die Gesichtsteile als Lerndaten. https://github.com/kenmaz/momo_mind/blob/master/face_detect/detect.py

detect.py verwendet standardmäßig ein von openCV bereitgestelltes Modell namens haarcascades, um nur den Gesichtsteil aus dem Bild zu erkennen und als Bild auszuschneiden. Wenn Sie jedoch versuchen, ein Gesicht mit diesem Modell zu erkennen, treten die folgenden Probleme auf.

-Wenn das Gesicht auch nur ein wenig geneigt ist, wird es nicht als Gesicht erkannt

In Bezug auf dieses Problem habe ich noch einmal auf den Blog-Beitrag von Herrn Sugiyan verwiesen.

Einfache Gesichtserkennungs-API mit Heroku + OpenCV http://d.hatena.ne.jp/sugyan/20151203/1449137219

Es ist fast das gleiche wie oben, aber der Verarbeitungsinhalt ist wie folgt.

--Drehen Sie das Bild selbst um 5 Grad, um das Gesicht zu erkennen => Lösen Sie das Problem der Gesichtsneigung

In Bezug auf die Erkennung von Augen und Mund bewerten wir Folgendes.

Dies ist ein schwerer Vorgang, da der obige Vorgang wiederholt wird, während das Bild in Schritten von 5 Grad von -50 Grad auf 50 Grad gedreht wird.

Dieses Skript wird nicht nur zum Generieren von Trainingsdaten verwendet, sondern auch zum Erkennen von Gesichtern aus Bildern, die von Benutzern hochgeladen wurden, wenn sie schließlich als Webanwendung veröffentlicht werden. Es ist zu schwer, die Verarbeitung so umzuleiten, wie sie ist. Bei der Verwendung als Webanwendung habe ich versucht, nur die Winkel von -5 Grad, 0 Grad, 5 Grad zu verwenden. Daher schlägt die Gesichtserkennung häufig fehl, ist jedoch unvermeidlich.

Für das Problem, dass dasselbe Gesicht zwischen gedrehten Bildern dupliziert wird, können die duplizierten Gesichtsbilder durch Drehen und Verschieben der Koordinaten jedes Gesichts gruppiert werden. Ich habe es getan, als ich in der High School war.

Primäre Umwandlung der Drehbewegung http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html

Manuelles Training / Vorbereitung der Testdaten

Damit wurde endlich eine große Anzahl von Gesichtsbildern von Kuro-Mitgliedern gesammelt, aber um diese als Lerndaten verwenden zu können, ist es notwendig, als Lerndaten anzugeben, wer jedes Gesicht von Kuro ist. Muss angehoben werden. Von nun an versuche ich, ein Programm zu erstellen, das es automatisch klassifiziert. Aufgrund des Problems mit Eiern und Hühnern ist es jedoch erforderlich, dass der Mensch zuerst die ersten Lerndaten erstellt.

Herr Sugiyan scheint ein Web-Tool zum Erstellen von Lerndaten erstellt zu haben, aber ich war verärgert. Daher habe ich die Bilder vorerst im Mac Finder angeordnet und mehrere Bilder mit cmd + Klicken → Ordner erstellen ausgewählt. Ich habe mich für die Arbeit entschieden, weil es sich so anfühlt.

Die Ordnerstruktur sieht so aus.

/out
  /train
    /reni
      ..Über 150 Bilder..
    /kanako
      ..Über 150 Bilder..
    /shiori
      ..Über 150 Bilder..
    /arin
      ..Über 150 Bilder..
    /momoka
      ..Über 150 Bilder..
  test
    /reni
      ..Über 150 Bilder..
    /kanako
      ..Über 150 Bilder..
    /shiori
      ..Über 150 Bilder..
    /arin
      ..Über 150 Bilder..
    /momoka
      ..Über 150 Bilder..

Ich habe mich gefragt, wie viel die Trainings- und Testbilder verteilt werden sollen, aber ich habe jeweils etwa 150 vorbereitet. Zunächst sollten Sie die Trainingsdaten anreichern! Also habe ich versucht, Training zuzuweisen: test = 7: 3, aber dann können die Testdaten abhängig von der Auswahl der Testdaten verzerrt sein.

Ich habe mein Bestes getan, um insgesamt 1.500 Bilder nach menschlicher Kraft zu klassifizieren, und ich denke, dass dies wirklich gut für das Gesichtsbild eines Momokuro-Mitglieds war. Warum versuchst du es nicht mit SMAP-Mitgliedern? Ich habe das gesagt, aber ich mag es wirklich nicht, 1500 Gesichtsbilder von Onkeln zu klassifizieren. Es war wirklich gut, schwarz zu sein.

スクリーンショット 2016-05-23 2.42.41.png

Das Ende des ersten Teils

Dies ist das Ende des ersten Teils. Niemand mag es wollen, aber ich bin sicher, ich werde den zweiten Teil schreiben.

Klicken Sie hier für mehr Teil 2: http://qiita.com/kenmaz/items/ef0a1308582fe0fc5ea1#_reference-6ae9a51ee7a7a346d3c1

Recommended Posts

Gesichtserkennung für Momokuro-Mitglieder durch TensorFlow (Teil 1)
Gesichtserkennung für Momokuro-Mitglieder durch TensorFlow (Teil 2)
Gesichtserkennung für Momokuro-Mitglieder durch TensorFlow (zweiter Teil)
TensorFlow Tutorial-Bilderkennung (Übersetzung)
Gesichtserkennung in Echtzeit mit von getUserMedia [HTML5, openCV] aufgenommenem Video