
Raspberry Pi – Reconnaissance faciale
Tout d’abord! cette semaine, je serai au VMworld de Barcelone avec un petit groupe de blogueurs et de cracks, Tous ceux qui veulent partager de bons moments devraient m’envoyer un mail et vous y voir! Puits, au nougat, Je vous laisse ce document avec les étapes suivies pour obtenir un Raspberry Pi avec une caméra USB connectée, Reconnaître les visages!
Nous devrons installer OpenCV et ensuite, grâce à l’utilisation d’un script, nous apprendrons les visages qui nous intéressent, Je vais lui montrer le mien et celui de mon txabala. Avec un autre script, nous lancerons la fonction de reconnaissance et lorsqu’il détectera mon visage, il exécutera un script et un autre lorsqu’il reconnaîtra le txabala.
La première chose à faire sera d’installer les prérequis OpenCV ou tout autre dont nous pourrions avoir besoin:
[Langue du code source=”Plaine”]sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig unzip vim
sudo apt-get install python-numpy python-opencv
Sudo apt-get install python-pip
sudo apt-get install python-dev
sudo pip install picamera
sudo pip install rpio
sudo apt-get install v4l2ucp v4l-utils libv4l-dev[/Code source]
Nos descargamos OpenCV, lo compilamos y lo instalamos:
[Langue du code source=”Plaine”]wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
Décompressez opencv-2.4.9.zip
CD OpenCV-2.4.9
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF
faire
sudo make install[/Code source]
Pas mal, Para el reconocimiento facial, nos descargaremos primeramente una pequeña BD de caras, pour qu’il ait une meilleure précision et auquel on ajoutera notre visage ou ceux qui nous intéressent a posteriori. Nous téléchargeons l’exemple de base de données de la base de données AT des visages&T Laboratories Cambridge, Auparavant, nous créons le dossier où nous allons mettre tout notre contenu et le décompresser:
[Langue du code source=”Plaine”]mkdir /accueil/pi/recoFacial
cd /accueil/pi/recoFacial
wget http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
Décompressez att_faces.zip[/Code source]
Nous téléchargeons maintenant ce XML et le décompressons dans /home/pi/recoFacial/:
[Langue du code source=”Plaine”]wget http://www.bujarra.com/wp-content/uploads/2016/08/haarcascade_frontalface_alt.zip
Décompressez haarcascade_frontalface_alt.zip[/Code source]
À la fin du document, Je vous laisse quelques fichiers python, L’une d’entre elles sera d’apprendre les visages (capture.py) et l’autre de les reconnaître (reconocimiento.py), Vous devrez les rendre exécutables:
[Langue du code source=”Plaine”]chmod +x reconocimiento.py capture.py[/Code source]
Et une recommandation, Il s’agirait d’augmenter le nombre d’images qu’il capte pour reconnaître notre visage lorsqu’il l’apprend, Dans un tel cas, en capture.py, Au lieu de 20 Images par défaut, on peut mettre par exemple 100.
Pour apprendre un visage, nous allons courir:
[Langue du code source=”Plaine”]python capture.py nomPersonne[/Code source]
Pour commencer à détecter et à reconnaître les visages:
[Langue du code source=”Plaine”]Python reconocimiento.py[/Code source]
capture.py
[Langue du code source=”Plaine”]
Importer CV2, sys, Numpy, vous
taille = 4
fn_haar = 'haarcascade_frontalface_alt.xml’
fn_dir = 'att_faces/orl_faces’
fn_name = sys.argv[1]
path = os.path.join(fn_dir, fn_name)
si ce n’est pas os.path.isdir(Chemin):
os.mkdir(Chemin)
(im_width, im_height) = (112, 92)
haar_cascade = cv2. Classificateur en cascade(fn_haar)
Webcam = CV2. Capture vidéo(0)
compter = 0
pendant le compte > 100:
(rval, Im) = webcam.read()
im = cv2.flip(Im, 1, 0)
gris = cv2.cvtColor(Im, CV2. COLOR_BGR2GRAY)
mini = cv2.resize(gris, (gris.forme[1] / taille, gris.forme[0] / taille))
faces = haar_cascade.detectMultiScale(mini)
Visages = Triés(Visages, clé=lambda x: x[3])
si les visages:
face_i = visages[0]
(x, et, w, h) = [v * Taille pour V dans face_i]
visage = gris[et:et + h, x:x + w]
face_resize = cv2.resize(visage, (im_width, im_height))
pin=trié([Int(n[:n.trouver(‘.’)]) pour n dans os.listdir(Chemin)
si n[0]!=’.’ ]+[0])[-1] + 1
cv2.imwrite('%s/%s.png’ % (Chemin, épingler), face_resize)
cv2.rectangle(Im, (x, et), (x + w, et + h), (0, 255, 0), 3)
cv2.putText(Im, fn_name, (x – 10, et – 10), CV2. FONT_HERSHEY_PLAIN,
1,(0, 255, 0))
compter += 1
cv2.imafficher(« OpenCV », Im)
clé = cv2.waitKey(10)
if clé == 27:
casser
[/Code source]
reconocimiento.py
[Langue du code source=”Plaine”]
Importer CV2, sys, Numpy, vous
taille = 4
fn_haar = 'haarcascade_frontalface_alt.xml’
fn_dir = 'att_faces/orl_faces’
# Partie 1: Creando fisherRecognizer
imprimer(« Formando…’)
# Crear una lista de imagenes y una lista de nombres correspondientes
(Images, ÉTIQUETTES, prénoms, Id) = ([], [], {}, 0)
pour (sous-répertoires, réals, Fichiers) Dans os.walk(fn_dir):
pour subdir dans dirs:
prénoms[Id] = sous-répertoire
subjectpath = os.path.join(fn_dir, subdir)
pour le nom de fichier dans os.listdir(SujetChemin):
path = chemin-sujet + ‘/’ + Fichier
lable = id
images.append(cv2.imlire(Chemin, 0))
lables.append(Int(lable))
id += 1
(im_width, im_height) = (112, 92)
# Crear una matriz Numpy de las dos listas anteriores
(Images, ÉTIQUETTES) = [numpy.array(lis) pour les lis en [Images, ÉTIQUETTES]]
# OpenCV entrena un modelo à partir de las imagenes
model = cv2.createFisherFaceRecognizer()
modèle.train(Images, ÉTIQUETTES)
# Partie 2: Utilisation de fisherRecognizer dans l’exécution de la caméra
haar_cascade = cv2. Classificateur en cascade(fn_haar)
Webcam = CV2. Capture vidéo(0)
tandis que True:
(rval, cadre) = webcam.read()
cadre=cv2.flip(cadre,1,0)
gris = cv2.cvtColor(cadre, CV2. COLOR_BGR2GRAY)
mini = cv2.resize(gris, (gris.forme[1] / taille, gris.forme[0] / taille))
faces = haar_cascade.detectMultiScale(mini)
Pour moi dans la gamme(Len(Visages)):
face_i = visages[Je]
(x, et, w, h) = [v * Taille pour V dans face_i]
visage = gris[et:et + h, x:x + w]
face_resize = cv2.resize(visage, (im_width, im_height))
# Essayer de reconnaître le visage
prédiction = model.predict(face_resize)
cv2.rectangle(cadre, (x, et), (x + w, et + h), (0, 255, 0), 3)
# Saisie du nom du visage reconnu
# [1]
si la prédiction[1]>500:
cv2.putText(cadre,
'%s – %.0f’ % (prénoms[prédiction[0]],prédiction[1]),
(X-10, Y-10), CV2. FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#La variable face aura le nom de la personne reconnue
Têtes = '%s’ % (prénoms[prédiction[0]])
#Dans le cas où le visage est celui d’Hector
if face == « HECTOR »:
os.system(« /accueil/pi/hector.sh »)
#Dans le cas où le visage est celui de Seila
elif cara == « SEILA »:
os.system(« /accueil/pi/seila.sh »)
#Si le visage n’est pas familier, Mettre inconnu
autre:
cv2.putText(cadre,
'Inconnu',
(X-10, Y-10), CV2. FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#Il n’y a personne
s.système(« /accueil/pi/nadie.sh »)
cv2.imafficher(« OpenCV », cadre)
clé = cv2.waitKey(10)
if clé == 27:
casser
[/Code source]