[PYTHON] Erstellen Sie eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert ① (Vorbereitung von Lerndaten)

⓪ Einführung

Ich wollte schon immer trendige KI und Deep Learning ausprobieren, deshalb habe ich mich entschlossen, aus den vorausgesetzten Kenntnissen des maschinellen Lernens (Deep Learning) von 0 als kostenloses Studium von GW im Mai 2017 aus dem Geist von Miha zu lernen. .. Klicken Sie hier, um Beispielvideos von dem zu sehen, was Sie tatsächlich gemacht haben (http://akikiyo.com/zuck-detect-ai). Der endgültige Code lautet hier.

[Gemacht]

Drei Gesichter des Silicon Valley Mogul-Unternehmers ** Mark Zuckerberg (Facebook) **, ** Bill Gates (Microsoft) **, ** Earon Musk (SpaceX, Tesla) ** KI zu identifizieren. (Derzeit wurde dies noch nicht im Internet hochgeladen. Ich möchte es hochladen, wenn ich Zeit habe * Stand Mai 2017)


zuck3.png


zgif2.gif


[Profil des Autors (@AKIKIKIKIKIKIK)]

Keine Grundkenntnisse für Datenanalyse oder maschinelles Lernen. Der größte Teil der Programmierung erfolgt im Selbststudium. Ich mache gerne WEB-Apps mit Rails.

[Referenzen in Bezug auf maschinelles Lernen und tiefes Lernen]

Ich denke, es ist schlecht, beim Deep Learning nichts über maschinelles Lernen zu wissen. Schauen Sie sich also zuerst verschiedene Informationen im Internet an, um herauszufinden, was Sie können und was nicht. (Normalerweise lese ich die Informationen im WEB, die in "Tensor Flow" und "Deep Learning" angezeigt werden. Danach suchte ich nach "Was ist ein neuronales Netzwerk?")

Ich habe mich besonders darauf bezogen. Gesichtserkennung für Momokuro-Mitglieder durch TensorFlow [Identifizieren Sie die Anime Yuruyuri Produktionsfirma mit TensorFlow] (http://kivantium.hateblo.jp/entry/2015/11/18/233834)

Es ist ein Artikel von zwei Personen. Ich war so hilfreich, dass ich ohne diesen Artikel nicht zu dem hätte gelangen können, der tatsächlich funktioniert hat. Vielen Dank m (_ _) m

[Bibliothek zum maschinellen Lernen]

Es gibt verschiedene Bibliotheken für maschinelles Lernen, aber dieses Mal habe ich beschlossen, mich auf TensorFlow zu konzentrieren, Googles Bibliothek für maschinelles Lernen. Der Grund ist wie folgt.

・ Da es sich um eine Google-Bibliothek handelt, floriert die Community und es scheint in Zukunft spannend zu sein ・ Es wird gesagt, dass es auch in der aktuellen Go AI Alpha Go usw. verwendet wird. ・ Viele praktische Funktionen machen es Anfängern leicht, "maschinelles Lernen" zu erleben. ・ Die einzige Bibliothek für maschinelles Lernen, die ich kannte, bevor ich an dieser Zeit arbeitete

Ich habe es aus irgendeinem Grund gewählt. Um ehrlich zu sein, habe ich es nicht zu tief mit anderen Bibliotheken für maschinelles Lernen verglichen. Möglicherweise ist etwas einfacher zu verwenden. In diesem Artikel werden TensorFlow-Setup-Verfahren usw. in vielen anderen Artikeln beschrieben, daher werde ich die Beschreibung hier weglassen.

[Bestimmen Sie, was mit TensorFlow geschehen soll]

Ich entschied mich für "Implementierung der Gesichtsidentifizierungsfunktion in TensorFlow", die von einer relativ großen Anzahl von Personen durchgeführt wurde und genau richtig zu sein schien. Frühere Vorfahren sind Momokuro, Osomatsu-san / 22/161858), Yuruyuri usw., und das Ziel, das Gesicht zu erkennen, ist Ihr Lieblingscharakter oder Ihre Lieblingsperson Ich entschied mich für "Mark Zuckerberg", den Gründer von Facebook, der meine Lieblingsperson ist. (Unter dem Gesichtspunkt, das Sammeln von Gesichtsbildern zu vereinfachen)

[Eigentlich versuchen]

Das Verfahren, an dem ich gearbeitet habe, wird unten beschrieben. Dieses Mal haben wir nicht "TensorFlow verstanden und gemeistert", sondern "Deep Learning erfahren". Es dauert länger, TensorFlow zu beherrschen. .. ..

① Erfassung und Aufbereitung von Gesichtsdaten für das Lernen

スクリーンショット 2017-04-28 11.36.29.png (Zuallererst der Fluss bis zur Vorbereitung dieser etwas gruseligen Mr. Zuckerbergs Gesichtsdaten)

1. Sammeln Sie Bilddaten von Herrn Zuckerberg

Verwenden Sie die API der MicroSoft-Suchmaschine Bing, um die Bilddaten zum Zeitpunkt der Suche mit dem Wort ** "zuckerberg" ** zu crawlen und auf Ihrem PC zu speichern. [Die Geschichte des Übergangs von Bing Search API v2 zu v5](http://techblog.adish.co.jp/entry/2016/12/03/Bing_Search_API_v2_%E3%81%8B%E3%82%89_v5_%E3%81 % B8% E7% A7% BB% E8% A1% 8C% E3% 81% 97% E3% 81% 9F% E8% A9% B1) (Einzelheiten zur Verwendung der Bildsuch-API von Bing finden Sie hier. Vielen Dank. Dieses Mal verwende ich einfaches Python, aber da ich gut in Ruby bin, schreibe ich in Ruby, wo Python nicht erforderlich ist. )

image_crawler.rb


require "open-uri"
require "FileUtils"
require 'net/http'
require 'json'

#Zielverzeichnis
@dirName = "./zuckerberg_image/"
#Erstellen Sie ein Speicherverzeichnis(Wenn das Verzeichnis nicht vorhanden ist, erstellen Sie ein neues)
FileUtils.mkdir_p(@dirName) unless FileTest.exist?(@dirName)

#Funktion zum Speichern von Bildern von der Bild-URL in den angegebenen Ordner
def save_image(url, num)
  filePath = "#{@dirName}/zuckerberg#{num.to_s}.jpg "
  open(filePath, 'wb') do |output|
    open(url) do |data|
      output.write(data.read)
    end
  end
end

#Suchbegriff
search_word = 'zuckerberg'
#Anzahl der zu speichernden Blätter(Aufgrund der API-Spezifikationen scheinen 150 Blatt gleichzeitig die Grenze zu sein)
count = 150

# Bing Search API(Verwenden Sie den offiziellen Code wie er ist)
# https://dev.cognitive.microsoft.com/docs/services/56b43f0ccf5ff8098cef3808/operations/571fab09dbe2d933e891028f
uri = URI('https://api.cognitive.microsoft.com/bing/v5.0/images/search')
uri.query = URI.encode_www_form({
    'q' => search_word,
    'count' => count
    # 'offset' => 150(Überspringen Sie die Suchergebnisse für die angegebene Nummer)
})
request = Net::HTTP::Post.new(uri.request_uri)
request['Content-Type'] = 'multipart/form-data'
request['Ocp-Apim-Subscription-Key'] = 'Weisen Sie Ihren API-Schlüssel zu' # Fix Me
request.body = "{body}"
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
  http.request(request)
end

#Speichern Sie so viele Suchbilder wie die Anzahl der Suchwörter
count.times do |i|
  begin
    image_url = JSON.parse(response.body)["value"][i]["thumbnailUrl"]
    save_image(image_url, i)
  rescue => e
    puts "image#{i} is error!"
    puts e
  end
end

Ich denke, dass die Bilddaten im angegebenen Verzeichnis wie zuckerberg1.jpg, zuckerberg2.jpg, zuckerberg3.jpg .... gespeichert werden. Es sieht aus wie das. Als nächstes werden nur die Gesichter dieser Bilder extrahiert und ausgeschnitten.

スクリーンショット 2017-04-28 11.34.11.png

2. Extrahieren und schneiden Sie Mr. Zuckerbergs Gesicht aus

Verwenden Sie die Bildverarbeitungsbibliothek OpenCV, um das Gesicht aus den gesammelten Bilddaten auszuschneiden.

Ich habe OpenCV zum ersten Mal verwendet, aber die folgenden Blogs usw. waren für die Einrichtung und Verwendung sehr hilfreich. Danke m (_ _) m

Einrichten einer Entwicklungsumgebung für OpenCV 3 + Python 2/3 unter Mac OS X Gesichtserkennung mit OpenCV (Haar-like Feature Classifier) Grundlagen von Python OpenCV: Ich werde endlich das Gesicht erkennen

Ich denke, es gibt viele andere Dinge, wenn Sie googeln. Dieses Mal werde ich das Verfahren und die detaillierte Verwendung des OpenCV-Setups weglassen. [^ 1]

detected.jpg (Schneiden Sie den vom OpenCV-Klassifikator erkannten Gesichtsteil aus und speichern Sie ihn. OpenCV ist praktisch!)

face_detect.py


# -*- coding:utf-8 -*-

import cv2
import numpy as np

#Verzeichnis mit den zuvor gesammelten Bilddaten
input_data_path = './zuckerberg_images/zuckerberg'
#Verzeichnis zum Speichern des zugeschnittenen Bildes(Bitte erstellen Sie im Voraus ein Verzeichnis)
save_path = './cutted_zuck_images/'
#OpenCV-Standardklassifizierungspfad.(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.Verwenden Sie eine XML-Datei)
cascade_path = './opencv/data/haarcascades/haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascade_path)

#Anzahl der gesammelten Bilder(Optionale Änderung)
image_count = 300
#Anzahl erfolgreicher Gesichtserkennungen(Geben Sie standardmäßig 0 an)
face_detect_count = 0

#Wenn aus den gesammelten Bilddaten ein Gesicht erkannt wird, schneiden Sie es aus und speichern Sie es.
for i in range(image_count):
  img = cv2.imread(input_data_path + str(i) + '.jpg', cv2.IMREAD_COLOR)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  face = faceCascade.detectMultiScale(gray, 1.1, 3)
  if len(face) > 0:
    for rect in face:
      #Umgeben Sie den Gesichtserkennungsteil mit einer roten Linie und speichern Sie(Ich brauche diesen Teil jetzt nicht)
      # cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=1)
      # cv2.imwrite('detected.jpg', img)
      x = rect[0]
      y = rect[1]
      w = rect[2]
      h = rect[3]
      cv2.imwrite(save_path + 'cutted_zuck' + str(face_detect_count) + '.jpg', img[y:y+h, x:x+w])
      face_detect_count = face_detect_count + 1
  else:
    print 'image' + str(i) + ':NoFace'

Ich denke, dass die Bilder mit dem ausgeschnittenen Gesichtsteil in dem hier angegebenen Speicherziel gespeichert werden, wie cutted_zuck1.jpg, cutted_zuck2.jpg, cutted_zuck3.jpg. Übrigens gab es im Fall von Herrn Zuckerberg unerwartet viele Bilder von seiner Frau, und das Gesicht seiner Frau wurde ebenfalls ausgeschnitten und gespeichert, so dass ich es manuell entfernte. (Danach habe ich auch Dinge ausgeschlossen, die als Gesichter erkannt wurden, die aus irgendeinem Grund keine Gesichter waren.)

スクリーンショット 2017-04-28 11.36.29.png

Es ist in Ordnung, wenn es so aussieht! Insgesamt wurden etwa 350 Gesichtsdaten gesammelt. Übrigens ist es ziemlich gruselig, wenn so viele Gesichtsdaten derselben Person gesammelt werden Ich habe auch eine Person geschrieben, die eine Referenz war Vorgänger der Gesichtsidentifikation, aber wenn Sie Gesichtserkennung machen, wählen Sie auf jeden Fall die Person, die Sie mögen. Ich finde es gut w (Übrigens scheint OpenCV schwer zu erkennen zu sein, wenn das Gesicht geneigt ist, und es scheint eine Methode zu geben, um das Bild nach und nach zu drehen, aber aus irgendeinem Grund ist Herr Zuckerberg fast schön, fast das Gesicht Danke Zuckerberg!)

3. Lassen Sie auch Bill Gates und Earon Mask teilnehmen

Arbeiten Sie so weit und bemerken Sie einen grundlegenden Fehler.

** "Wenn nur Zuckerbergs Gesicht verwendet wird, ist es möglicherweise möglich, Zuckerbergs Gesicht zu identifizieren, aber ich frage mich, ob es eine KI geben kann, die" menschliches Gesicht "=" Zuckerberg "identifiziert. Erstens gibt die Identifikation, die ich diesmal durchführen möchte, das Etikett aus, das dem Eingabebild zu entsprechen scheint, und klassifiziert es (später beschrieben), aber es gibt nur einen Etikettentyp und keine Identifikationsoption. Dann sind alle Identifikationsergebnisse Zuckerberg ... "** (Zu Beginn des Umzugs war der Identifikationsmechanismus nicht gut verstanden ... orz)

Also wollte ich es in mindestens drei Labels aufteilen, und Microsoft-Gründer ** Bill Gates ** und SpaceX, Tesla-Gründer, stellten selbstfahrende Autos und Menschen her Ich beschloss, Herrn ** Ilone Mask **, der derzeit aktiv ist und plant, ihn zum Mars zu schicken, am Krieg teilnehmen zu lassen. Ich bin ein spektakuläres Mitglied geworden. (Zuerst habe ich Steve Jobs anstelle von Ilone Mask gewählt, aber Jobs hat aufgegeben, weil das Bild von Mr. Jobs seltsamerweise schwarzweiß ist und daher nicht mit anderen Daten übereinstimmt.)

Es ist also tatsächlich ** "KI, die die Gesichter von Zuckerberg, Billgates und Earon Mask identifiziert" **.

j1f9DiJi.jpeg 0deb01d11e85a203d95db5d8eb4948f0.jpg

Auf die gleiche Weise haben wir auch ungefähr 350 Gesichtsdaten von Mr. Gates und Mr. Musk gesammelt.

スクリーンショット 2017-05-06 15.23.36.png


スクリーンショット 2017-05-07 19.09.46 1.png

Wie immer sind viele Gesichter beängstigend. Ich kann ein bisschen lachen.

4. Organisieren und organisieren Sie Gesichtsbilder

Zur Vorbereitung auf das Training der in TensorFlow gesammelten Daten teilen wir sie zunächst in zwei Teile: ** Trainingsdaten ** zum Trainieren von TensorFlow und ** Verifizierungsdaten ** zum Überprüfen der Genauigkeit des Modells nach dem Training. Zuerst wurden jedem der Verifizierungsdaten 100 Blätter zugewiesen, und der Rest wurde für Trainingsdaten verwendet. Es gibt jetzt ungefähr 300 Verifizierungsdaten und 700 Lerndaten.

Diese Lerngesichtsdaten und Verifizierungsgesichtsdaten sind in der folgenden Verzeichnisstruktur zusammengefasst.

/data
  /train
    /zuckerbuerg
    /elonmusk
    /billgates
  /test
    /zuckerbuerg
    /elonmusk
    /billgates

Ich möchte die Pfade der Gesichtsbilddateien zum Lernen und Überprüfen in einer Textdatei kombinieren, damit diese organisierten Gesichtsbilddaten sofort als Eingabedaten für TensowFlow gelesen werden können. Bringen Sie zu diesem Zeitpunkt auch ein Etikett an, das angibt, wem jedes Bild das Gesicht entspricht. Dieses Mal habe ich das Label "Zuckerberg: 0 Eron Mask: 1 Bill Gates: 2" verwendet.

data.txt


./data/train/zuckerberg/cutted_zuck0.jpg 0
./data/train/zuckerberg/cutted_zuck1.jpg 0
./data/train/zuckerberg/cutted_zuck10.jpg 0
~Kürzung~
./data/train/elonmusk/cutted_elon0.jpg 1
./data/train/elonmusk/cutted_elon1.jpg 1
./data/train/elonmusk/cutted_elon10.jpg 1
~Kürzung~
./data/train/billgates/cutted_gates0.jpg 2
./data/train/billgates/cutted_gates10.jpg 2
./data/train/billgates/cutted_gates100.jpg 2

Ein einfaches Skript, das eine Textdatei ausgibt. (Es tut mir wieder leid für Ruby. Ruby wird nicht mehr herauskommen.)

generate_csv.rb


require 'fileutils'

train_data_path = "./data/train/data.txt"
test_data_path = "./data/test/data.txt"

FileUtils.touch(train_data_path) unless FileTest.exist?(train_data_path)
FileUtils.touch(test_data_path) unless FileTest.exist?(test_data_path)


test_zuck_data_paths = Dir.glob("./data/test/zuckerberg/*.jpg ")
test_elon_data_paths = Dir.glob("./data/test/elonmusk/*.jpg ")
test_gates_data_paths = Dir.glob("./data/test/billgates/*.jpg ")
train_zuck_data_paths = Dir.glob("./data/train/zuckerberg/*.jpg ")
train_elon_data_paths = Dir.glob("./data/train/elonmusk/*.jpg ")
train_gates_data_paths = Dir.glob("./data/train/billgates/*.jpg ")


File.open(test_data_path, "w") do |f|
  test_zuck_data_paths.each { |path| f.puts("#{path} 0") }
  test_elon_data_paths.each { |path| f.puts("#{path} 1") }
  test_gates_data_paths.each { |path| f.puts("#{path} 2") }
end
File.open(train_data_path, "w") do |f|
  train_zuck_data_paths.each { |path| f.puts("#{path} 0") }
  train_elon_data_paths.each { |path| f.puts("#{path} 1") }
  train_gates_data_paths.each { |path| f.puts("#{path} 2") }
end

Beim Sammeln von Daten haben Sie möglicherweise bemerkt, dass es gruselig ist, dass es nur eine große Anzahl menschlicher Gesichter gibt. Wenn die Bilddaten fertig sind, ist es endlich Zeit, mit TensorFlow zu lernen!

Fortsetzung und Bonus

Klicken Sie hier für den zweiten Teil der Fortsetzung: Erstellen einer KI, die Zuckerbergs Gesicht durch tiefes Lernen identifiziert ② (KI-Modellkonstruktion)


** "Erstelle eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert" <Vollständiger Artikel> ** Teil 1: Erstellen einer KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert ① (Vorbereitung von Lerndaten) Teil 2: Erstellen einer KI, die Zuckerbergs Gesicht durch tiefes Lernen identifiziert ② (KI-Modellbau) Teil 3: Erstellen einer KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert ③ (Datenlernen) Teil 4: KI erstellen, die Zuckerbergs Gesicht durch tiefes Lernen identifiziert ④ (WEB-Konstruktion)

GitHub:https://github.com/AkiyoshiOkano/zuckerberg-detect-ai


Bonusbilder, die ich mit der erstellten KI ausprobiert habe. Ich war überrascht, dass es genauer trifft als ich erwartet hatte.

① Wenn Sie nach vorne schauen, wird auch bei leichtem Winkel beurteilt. スクリーンショット 2017-05-08 12.23.17.png


(2) Auch wenn das Gesicht unerwartet klein ist, wird es richtig beurteilt. スクリーンショット 2017-05-07 12.40.59.png


③ Sie können auch Mr. Takahashi identifizieren, einen Entertainer, der Zuckerberg ähnelt. スクリーンショット 2017-05-16 9.55.15.png

[^ 1]: Zu meiner Zeit bekam ich den Fehler `` `ImportError: Kein Modul namens cv2```. Ich habe vergessen, auf welchen Artikel ich mich bezog, aber ich habe den Fehler gegoogelt und behoben

Recommended Posts

Erstellen Sie eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert ① (Vorbereitung von Lerndaten)
Erstellen Sie eine KI, die Zuckerbergs Gesicht mit Deep Learning identifiziert (KI-Modellbau)
Erstellen Sie eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert WE (WEB-Konstruktion)
Erstellen Sie eine KI, die Zuckerbergs Gesicht mit tiefem Lernen identifiziert learning (Datenlernen)
Erstes tiefes Lernen ~ Vorbereitung ~
[AI] Deep Metric Learning
Ich habe versucht, Othello AI zu machen, dass ich 7,2 Millionen Hände durch tiefes Lernen mit Chainer gelernt habe
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt