Pull to refresh

Распознавание лиц на python c отправкой в телеграмм или как защититься от недоброжелателей

Всем привет, сегодня объясню вам принцип распознавания лиц

Мы напишем две крутые программы.

Что за программы? Представим такую ситуацию, вам в инстаграме угрожает не очень умный человек и каким то ЧУДЕСНЫМ образом он узнал ваш адрес. К вашему счастью он сглупил и оказалось, что он ставил в ленту свое фото с лицом. Вы боитесь этого человека. Что можно сделать? Определенно не писать скрипт по распознаванию лица, но мы тут с вами Pyhton-исты. Так вот, у нас будет папка (назовем ее img) в которой будет лицо нашего злоумышленника (я не зря говорил, что он ставил фото),скрипт будет получать видео с камеры (которую можно повесить у двери своего дома). Если вдруг на видео будет замечено человеческое лицо, оно будет сверяться на схожесть с лицом нашего злоумышленника (по фотке с лицом которое в папке img). Если лица совпадают, то это значит, что у вашей двери стоит тот самый злоумышленник, в такой ситуации у нас просто будет выводиться что то в консоль. Вы же можете сделать к примеру телеграмм бота, который при такой ситуации будет вам писать.

Вторая будет как помощь. Я уже говорил, что злоумышленник поставил фото в инстаграм. Надо будет скачать ее (в папку img). Наша программа будет принимать на вход путь к фотке, читать ее, пытаться найти лица, и в случае, если лицо найдено, она будет обрезать его и сохранять уже только лицо (так удобнее).

Для программ нам понадобятся модули opencv, face recognition.

OpenCV качайте так pip install opencv-python. Самая сложная часть для меня была в установке face-recognition, так как при его установке вылезала ошибка. Однако у вас может ее не быть. Попробуйте скачать этот модуль. В консоли напишите:pip install dlib & pip install face-recognition

Если же появилась, необходимо установить Visual Studio и там выбрать и установить Python и C++. Может сейчас не понятно, но скачав Visual Studio до вас дойдет о чем я. После установки VisualStudio можете смело качать этот модуль. Так же необходимо скачать натренированную нейронную модель. Вот. Я сохранил это все дело как faces.xml

Начнем со второй программы, так как первая более трудная, надо же понять основы.

import cv2 
#Импортировали модуль opencv

path_to_img = input("Введите путь до картинки (полное название файла, с форматом)>>> ")
#Получаем путь к картинке из которой надо обрезать лицо

img = cv2.imread(path_to_img)
#Методом imread мы как бы читаем наше фото, после этого можем производить манипуляции над ним

face_recog = cv2.CascadeClassifier('faces.xml')
#Методом CascadeClassifier мы подключаем уже натренированную нейронную модель.

face_result = face_recog.detectMultiScale(img, scaleFactor=2, minNeighbors=3) 
#Метод detectMultiScale выполняет поиск лица на фото которые мы указали в качестве первого аргумента
#Аргумент scaleFactor это как бы шаг масштабирования (насколько большое лицо)
#Аргумент minNeighbors это что то вроде указания о том, сколько лиц может быть рядом
#Значение этим аргументам я взял с воздуха, но все же это работает
#Вы можете поиграться с ними, главное не ставьте scaleFactor=1 так как будет ошибка

if len(face_result) != 0:
  #Функция, выполнение которой мы записали в face_result (detectMultiScale), возвращает список, если он пуст, значит лиц на фото нет
  
	for index, (x,y,w,h) in enumerate(face_result):
    #Мы проходимся по всем элементам списка, и получаем позицию x,y и ширину с высотой(w,h)
		img = img[x:y+h]
    #Тут думаю все понятно, мы обрезаем картинку (она у нас как список с цветами) с точки x до точки y+h
    
		cv2.imwrite(f'images/to_recog/practice/{index}.jpg', img)
    #Этот метод записывает получившуюся картинку по опр. пути, принимает путь и само изображение
cv2.imshow("Result", img)
#Этот метод выводит результат на экран. Первый аргумент - что то по типу комментария к картинке, второй - сама картинка
cv2.waitKey(0)
#От этого, зависит какое кол-во времени наша картинка будет отображаться на экране. Если передаем 0 то будет отображаться пока не закроем(бесконечно)ся  

И так. Запустим ее и передадим фото Рами Малека

Было
Было
Стало
Стало

Как видим все круто и не очень трудно. Главное понять принцип. Давайте теперь займемся главной (первой) программой которая будет сравнивать лица. Она немножко труднее, но не бойтесь, все равно будет просто.

import cv2
import face_recognition
import os
#Импортируем все модули

cap = cv2.VideoCapture(0)
#Методом VideoCapture мы получаем видео, тут можно указать путь к mp4 файлу и прочитать его
#Указав 0 мы получаем видео с ВЕБ КАМЕРЫ

image_to_recognition = face_recognition.load_image_file('images/to_recog/practice/0.jpg')     
#Теперь начинаем работать с face_recognition, метод load_image_file получает изображение
#В данном случае то фото рами малека которые мы обрезали второй программой

image_enc = face_recognition.face_encodings(image_to_recognition)[0]
#Тут методом face_encodings мы получаем КОДИРОВКУ ЛИЦА рами малека.
#Просто у каждого фото с лицом (да и не только) есть КОДИРОВКА.
#Если у нас есть 2 фото с лицами и если их кодировки совпадают, значит на фото один и тот же человвек              

recognizer_cc = cv2.CascadeClassifier('faces.xml')
#Про это уже говорил

#Любое видео, это быстро меняющиеся картинки, от того и создается эффект анимации
#Здесь тот же принцип, в бесконечном цикле мы очень быстро меняем изображения и получаем видео
while True:
	success,img = cap.read()
  #Получаем изображение которое будем быстро показывать, если изображение не получено success будет равен False

	recognize = recognizer_cc.detectMultiScale(img, scaleFactor=2, minNeighbors=3)
  #Про это уже говорил
	if len(recognize) != 0:
    #Если на фото есть лицо, делаем то, что ниже
		print("Лицо нашел")
		unknown_face = face_recognition.face_encodings(img)
    #Получем кодировку неизвестного лица (лица которое на видео)
    
		compare = face_recognition.compare_faces([unknown_face], image_enc)
    #Сравниваем две кодировки (кодировку рами малека и кодировку неизвестного лица)
    #Первый параметр надо передать как список (за это и обернули в [])
    #Второй это кодировка рами малека (этот аргумент передаем просто)

		if compare == True:
      #Если мы зашли сюда, значит лица одинаковые
			print('Рами приблизился к вашему дому!')
		else:
			print('Все ок.')

Думаю вы поняли, на место лица рами можно поставить лицо нашего злоумышленника и если он подойдет к вашей двери программа найдет его лицо и сравнит с тем что вы уже заготовили.

Не судите строго, это моя первая статья, если есть какие то ошибки напишите об этом ниже :)

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.