Как стать автором
Обновить

Распознавание лиц на 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('Все ок.')

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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.