A complexidade das máquinas aumentou ao longo dos anos e os computadores não são uma exceção. Os computadores ajudaram a humanidade a resolver muitos problemas e concluir muitas tarefas difíceis. Longe vão os dias em que todos os computadores fizeram operações aritméticas simples, os computadores agora dirigem o mundo.
Os computadores se tornaram tão complexos que estão sendo treinados para pensar como humanos.
Sim!
Vamos fazer algo dessa natureza neste artigo. Como seres humanos, reconhecer os rostos de outras pessoas é uma tarefa simples e, apesar das habilidades dos computadores de hoje, não é tão fácil para o computador, por isso temos que treiná -lo para poder fazer o mesmo.
Muitos artigos que você veria por aí para parar na detecção de rosto simples, mas neste artigo cobriria não apenas a detecção de rosto, mas também o reconhecimento de rosto.
Isso significa que, se o computador for apresentado com duas fotos minhas, não apenas reconheceria que parte da imagem é o meu rosto, mas também reconheceria que eu sou eu a única nas duas fotos.
Para começar, teríamos que instalar primeiro o OpenCV em nossas máquinas, o que só pode ser feito se você tiver o Python instalado. A instalação do Python não é o objetivo deste artigo; portanto, se você ainda não o possui em sua máquina, poderá instalar o Python no site do Python.
Para instalar o CV aberto, podemos fazer isso usando o comando pip.
Instalação do PIP OpenCV-PythonTambém estaremos usando o pacote Numpy neste artigo, que deve ser instalado ao lado do OpenCV usando o comando acima.
Se Numpy não foi instalado, você pode fazê -lo facilmente usando o comando abaixo:
pip install numpyPara confirmar que seu OpenCV está instalado, quando você ativa o ambiente interativo do Python, tente importá -lo usando:
importar CV2Se não receber um erro, você pode prosseguir.
Para realizar o reconhecimento facial, estaríamos escrevendo três scripts. Um para criar um conjunto de dados de imagens, outro para treinar essas imagens e depois o último a reconhecer os rostos com base nos resultados do treinamento pelo qual o computador passa.
Estaríamos precisando da cascata Haar fornecida pelo Open CV. Este arquivo pode ser obtido no diretório OpenCV, que é CV2/Data/Haarcascade_frontalface_default.XML na minha máquina, também deve ser o mesmo em sua máquina. Copie o arquivo na pasta onde deseja fazer o reconhecimento de rosto.
Agora vamos entrar no meio das coisas.
Tentávamos fazer com que nossa web cam obtenha as fotos, necessárias para o conjunto de dados.
Então, para explicar o que cada linha de código faz:
importar CV2Aqui está o comando que diz a Python para incluir uma biblioteca externa a ser usada neste código; neste caso, está aberto CV.
vid_cam = cv2.Videocapture (0)Este código chama a biblioteca CV aberta importada para começar a capturar e a webcam é iniciada neste momento. Se o CV aberto não suportar sua webcam, o código falhará aqui.
FACE_DETECTOR = CV2.CascadeClassifier ('Haarcascade_frontalface_default.xml ')Para que possamos realizar a detecção de imagem, esse código é necessário. Open CV usa o 'haarcascade_frontalface_default.xml 'para classificação em cascata. O objeto resultante é então armazenado na variável FACE_DETECTOR.
face_id = 1Aqui está um caso de definir o número de identificação do rosto, então o primeiro rosto recebe um ID de 1.
contagem = 0Vamos tirar algumas imagens, pois o CV aberto precisa treinar imagens para poder reconhecer rostos, a variável de contagem serve como uma contagem de imagens.
while (vid_cam.está aberto()):Isso permite que as seguintes operações prossiga desde que a câmera de vídeo seja aberta. O método isopened () retorna verdadeiro ou falso.
ret, imagem_frame = vid_cam.ler()Aqui, o vid_cam.Leia () analisa a captura de vídeo e depois captura o quadro que é armazenado na variável image_frame, se a operação for bem -sucedida, o booleano true será retornado e armazenado na variável RET
cinza = cv2.cvtcolor (image_frame, cv2.Color_bgr2gray)O método cvtcolor () é usado para converter o quadro da imagem no tipo de cor desejado. Nesse caso, convertemos em escala de cinza.
FACES = FACE_DETECTOR.DetectMultiscale (Gray, 1.3, 5)Isso verifica os quadros de tamanhos diferentes e tenta defini -los para escalar, é aplicado na variável à qual a cascata de Haar foi aplicada.
para (x, y, w, h) em rostos:Aqui, percorremos os rostos e suas dimensões, onde X e Y representam as coordenadas e W e H representam largura e altura, respectivamente.
cv2.retângulo (image_frame, (x, y), (x+w, y+h), (255,0,0), 2)Lembre -se de que ainda estamos trabalhando com a câmera de vídeo, a câmera de vídeo e depois a necessidade da imagem de acordo com as dimensões acima.
contagem += 1Imediatamente isso é feito, a variável de contagem que permanece como um contador e depois incrementos.
cv2.Imwrite ("DataSet/Usuário." + str (face_id) + '.' + str (contagem) + ".jpg ", cinza [y: y+h, x: x+w])A imagem cortada é a salva com o nome de usuário (face_id).(contar).JPG e coloque em uma pasta chamada conjunto de dados.
cv2.imshow ('quadro', image_frame)Após o salvamento, esse código garante que a imagem seja exibida com um retângulo no rosto do indivíduo após a detecção de face.
se cv2.WaitKey (100) e 0xff == ord ('q'):Após a foto, o usuário pode impedir que o programa tire mais fotos, o que pode ser feito pressionando o 'q' no teclado para pelo menos 100ms.
Elif contagem> 100:O que esse código faz é impedir que o vídeo funcione no momento 100 fotos foram tiradas, independentemente de o usuário querer levar mais ou não.
vid_cam.liberar()Aqui, a web cam está fechada e não apenas impediu de tirar fotos.
cv2.DestroyAllWindows ()Então todo o Windows OpenEncv foi aberto e o código é concedido para a conclusão.
Agora que terminamos com isso, podemos treinar o conjunto de dados da imagem:
importar CV2, OSVamos em frente e explicar este código também:
importar CV2, OSAssim como o outro código, aqui estamos importando o OpenCV e OS, que precisaríamos para o caminho do arquivo.
importar numpy como npTambém estamos importando a biblioteca Numpy, que seria usada para o cálculo da matriz (uma matriz é apenas um arranjo de matrizes).
da imagem de importação do PILEstamos importando a biblioteca de imagens Python e depois também estamos recebendo a biblioteca de imagens deste pacote.
Reconhecimento = CV2.face.CreateLbPhfaceRecognizer ()O que isso faz é aplicar o método CreateLBPhfaceRecognizer () ao CV2.Face Object, isso ajudaria a facilitar o reconhecimento de rostos, pois não precisamos criar nosso próprio conjunto de algoritmos.
Detector = CV2.Cascadeclassifier ("Haarcascade_frontalface_default.xml ");Se você seguiu o tutorial, você já se depararia antes. Ajuda na detecção de rosto usando o “Haarcascade_frontalface_default.XML ”para a classificação em cascata.
def getImagesandlabels (caminho):Agora, estamos prestes a começar o treinamento de imagem adequado, por isso criamos uma função.
ImagePaths = [OS.caminho.Junte -se (Path, F) para F em OS.ListDir (Path)]Este código verifica no diretório atual do arquivo e verifica os arquivos da imagem e depois os adiciona a esta lista.
Facesamples = []Isso inicializa uma lista de amostras, está vazia neste momento, mas as faces serão adicionadas à medida que o código é executado.
ids = []Inicialize uma lista de IDs, que está inicialmente vazio.
Para o ImagePath em ImagePaths:Lembre -se do código que verificou os arquivos de imagem no diretório? Sim? Agora, vamos percorrer cada um desses arquivos e realizar operações.
Pil_img = imagem.Open (ImagePath).converter ('l')Agora, a primeira coisa que fazemos com a imagem é convertê -la em escala de cinza, e este código faz isso.
img_numpy = np.Array (pil_img, 'uint8')A imagem em cinza é apenas uma série de números, tudo em um só lugar, por isso criamos uma matriz numpy a partir deles e a designamos a uma variável.
id = int (OS.caminho.Split (ImagePath) [-1].dividir(".") [1])Se você se lembra do arquivo que recebe as imagens, lembraria que nomeamos o usuário do arquivo (FACE_ID).contar.jpg. Então aqui estamos dividindo os nomes com o “.”E então extraímos o FACE_ID e atribuímos a uma variável aqui. Precisaríamos do ID para reconhecimento.
FACES = Detector.DetectMultiscale (img_numpy)Da matriz Numpy, o método DetectMultisCale () tentará detectar as faces do padrão encontrado na matriz Numpy. Em seguida, atribui os valores na variável faces.
para (x, y, w, h) em rostos:Aqui, estamos percorrendo os valores atribuídos à variável. Os valores aqui são as coordenadas X e Y que poderíamos tomar como origem e, em seguida.
Facesamples.Anexe (img_numpy [y: y+h, x: x+w])Antes, criamos uma lista de amostras de rosto, mas estava vazio. Aqui podemos adicionar rostos a essa lista, e estamos adicionando o y a h para obter os dois valores das coordenadas y e o mesmo é feito para x.
ids.Anexar (ID)Agora temos um rosto na lista de amostras de rosto, então obtemos seu ID e o anexamos à lista de IDs também.
Retornar as amostras de faces, IDsDepois de tudo, retornamos a lista de amostras de rosto e a lista de IDs.
rostos, ids = getImagesandlabels ('conjunto de dados')Lembre -se de que getImagesAndlabels () é apenas uma função. Então, podemos chamar a função aqui, e os valores de retorno são salvos nas variáveis de faces e IDs.
Reconhecedor.Trem (rostos, NP.Array (IDS))Aqui é onde acontece o treinamento real. Aplicamos o método CreateLBPhFaceRecognizer () algum tempo antes e atribuído a uma variável de reconhecimento. É hora de treinamento!
Reconhecedor.salvar ('treinador/treinador.yml ')Após o treinamento, economizamos os resultados do treinamento.
Depois de executar o código, ele cria um arquivo chamado treinador.YML, que seria então usado pelo código de reconhecimento de rosto.
Aqui está o código de reconhecimento de rosto:
importar CV2Se você está acompanhando o artigo desde o início, já fizemos isso antes. Se você não faz gentilmente.
Reconhecedor.carregamento ('treinador/treinador.yml ')Lembre -se de que treinamos o reconhecedor e salvamos um arquivo? Sim? Estamos carregando esse arquivo agora.
cascadepath = "Haarcascade_frontalface_default.xml "Estaríamos trabalhando com o arquivo HaarcaScade, e aqui atribuímos o nome do arquivo a uma variável.
# Crie classificador a partir do modelo pré -construídoAqui podemos realizar a classificação em cascata no arquivo Haarcascade.
Fonte = CV2.FONT_HERSHEY_SIMPLEXDefinimos o tipo de fonte que seria usado quando o código reconhecer o rosto em uma imagem e exibir o nome.
CAM = CV2.Videocapture (0)Já estivemos aqui antes, mas desta vez é hora de reconhecer os rostos. Se você não souber o que esse código faz, ele inicia a webcam.
enquanto é verdade:Tudo isso já foi feito antes, verifique o código que foi usado para salvar imagens se você não souber o que o código faz.
cv2.retângulo (im, (x-20, y-20), (x+w+20, y+h+20), (0,255,0), 4)Portanto, isso ajuda a webcam a detectar onde estão os rostos e coloca um retângulo para indicar um rosto.
Id = reconhecedor.prever (cinza [y: y+h, x: x+w])Alrerady carregamos o arquivo de trem no reconhecedor, para que seja capaz de reconhecer o rosto agora.
if (id == 1):Depois de tentar reconhecer o que é a cara, ele verifica o ID e vê se existe. Aqui, o valor do ID seria o nome de quem era de propriedade de esse ID quando o conjunto de dados da imagem estava sendo criado.
cv2.retângulo (im, (x-22, y-90), (x+w+22, y-22), (0,255,0), -1)O código depois de encontrar o proprietário do ID, atrai um retângulo em volta do rosto e coloca o nome do proprietário do rosto. Rosto reconhecido!
cv2.imshow ('im', im)Aqui, o quadro de vídeo é exibido com o retângulo limitado.
se cv2.WaitKey (10) e 0xff == ord ('q'):Então, quando terminar, você pode parar o programa pressionando a tecla 'q' e interrompe a webcam e a fecha.
Lá está você, sua webcam agora pode reconhecer rostos e você pode usá -lo sempre que desejar. Além disso, usando a webcam, você também pode carregar uma imagem, no entanto, isso requer outras etapas além daquelas que foram tomadas neste artigo.