Распознавание лиц на 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('Все ок.')
Думаю вы поняли, на место лица рами можно поставить лицо нашего злоумышленника и если он подойдет к вашей двери программа найдет его лицо и сравнит с тем что вы уже заготовили.
Не судите строго, это моя первая статья, если есть какие то ошибки напишите об этом ниже :)