Índice:

Detecção de rosto + reconhecimento: 8 etapas (com imagens)
Detecção de rosto + reconhecimento: 8 etapas (com imagens)

Vídeo: Detecção de rosto + reconhecimento: 8 etapas (com imagens)

Vídeo: Detecção de rosto + reconhecimento: 8 etapas (com imagens)
Vídeo: Reconhecimento Facial Tutorial - Opencv Python Deep Learning 2024, Novembro
Anonim
Image
Image
Detecção de rosto + reconhecimento
Detecção de rosto + reconhecimento

Este é um exemplo simples de detecção e reconhecimento de rosto com OpenCV de uma câmera. NOTA: FIZ ESTE PROJETO PARA CONCURSO DE SENSORES E USEI A CÂMERA COMO SENSOR PARA RASTREAR E RECONHECER FACES. Portanto, nosso objetivo, nesta sessão, 1. Instale o Anaconda 2. Baixe o Open CV Package 3. Defina as variáveis ambientais 4. Teste para confirmar 5 Faça o código para detecção de rosto 6. Faça o código para criar um conjunto de dados 7. Faça o código para treinar o reconhecedor 8. Faça o código para reconhecer os rostos e o resultado.

Etapa 1: Instale o Anaconda

Instale o Anaconda
Instale o Anaconda

O Anaconda é essencialmente um IDE Python bem embalado que vem com toneladas de pacotes úteis, como NumPy, Pandas, Notebook IPython, etc. Parece ser recomendado em qualquer lugar na comunidade científica. Verifique o Anaconda para instalá-lo.

Etapa 2: Baixe o Pacote de CV Aberto

Baixe o Open CV Package
Baixe o Open CV Package

Em primeiro lugar, vá para o site oficial do OpenCV para baixar o pacote OpenCV completo. Escolha uma versão de sua preferência (2.x ou 3.x). Estou usando Python 2.xe OpenCV 2.x - principalmente porque é assim que os tutoriais OpenCV-Python são configurados / baseados.

No meu caso, extraí o pacote (essencialmente uma pasta) direto para minha unidade F. (F: / opencv).

Etapa 3: Definir Variáveis Ambientais

Definir Variáveis Ambientais
Definir Variáveis Ambientais

Copie e cole o arquivo cv2.pyd

O diretório Anaconda Site-packages (por exemplo, F: / Arquivos de programas / Anaconda2 / Lib / site-packages no meu caso) contém os pacotes Python que você pode importar. Nosso objetivo é copiar e colar o arquivo cv2.pyd neste diretório (para que possamos usar a importação cv2 em nossos códigos Python).

Para fazer isso, copie o arquivo cv2.pyd…

A partir deste diretório OpenCV (a parte inicial pode ser um pouco diferente em sua máquina):

# Máquina Python 2.7 e 64 bits: F: / opencv / build / python / 2.7 / x64 # Máquina Python 2.7 e 32 bits: F: / opencv / build / python / 2.7 / x84

Para este diretório Anaconda (a parte inicial pode ser um pouco diferente em sua máquina):

F: / Arquivos de programas / Anaconda2 / Lib / site-packages

Depois de realizar esta etapa, agora seremos capazes de usar import cv2 no código Python. MAS, ainda precisamos trabalhar um pouco mais para que o FFMPEG (codec de vídeo) funcione (para nos permitir fazer coisas como processar vídeos).

Clique com o botão direito em "Meu Computador" (ou "Este PC" no Windows 8.1) -> clique com o botão esquerdo em Propriedades -> clique com o botão esquerdo na guia "Avançado" -> clique com o botão esquerdo no botão "Variáveis de Ambiente …". Adicione uma nova Variável de Usuário para apontar para o OpenCV (x86 para sistema de 32 bits ou x64 para sistema de 64 bits). Estou atualmente em uma máquina de 64 bits.

32-bitOPENCV_DIRC: / opencv / build / x86 / vc12

64 bitsOPENCV_DIRC: / opencv / build / x64 / vc12

Anexe% OPENCV_DIR% / bin à variável de usuário PATH.

Por exemplo, minha variável de usuário PATH se parece com isto …

Antes:

F: / Users / Johnny / Anaconda; C: / Users / Johnny / Anaconda / Scripts

Depois de:

F: / Users / Johnny / Anaconda; C: / Users / Johnny / Anaconda / Scripts;% OPENCV_DIR% / bin

É isso que terminamos! O FFMPEG está pronto para ser usado!

Etapa 4: teste para confirmar

Teste para confirmar
Teste para confirmar
Teste para confirmar
Teste para confirmar

Precisamos testar se agora podemos fazer isso no Anaconda (via Spyder IDE):

  • Importar pacote OpenCV
  • Use o utilitário FFMPEG (para ler / gravar / processar vídeos)

Teste 1: podemos importar OpenCV?

Para confirmar que o Anaconda agora é capaz de importar o pacote OpenCV-Python (ou seja, cv2), emita-os no console IPython:

import cv2

imprimir cv2._ version_

Se o pacote cv2 for importado ok sem erros, e a versão cv2 for impressa, então estamos todos bem!

Teste 2: podemos usar o codec FFMPEG?

Coloque uma amostra

input_video.mp4

arquivo de vídeo em um diretório. Queremos testar se podemos:

  • leia este arquivo de vídeo.mp4 e
  • escrever um novo arquivo de vídeo (pode ser.avi ou.mp4 etc.)

Para fazer isso, precisamos ter um código Python de teste, chame-o de test.py. Coloque-o no mesmo diretório da amostra

input_video.mp4

Arquivo.

Isso é o que

test.py

pode ser parecido com (Observação: muito obrigado às sugestões de Pete e Warren no campo de comentários - substituí meu código de teste original pelo dele - teste você mesmo e nos informe se funciona melhor):

import cv2

cap = cv2. VideoCapture ("input_video.mp4") imprimir cap.isOpened () # True = ler o vídeo com sucesso. Falso - falha ao ler o vídeo. fourcc = cv2. VideoWriter_fourcc (* 'XVID') out = cv2. VideoWriter ("output_video.avi", fourcc, 20.0, (640, 360)) print out.isOpened () # True = gravar vídeo com sucesso. Falso - falha ao gravar o vídeo. cap.release () out.release ()

Este teste é MUITO IMPORTANTE. Se você gostaria de processar arquivos de vídeo, você precisa garantir que o Anaconda / Spyder IDE pode usar o FFMPEG (codec de vídeo). Levei dias para fazê-lo funcionar. Mas espero que demore muito menos tempo!:) Nota: mais uma dica muito importante ao usar o IDE Anaconda Spyder. Certifique-se de verificar o diretório de trabalho atual (CWD) !!!

Etapa 5: crie um código para detecção de rosto

Crie um código para detecção de rosto
Crie um código para detecção de rosto
Crie um código para detecção de rosto
Crie um código para detecção de rosto

Meta

Nesta sessão,

  • Veremos os fundamentos da detecção de rosto usando Classificadores Cascade baseados em recursos Haar
  • Vamos estender o mesmo para detecção de olhos, etc.

Detecção de cascata Haar em OpenCV

Aqui vamos lidar com a detecção. O OpenCV já contém muitos classificadores pré-treinados para rosto, olhos, sorriso, etc. Esses arquivos XML são armazenados em opencv / data / haarcascades / pasta. Vamos criar um detector de rosto e olho com OpenCV. Primeiro, precisamos carregar os classificadores XML necessários. Em seguida, carregue nossa imagem de entrada (ou vídeo) em modo de escala de cinza OU podemos usar a câmera (para detecção de rosto em tempo real)

importar numpy como np

import cv2 face_cascade = cv2. CascadeClassifier ('F: / Arquivos de programas / opencv / sources / data / haarcascades / haarcascade_frontalface_default.xml') eye_cascade = cv2. CascadeClassifier ('F: / Arquivos de programas / opencv / sources / data / haarcascades /.xml ') cap = cv2. VideoCapture (0) enquanto 1: ret, img = cap.read () grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale (cinza, 1.5, 5) para (x, y, w, h) nas faces: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = cinza [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w] eyes = eye_cascade.detectMultiScale (roi_gray) for (ex, ey, ew, eh) nos olhos: cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) print "found" + str (len (faces)) + "face (s)" cv2.imshow ('img', img) k = cv2.waitKey (30) & 0xff if k == 27: break cap.release () cv2.destroyAllWindows ()

Etapa 6: criar código para criar conjunto de dados

Faça o código para criar o conjunto de dados
Faça o código para criar o conjunto de dados
Faça o código para criar o conjunto de dados
Faça o código para criar o conjunto de dados

Estamos fazendo reconhecimento facial, então você precisará de algumas imagens de rosto! Você pode criar seu próprio conjunto de dados ou começar com um dos bancos de dados faciais disponíveis. Http://face-rec.org/databases/ oferece uma visão geral atualizada. Três bancos de dados interessantes são (partes da descrição são citadas em

  • AT&T Facedatabase
  • Yale Facedatabase A
  • Extended Yale Facedatabase B

AQUI estou usando meu próprio conjunto de dados … com a ajuda do código que é fornecido abaixo:

importar numpy como np

import cv2 face_cascade = cv2. CascadeClassifier ('F: / Arquivos de programas / opencv / sources / data / haarcascades / haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) id = raw_input ('inserir id do usuário') sampleN = 0; enquanto 1: ret, img = cap.read () grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale (grey, 1.3, 5) for (x, y, w, h) em faces: sampleN = amostraN + 1; cv2.imwrite ("F: / Arquivos de programas / projetos / face_rec / facesData / Usuário." + str (id) + "." + str (sampleN) + ".jpg", cinza [y: y + h, x: x + w]) cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.waitKey (100) cv2.imshow ('img', img) cv2.waitKey (1) se amostraN> 20: break cap.release () cv2.destroyAllWindows ()

Etapa 7: Crie um código para treinar o reconhecedor

Crie um código para treinar o reconhecedor
Crie um código para treinar o reconhecedor

Crie a função para preparar o conjunto de treinamento

Agora, vamos definir uma função

getImagesWithID (caminho)

que leva o caminho absoluto para o banco de dados de imagem como argumento de entrada e retorna a tupla de 2 listas, uma contendo as faces detectadas e a outra contendo o rótulo correspondente para aquela face. Por exemplo, se o i-ésimo índice na lista de faces representa o quinto indivíduo no banco de dados, então a i-ésima localização na lista de rótulos tem valor igual a 5.

Agora converta as faces do conjunto de dados (que é criado na etapa 6) em arquivo.yml com a ajuda do código que é fornecido abaixo:

importar os

import numpy as np import cv2 from PIL import Image # Para o reconhecimento facial, iremos o LBPH Face Recognizer reconhecizer = cv2.createLBPHFaceRecognizer (); path = "F: / Arquivos de programas / projects / face_rec / facesData" def getImagesWithID (path): imagePaths = [os.path.join (path, f) for f em os.listdir (path)] # print image_path #getImagesWithID (path) faces = IDs = para imagePath em imagePaths: # Leia a imagem e converta para tons de cinza facesImg = Image.open (imagePath).convert ('L') faceNP = np.array (facesImg, 'uint8') # Obtenha o rótulo da imagem ID = int (os.path.split (imagePath) [- 1].split (".") [1]) # Detecte o rosto na imagem faces.append (faceNP) IDs.append (ID) cv2.imshow ("Adicionando faces para treinamento", faceNP) cv2.waitKey (10) return np.array (IDs), faces Ids, faces = getImagesWithID (path) reconhecizer.train (faces, Ids) reconhecizer.save ("F: / Arquivos de programas / projects / face_rec / faceREC / trainingdata.yml") cv2.destroyAllWindows ()

usando este código, todos os conjuntos de dados de face convertidos em um único arquivo.yml…..a localização do caminho é ("F: / Arquivos de programas / projects / face_rec / faceREC / trainingdata.yml")

Etapa 8: Crie um código para reconhecer os rostos e o resultado

Guyzz esta é a etapa final na qual podemos criar o código para reconhecer os rostos com a ajuda de sua webcam NESTA ETAPA EXISTEM DUAS OPERAÇÕES QUE VÃO REALIZAR…. 1. capturando o vídeo da cam 2. compare-o com o seu arquivo.yml

importar numpy como npimport cv2 face_cascade = cv2. CascadeClassifier ('F: / Arquivos de programas / opencv / sources / data / haarcascades / haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) rec = cv2.createLBPHFaceRecognizer (); rec.load ("F: / Arquivos de programas / projects / face_rec / faceREC / trainingdata.yml") id = 0 font = cv2.cv. InitFont (cv2.cv. CV_FONT_HERSHEY_COMPLEX_SMALL, 5, 1, 0, 4) enquanto 1: ret, img = cap.read () grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale (grey, 1.5, 5) para (x, y, w, h) nas faces: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) id, conf = rec.predict (cinza [y: y + h, x: x + w]) if (id == 2): id = "alok" if id == 1: id = "alok" if id == 3: id = "anjali" if id == 4: id = "Gaurav" if id = = 5: id = 'rahul' if id == 6: id = "akshay" cv2.cv. PutText (cv2.cv.fromarray (img), str (id), (x, y + h), fonte, 255) cv2.imshow ('img', img) if cv2.waitKey (1) == ord ('q'): break cap.release ()

cv2.destroyAllWindows ()

e finalmente o resultado vai chegar bem na sua frente …… você também pode baixar o arquivo zip abaixo do link: Clique aqui para baixar os códigos Então, neste instrutível realizamos a tarefa de detecção + reconhecimento facial usando OpenCV…..se você assim instrutível … por favor, inscreva-se e vote em mim … obrigado amigos:)

Recomendado: