Detecção de Faces com OpenCv e Python



A detecção de objetos é muito importante na visão computacional, várias pesquisas e metódos são criados todos os anos com novas melhorias e aperfeiçoamento de algoritmos já existentes.
Uma das técnicas mais utilizadas  é descrita em “Rapid Object Detection using a Boosted Cascade of Simple Features” de 2001 prosposto por  Paul Viola e Michael Jones, o algoritmo tem como entrada várias imagens positivas (imagens que possuem o objeto a ser detectado) e negativas (imagens que não possuem o objeto) e em seguida é aplicado aprendizado de máquina para gerar um cascade classifier, ou seja, um arquivo com todas as características extraídas daquele objeto. O próximo passo é utiliza-lo para reconhecer o objeto em outras imagens.
Neste tutorial faremos a detecção de rostos em uma imagem utilizando  este classificador, para mais detalhes de como o treinamento é realizado veja em: face detection using haar cascade.
Caso deseje criar o seu próprio classificador para outros objetos como carro, mesa e bola saiba como em: cascade classifier train.

Detecção de rostos com OpenCv

Para nossa sorte o OpenCv já possui vários classificadores pré-treinados para detecção de faces, olhos, e sorrisos. Você pode encontra-los na pasta data/haarcascades, exporte-os para a pasta de seu projeto. Como linguagem de programação utilizaremos python pela rapidez e simplicidade do código. Nosso primeiro passo será carregar os classificadores tanto para faces frontais quanto para faces em perfil. 


#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" Author: José Diôgo
Based on: OpenCv faceDetection Tutorial
Date: 22/10/2016
"""
#bibliotecas necessárias
import numpy
import cv2
#carrega os classificadores
frontal_face_cascade = cv2.CascadeClassifier('cascade/haarcascade_frontalface_default.xml')
profile_face_cascade = cv2.CascadeClassifier('cascade/haarcascade_profileface.xml')


Em seguida, carregaremos a imagem em que desejamos encontrar os rostos e a converteremos para escala de cinza para facilitar o processo de detecção, pois não teremos tantas variedades de cores para se preocupar:


#carrega a imagem
img = cv2.imread('img/family.jpeg')
#converte para escala de cinza
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 

Neste momento faremos a detecção em si, com a ajuda dos nossos classificadores acima:


#encontre os rostos na imagem
faces = frontal_face_cascade.detectMultiScale(gray, 1.3, 5)
#se nao encontrou faces frontais, procure por faces em perfil
if len(faces) == 0:
     faces = profile_face_cascade.detectMultiScale(gray, 1.3, 5)


Caso tenhamos obtido resultados, desenhamos um retangulo verde em cada rosto, o padrão do opencv é utilizar o formato de cores (B(blue),G(green),R(red)), note que o retangulo está sendo desenhado em cima da imagem original:


#se encontrou, desenhe um retangulo verde em cada rosto
for(x, y, w, h) in faces:
    cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2)

 Por fim exibiremos o resultado obtido com a função imshow:


#exiba a imagem
cv2.imshow('family', img)
cv2.imwrite('img/familydetection.png', img)
#para sair pressione q
if cv2.waitKey(0) == 'q':
         cv2.destroyAllWindows()


A seguir temos o resultado obtido para a imagem family.jpeg:


 








Caso o resultado não seja satisfatória para a sua imagem, é possível alterar os parâmetros passados para a função detectMultiScale, e ir brincando com os valores para chegar a precisão desejada.

Código fonte: 

Github: https://github.com/juzejunior/OpenCv/blob/master/face_detection/faceDetection.py

Links

Face Detection using Haar Cascades, OpenCv. Disponível em: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html#face-detection 
Acesso em: 22 de outubro de 2016

Rapid Object Detection using a Boosted Cascade of Simple Features, Paul Viola e Viola Jones. Disponível em: https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf 
Acesso em: 22 de outubro de 2016


0 comentários:

Postar um comentário