Lorsque je collectais des images faciales pour l'apprentissage automatique, je me suis dit: "Cette astuce n'est-elle pas un seul article?"
L'une des choses que vous avez tendance à faire au début de l'apprentissage automatique est de vous faire savoir si vous êtes une personne spécifique. Pour ce faire, nous souhaitons collecter de nombreuses images de cette personne en tant que données d'enseignants. Il semble que de nombreux sites recherchés et collectés soient collectés à l'aide d'un robot d'exploration, mais vous pouvez également collecter des images faciales en suivant les étapes ci-dessous. Par exemple, supposons que vous souhaitiez collecter beaucoup d'images de Manatsu Akimoto.
L'une des choses que vous avez tendance à faire au début de l'apprentissage d'opportunités est de vous laisser juger si vous êtes une personne en particulier. Vous voudrez peut-être collecter beaucoup d'images faciales autres que la bonne réponse en tant qu'images incorrectes. Il semble que de nombreux sites recherchés et collectés soient collectés à l'aide d'un robot d'exploration, mais vous pouvez également collecter des images faciales en suivant les étapes ci-dessous.
Le chemin écrit dans la variable cascade_path sera probablement différent selon l'environnement, alors recherchez-le. Vous devez avoir OpenCV et python installés à l'avance.
import cv2
import glob
import sys
import os
import imghdr
import datetime
import time
def main(srcdir, destdir, cascade_path='/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml'):
winname = 'searching..'
cv2.namedWindow(winname, cv2.WINDOW_AUTOSIZE)
if not os.path.exists(destdir):
os.mkdir(destdir)
lastsaved = datetime.datetime.now()
prefix = lastsaved.strftime('%Y%m%d-%H%M%S_')
counter = 0
cascade = cv2.CascadeClassifier(cascade_path)
for filename in glob.glob(srcdir + "/*"):
if os.path.isdir(filename):
continue
if imghdr.what(filename) == None:
continue
print("load " + filename)
img = cv2.imread(filename)
frect = cascade.detectMultiScale(img, minSize=(64, 64))
pos = []
if len(frect) > 0:
for r in frect:
x, y, w, h = r[0], r[1], r[2], r[3]
face = img[y:y+h, x:x+w]
if len(face) != 0:
if w > 0 and h > 0:
filename = destdir + "/" + prefix + str(counter) + ".jpg "
cv2.imwrite(filename, face)
print("save " + filename)
counter += 1
pos.append(r)
for p in pos:
cv2.rectangle(img, (p[0],p[1]),(p[0]+p[2],p[1]+p[3]),(0,0,255), 8)
if len(pos) > 0:
cv2.imshow(winname, img)
cv2.waitKey(1)
cv2.destroyWindow(winname)
if __name__ == '__main__':
main(sys.argv[1], sys.argv[2])
Si vous nommez cette img2face.py, par exemple
python ./img2face.py ./imgs ./face
Cela fonctionne comme ça. Si vous placez le fichier image que vous avez collecté précédemment sous ./imgs et que vous l'exécutez, l'image avec la partie de face découpée sera sortie sous ./face.
La préparation préalable est gênante pour l'apprentissage automatique. J'aimerais que tout le monde publie de plus en plus de méthodes pour faciliter les choses.
Recommended Posts