[PYTHON] Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ① (Préparation des données d'apprentissage)

⓪ Présentation

J'ai toujours voulu essayer l'IA à la mode et l'apprentissage en profondeur, j'ai donc décidé d'étudier à partir des connaissances préalables de l'apprentissage automatique (apprentissage en profondeur) à partir de 0 en tant qu'étude gratuite de GW en mai 2017 dans l'esprit de Miha. .. Cliquez ici pour voir des exemples de vidéos de ce que vous avez réellement fait (http://akikiyo.com/zuck-detect-ai). Le code final est ici.

[Fait]

Trois visages de l'entrepreneur magnat de la Silicon Valley ** Mark Zuckerberg (Facebook) **, ** Bill Gates (Microsoft) **, ** Earon Musk (SpaceX, Tesla) ** AI à identifier. (Actuellement, cela n'a pas encore été téléchargé sur le net. Je voudrais le télécharger quand j'en aurai le temps * En mai 2017)


zuck3.png


zgif2.gif


[Profil de l'auteur (@AKIKIKIKIKIKIK)]

Aucune connaissance préalable pour l'analyse des données ou l'apprentissage automatique. La plupart des programmes sont autodidactiques. J'aime créer des applications WEB avec Rails.

[Références mentionnées dans l'apprentissage automatique et l'apprentissage en profondeur]

Je pense que c'est mal de ne rien savoir sur l'apprentissage automatique lors de l'apprentissage en profondeur, alors regardez d'abord diverses informations sur le Web pour savoir ce que vous pouvez et ne pouvez pas faire. (Je lis généralement les informations sur le WEB qui apparaissent dans "Tensor Flow" et "Deep Learning". Après cela, j'ai recherché "Qu'est-ce qu'un réseau neuronal?")

J'y ai surtout fait référence. Reconnaissance faciale des membres Momokuro par TensorFlow [Identifiez la société de production d'anime Yuruyuri avec TensorFlow] (http://kivantium.hateblo.jp/entry/2015/11/18/233834)

C'est un article de deux personnes. J'ai été si utile que je n'aurais pas pu atteindre celui qui fonctionnait réellement sans cet article. Merci beaucoup m (_ _) m

[Bibliothèque d'apprentissage automatique à utiliser]

Il existe différentes bibliothèques d'apprentissage automatique, mais cette fois, j'ai décidé de me concentrer sur TensorFlow, la bibliothèque d'apprentissage automatique de Google. La raison en est la suivante.

・ Parce qu'il s'agit d'une bibliothèque Google, la communauté est en plein essor et cela semble être passionnant à l'avenir ・ On dit qu'il est également utilisé dans le topique Go AI Alpha Go etc. ・ De nombreuses fonctions pratiques permettent aux débutants de faire l'expérience de «l'apprentissage automatique» ・ La seule bibliothèque d'apprentissage automatique que je connaissais avant de travailler sur cette fois

Je l'ai choisi pour une raison quelconque. Pour être honnête, je ne l'ai pas comparé trop profondément avec d'autres bibliothèques d'apprentissage automatique. Il y a peut-être quelque chose de plus facile à utiliser. Dans cet article, la procédure de configuration de TensorFlow, etc. est écrite dans de nombreux autres articles, je vais donc omettre la description ici.

[Déterminez quoi faire avec TensorFlow]

J'ai choisi "Implémentation de la fonction d'identification de visage dans TensorFlow", qui a été réalisée par un nombre relativement important de personnes et qui me semblait être juste. Les ancêtres passés sont Momokuro, [Osomatsu-san](http://bohemia.hatenablog.com/entry/2015/11 / 22/161858), Yuruyuri, etc., et la cible pour reconnaître le visage est votre personnage ou personne préféré J'ai décidé de sélectionner "Mark Zuckerberg", le fondateur de Facebook, qui est ma personne préférée. (Du point de vue de faciliter la collecte d'images faciales)

[En fait, essayez]

La procédure sur laquelle j'ai travaillé est décrite ci-dessous. Cette fois-ci, plutôt que de «comprendre et maîtriser TensorFlow», nous avons procédé avec «l'expérience d'apprentissage en profondeur» à l'esprit. La maîtrise de TensorFlow prend plus de temps. .. ..

① Collecte et préparation des données faciales pour l'apprentissage

スクリーンショット 2017-04-28 11.36.29.png (Tout d'abord, le déroulement jusqu'à la préparation de ces données de visage légèrement effrayantes de M. Zuckerberg)

1. Recueillir des images de M. Zuckerberg

Utilisez l'API du moteur de recherche de MicroSoft Bing pour explorer les données d'image au moment de la recherche avec le mot ** «zuckerberg» ** et les enregistrer sur votre PC. [L'histoire de la transition de l'API Bing Search v2 vers la 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) (Pour plus de détails sur l'utilisation de l'API de recherche d'images de Bing, veuillez vous reporter ici. Merci. Cette fois, j'utilise python de base, mais comme je suis bon en ruby, j'écris en ruby là où python n'est pas nécessaire. )

image_crawler.rb


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

#Répertoire de destination
@dirName = "./zuckerberg_image/"
#Créer un répertoire de stockage(Si le répertoire n'existe pas, créez-en un nouveau)
FileUtils.mkdir_p(@dirName) unless FileTest.exist?(@dirName)

#Fonction pour enregistrer les images de l'URL de l'image dans le dossier spécifié
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

#Rechercher un mot
search_word = 'zuckerberg'
#Nombre de feuilles à enregistrer(En raison des spécifications de l'API, 150 feuilles semblent être la limite à la fois)
count = 150

# Bing Search API(Utilisez le code officiel tel quel)
# 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(Ignorer les résultats de la recherche pour le numéro spécifié)
})
request = Net::HTTP::Post.new(uri.request_uri)
request['Content-Type'] = 'multipart/form-data'
request['Ocp-Apim-Subscription-Key'] = 'Attribuez votre clé API' # Fix Me
request.body = "{body}"
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
  http.request(request)
end

#Enregistrez autant d'images de recherche que le nombre de mots de recherche
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

Je pense que les données d'image sont enregistrées dans le répertoire spécifié comme zuckerberg1.jpg, zuckerberg2.jpg, zuckerberg3.jpg .... Ça ressemble à ça. Ensuite, seuls les visages de ces images sont extraits et découpés.

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

2. Extraire et découper le visage de M. Zuckerberg

Utilisez la bibliothèque de traitement d'image OpenCV pour découper le visage des données d'image collectées.

J'ai utilisé OpenCV pour la première fois, mais les blogs suivants, etc. ont été très utiles pour la configuration et l'utilisation. Merci m (_ _) m

Comment configurer un environnement de développement pour OpenCV 3 + Python 2/3 sur Mac OS X Reconnaissance faciale à l'aide d'OpenCV (classificateur d'entités de type Haar) Bases de Python OpenCV: je vais enfin détecter le visage

Je pense qu'il y a beaucoup d'autres choses si vous google. Cette fois, je vais omettre la procédure et l'utilisation détaillée de la configuration d'OpenCV. [^ 1]

detected.jpg (Découpez et enregistrez la partie du visage détectée par le classificateur OpenCV. OpenCV est pratique!)

face_detect.py


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

import cv2
import numpy as np

#Répertoire avec les données d'image collectées précédemment
input_data_path = './zuckerberg_images/zuckerberg'
#Répertoire dans lequel l'image recadrée est enregistrée(Veuillez créer un annuaire à l'avance)
save_path = './cutted_zuck_images/'
#Chemin du classificateur par défaut OpenCV.(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.Utiliser un fichier xml)
cascade_path = './opencv/data/haarcascades/haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascade_path)

#Nombre d'images collectées(Changement facultatif)
image_count = 300
#Nombre de détections de visage réussies(Spécifiez 0 par défaut)
face_detect_count = 0

#Lorsqu'un visage est détecté à partir des données d'image collectées, coupez-le et enregistrez-le.
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:
      #Entourez la partie de reconnaissance faciale d'une ligne rouge et enregistrez(Je n'ai pas besoin de cette partie maintenant)
      # 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'

Je pense que les images avec la partie de visage découpée sont enregistrées dans la destination de sauvegarde spécifiée par ceci, comme cutted_zuck1.jpg, cutted_zuck2.jpg, cutted_zuck3.jpg. À propos, dans le cas de l'image de M. Zuckerberg, il y avait de manière inattendue de nombreuses photos de sa femme, et le visage de sa femme a également été découpé et sauvegardé, alors je l'ai retiré manuellement. (Après cela, j'ai également exclu les choses qui étaient reconnues comme des visages pour une raison quelconque.)

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

Ce n'est pas grave si ça ressemble à ça! Au total, environ 350 données sur le visage ont été collectées. À propos, il est assez effrayant de collecter autant de données sur le visage de la même personne J'ai également écrit une personne qui était une référence prédécesseur de l'identification du visage, mais lors de la reconnaissance faciale, choisissez définitivement la personne que vous aimez. Je pense que c'est bon w (À propos, OpenCV semble être difficile à détecter lorsque le visage est incliné, et il semble y avoir une méthode pour détecter tout en faisant tourner l'image petit à petit, mais pour une raison quelconque, M. Zuckerberg est presque beau, presque le visage Merci Zuckerberg!)

3. Faites participer Bill Gates et Earon Mask

Travaillez jusqu'à présent et remarquez une erreur fondamentale.

** "Si seul le visage de Zuckerberg est utilisé, il est peut-être possible d'identifier le visage de Zuckerberg, mais je me demande s'il peut y avoir une IA qui identifie" visage humain "=" Zuckerberg ". En premier lieu, l'identification que je veux faire cette fois sort l'étiquette qui semble correspondre à l'image d'entrée et la classe (décrite plus loin), mais il n'y a qu'un seul type d'étiquette et il n'y a pas d'option d'identification. Ensuite, tous les résultats d'identification seront Zuckerberg ... "** (Au début du déménagement, le mécanisme d'identification n'était pas bien compris ... orz)

Donc, je voulais le diviser en au moins trois étiquettes, et le fondateur de Microsoft ** Bill Gates ** et SpaceX, fondateur de Tesla ont créé des voitures autonomes et des êtres humains. J'ai décidé de faire participer M. ** Ilone Mask **, qui est actuellement actif et envisage de l'envoyer sur Mars, de participer à la guerre. Je suis devenu un membre spectaculaire. (Au début, j'ai choisi Steve Jobs au lieu d'Ilone Mask, mais Jobs a abandonné parce que l'image de M. Jobs est étrangement en noir et blanc, elle semble donc incompatible avec d'autres données.)

Donc, c'est en fait ** "AI qui identifie les visages de Zuckerberg, Billgates et Earon Mask" **.

j1f9DiJi.jpeg 0deb01d11e85a203d95db5d8eb4948f0.jpg

Nous avons également recueilli environ 350 données faciales de M. Gates et de M. Musk exactement de la même manière.

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


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

Comme d'habitude, beaucoup de visages font peur. Je peux rire un peu.

4. Organisez et organisez les images du visage

Pour préparer l'apprentissage des données collectées dans TensorFlow, nous les divisons d'abord en deux parties: ** données d'entraînement ** pour entraîner TensorFlow et ** données de vérification ** pour vérifier l'exactitude du modèle après l'entraînement. Premièrement, 100 feuilles ont été attribuées à chacune des données de vérification, et le reste a été utilisé pour les données de formation. Il existe désormais environ 300 données de vérification et 700 données d'apprentissage.

Ces données de visage d'apprentissage et les données de visage de vérification sont résumées dans la structure de répertoires suivante.

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

Je souhaite combiner les chemins des fichiers d'image de visage pour l'apprentissage et la vérification dans un fichier texte afin que ces données d'image de visage organisées puissent être lues à la fois en tant que données d'entrée dans TensowFlow. À ce stade, attachez également une étiquette indiquant à quel visage correspond chaque image. Cette fois, j'ai utilisé l'étiquette Zuckerberg: 0 Eron Mask: 1 Bill Gates: 2` ``.

data.txt


./data/train/zuckerberg/cutted_zuck0.jpg 0
./data/train/zuckerberg/cutted_zuck1.jpg 0
./data/train/zuckerberg/cutted_zuck10.jpg 0
~réduction~
./data/train/elonmusk/cutted_elon0.jpg 1
./data/train/elonmusk/cutted_elon1.jpg 1
./data/train/elonmusk/cutted_elon10.jpg 1
~réduction~
./data/train/billgates/cutted_gates0.jpg 2
./data/train/billgates/cutted_gates10.jpg 2
./data/train/billgates/cutted_gates100.jpg 2

Un script simple qui génère un fichier texte. (Je suis à nouveau désolé pour ruby .. ruby ne sortira plus.)

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

Au stade de la collecte de données, vous avez peut-être remarqué qu'il est effrayant qu'il n'y ait qu'un grand nombre de visages humains. Lorsque les données d'image sont prêtes, il est enfin temps de commencer à apprendre avec TensorFlow!

Continuation et bonus

Cliquez ici pour la deuxième partie de la suite: Créer une IA qui identifie le visage de Zuckerberg par apprentissage profond ② (construction de modèles d'IA)


** "Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur"

** Partie 1: Créer une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ① (Préparation des données d'apprentissage) Partie 2: Créer une IA qui identifie le visage de Zuckerberg par apprentissage en profondeur ② (Construction de modèles d'IA) Partie 3: Créer une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ③ (Apprentissage des données) Partie 4: Créer une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ④ (Construction WEB)

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


Images bonus que j'ai essayées avec l'IA créée. J'ai été surpris qu'il frappe avec plus de précision que ce à quoi je m'attendais.

① Si vous êtes face à l'avant, il jugera même s'il y a un léger angle. スクリーンショット 2017-05-08 12.23.17.png


(2) Même si le visage est étonnamment petit, il sera jugé correctement. スクリーンショット 2017-05-07 12.40.59.png


③ Vous pouvez également identifier M. Takahashi, un artiste qui ressemble à Zuckerberg. スクリーンショット 2017-05-16 9.55.15.png

[^ 1]: À mon époque, j'ai eu une erreur de Erreur d'importation: aucun module nommé cv2. J'ai oublié l'article auquel je faisais référence, mais j'ai recherché l'erreur sur Google et l'ai résolue

Recommended Posts

Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ① (Préparation des données d'apprentissage)
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ② (construction de modèles d'IA)
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ④ (construction WEB)
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ③ (Apprentissage des données)
Premier apprentissage profond ~ Préparation ~
[AI] Apprentissage métrique profond
J'ai essayé de faire d'Othello AI que j'ai appris 7,2 millions de mains par apprentissage profond avec Chainer
Créez un environnement pour "Deep Learning from scratch" avec Docker
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate