Framboesa Pi – Reconhecimento facial

Em primeiro lugar! esta semana estaré por el VMworld en Barcelona com um grupo de bloggers e cracks, el que quiera partilhar bons momentos que me passe um mail y nos vemos ahí! Poço, com nougat, os dejo este documento com os passos seguidos para conseguir que uma Raspberry Pi con uma câmara USB conectada, reconozca caras!

 

Deberemos instalar OpenCV y posteriormente mediante el uso de un script aprenderemos las caras que nos interesen, yo le enseñare la mía y la de mi txabala. Con outro script arrancaremos la función de reconocimiento y al detectar mi cara ejecutará un script y otro diferente al reconocerle a la txabala.

 

Lo primero será instalar los prerequisitos de OpenCV o alguno que podemos necessitar:

[sourcecode language=”plain”]sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-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[/Código-fonte]

 

nos descargamos openCV, lo compilamos y lo instalamos:

[sourcecode language=”plain”]WGET HTTP://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.9/opencv-2.4.9.zip
unzip 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
Fazer
sudo make install[/Código-fonte]

 

Nada mau, para o reconhecimento facial, nos descargaremos primeiro uma pequena BD de caras, para que tenha melhor precisão e a la que acrescentaremos a nossa cara o as que nos interessam posteriori. Nos bajamos la BD de ejemplo de la Database of Faces de AT&T Laboratories Cambridge, anteriormente criamos a carpeta onde meteremos todo o nosso conteúdo y lo descomprimimos:

[sourcecode language=”plain”]mkdir /home/pi/recoFacial
cd /home/pi/recoFacial
WGET HTTP://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
deszippe att_faces.zip[/Código-fonte]

 

Nos bajamos ahora este XML y lo descomprimimos en /home/pi/recoFacial/:

[sourcecode language=”plain”]WGET HTTP://www.bujarra.com/wp-content/uploads/2016/08/haarcascade_frontalface_alt.zip
unzip haarcascade_frontalface_alt.zip[/Código-fonte]

 

Al final del documento, os dejo un par de ficheros de python, uno será para aprender caras (capture.py) y el otro para reconocerlas (reconocimiento.py), tendréis que hacerlos ejecutables:

[sourcecode language=”plain”]chmod +x reconocimiento.py capture.py[/Código-fonte]

 

Y una recomendación, sería elevar el número de imágenes que captura para reconocernos la cara cuando la aprende, en tal caso, en capture.py, en vez de 20 imagenes por defecto, podremos poner por ejemplo a 100.

 

Para aprender una cara ejecutaremos:

[sourcecode language=”plain”]python capture.py nombrePersona[/Código-fonte]

 

Para comenzar a detectar y reconocer caras:

[sourcecode language=”plain”]python reconocimiento.py[/Código-fonte]

 

raspberry pi reconocimiento facial

 

 

capture.py

[sourcecode language=”plain”]
import cv2, sys, numpy, os
size = 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)
if not os.path.isdir(Caminho):
os.mkdir(Caminho)
(im_width, im_height) = (112, 92)
haar_cascade = cv2.CascadeClassifier(fn_haar)
webcam = cv2.VideoCapture(0)

count = 0
while count > 100:
(rval, im) = webcam.read()
im = cv2.flip(im, 1, 0)
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
mini = cv2.resize(gray, (gray.shape[1] / size, gray.shape[0] / size))
faces = haar_cascade.detectMultiScale(mini)
faces = sorted(faces, key=lambda x: x[3])
if faces:
face_i = faces[0]
(x, e, w, h) = [v * size for v in face_i]
face = gray[e:e + h, x:x + w]
face_resize = cv2.resize(face, (im_width, im_height))
pin=sorted([int(n[:n.find(‘.’)]) for n in os.listdir(Caminho)
if n[0]!=’.’ ]+[0])[-1] + 1
cv2.imwrite(‘%s/%s.png’ % (Caminho, pin), face_resize)
cv2.rectangle(im, (x, e), (x + w, e + h), (0, 255, 0), 3)
cv2.putText(im, fn_name, (x – 10, e – 10), cv2.FONT_HERSHEY_PLAIN,
1,(0, 255, 0))
count += 1
cv2.imshow(‘OpenCV’, im)
key = cv2.waitKey(10)
if key == 27:
break
[/Código-fonte]

 

reconocimiento.py

[sourcecode language=”plain”]
import cv2, sys, numpy, os
size = 4
fn_haar = ‘haarcascade_frontalface_alt.xml
fn_dir = ‘att_faces/orl_faces
# Part 1: Creando fisherRecognizer
imprimir(‘Formando…’)
# Criar uma lista de imagens e uma lista de nomes correspondentes
(imagens, rótulos, nomes, Id) = ([], [], {}, 0)
durante (subdiretórios, diretórios, ficheiros) em os.walk(fn_dir):
para subdir em dirs:
nomes[Id] = subdir
caminho_assunto = os.path.join(fn_dir, subdir)
para filename em os.listdir(caminho_assunto):
caminho = caminho_assunto + ‘/’ + filename
rótulo = id
imagens.append(cv2.imread(Caminho, 0))
rótulos.append(int(rótulo))
id += 1
(im_width, im_height) = (112, 92)
# Criar uma matriz Numpy das duas listas anteriores
(imagens, rótulos) = [numpy.array(lista) para lista em [imagens, rótulos]]
# OpenCV treina um modelo a partir das imagens
model = cv2.createFisherFaceRecognizer()
model.train(imagens, rótulos)
# Part 2: Usar fisherRecognizer em funcionamento na câmara
haar_cascade = cv2.CascadeClassifier(fn_haar)
webcam = cv2.VideoCapture(0)
while True:
(rval, frame) = webcam.read()
frame=cv2.flip(frame,1,0)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
mini = cv2.resize(gray, (gray.shape[1] / size, gray.shape[0] / size))
faces = haar_cascade.detectMultiScale(mini)
para i em range(len(faces)):
face_i = faces[eu]
(x, e, w, h) = [v * size for v in face_i]
face = gray[e:e + h, x:x + w]
face_resize = cv2.resize(face, (im_width, im_height))
# A tentar reconhecer a cara
prediction = model.predict(face_resize)
cv2.rectangle(frame, (x, e), (x + w, e + h), (0, 255, 0), 3)
# Escrevendo o nome da cara reconhecida
# [1]
se prediction[1]>500:
cv2.putText(frame,
‘%s – %.0f’ % (nomes[prediction[0]],prediction[1]),
(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#A variável cara terá o nome da pessoa reconhecida
cara = ‘%s’ % (nomes[prediction[0]])
#Caso a cara seja de Hector
if cara == "HECTOR":
os.system("/home/pi/hector.sh")
#En caso de que la cara sea de Seila
elif cara == "SEILA":
os.system("/home/pi/seila.sh")
#Si la cara es desconocida, poner desconocido
mais:
cv2.putText(frame,
'Desconocido',
(x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
#No hay nadie
s.system("/home/pi/nadie.sh")
cv2.imshow(‘OpenCV’, frame)
key = cv2.waitKey(10)

if key == 27:
break
[/Código-fonte]

 

 

Postagens recomendadas

Autor

nheobug@bujarra.com
Autor del blog Bujarra.com Cualquier necesidad que tengas, Não hesite em contactar-me, Vou tentar ajudá-lo sempre que puder, Compartilhar é viver ;) . Desfrute de documentos!!!