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.
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)
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.
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
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.
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)
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. .. ..
(Tout d'abord, le déroulement jusqu'à la préparation de ces données de visage légèrement effrayantes 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.
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]
(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.)
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!)
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" **.
Nous avons également recueilli environ 350 données faciales de M. Gates et de M. Musk exactement de la même manière.
Comme d'habitude, beaucoup de visages font peur. Je peux rire un peu.
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!
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"
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.
(2) Même si le visage est étonnamment petit, il sera jugé correctement.
③ Vous pouvez également identifier M. Takahashi, un artiste qui ressemble à Zuckerberg.
[^ 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