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

Использование face_recognition и OpenCV для автоматического распознавания лиц и отправки уведомлений в Telegram

Время на прочтение8 мин
Количество просмотров3.8K

Всем добра.

Введение

В наше время технологии распознавания лиц становятся все более популярными и востребованными в различных областях, начиная от безопасности и заканчивая маркетингом. В этой статье мы рассмотрим, как с помощью Python и библиотек face_recognition и OpenCV создать систему, которая будет распознавать лица, делать скриншоты при обнаружении лица в кадре и отправлять эти скриншоты в Telegram.

Проект «Кто приходил»

Проект "Кто приходил" представляет собой систему, которая использует технологии распознавания лиц для автоматического определения лиц в кадре, их идентификации и отправки уведомлений с изображениями в Telegram. Это может быть полезно для обеспечения безопасности, мониторинга доступа в определенные зоны или просто для наблюдения.

Необходимые библиотеки

Для реализации проекта нам понадобятся следующие библиотеки:

  • OpenCV для захвата видеопотока с веб-камеры и обработки изображений.

  • face_recognition для обнаружения и распознавания лиц.

  • os для работы с файловой системой (создание и проверка директорий).

  • datetime для работы с датой и временем (отслеживание времени обнаружения лиц).

  • asyncio для асинхронного выполнения задач (отправка сообщений в Telegram).

  • telegram для взаимодействия с API Telegram (отправка скриншотов пользователю).

Установить их можно с помощью pip (pip install face_recognition opencv-python python-telegram-bot).

Настройка Telegram бота

Для начала работы с Telegram ботом, необходимо создать его через BotFather и получить токен. Этот токен будет использоваться для аутентификации нашего бота. Далее, мы должны узнать ID пользователя, которому будут отправляться уведомления. Это можно сделать с помощью различных методов, например, через специальные боты, которые показывают ваш User ID.

Основной код

Загрузка и подготовка изображения

Первым шагом будет загрузка изображения, с которым мы будем сравнивать лица, и его кодирование. Для этого используем библиотеку face_recognition:

import face_recognition

import cv2

# Загрузка фотографии, с которой будем сравнивать лица

imgmain = face_recognition.load_image_file('photo.jpg')

imgmain = cv2.cvtColor(imgmain, cv2.COLOR_BGR2RGB)  # Конвертация изображения из BGR (формат OpenCV) в RGB (формат face_recognition)

# Нахождение лиц и кодирование

encodeElon = face_recognition.face_encodings(imgmain)[0]  # Кодирование лица на изображении

Инициализация видеозахвата

Следующим шагом будет инициализация видеозахвата с помощью OpenCV:

# Инициализация видеозахвата

cap = cv2.VideoCapture(0)  # Запуск видеозахвата с веб-камеры

if not cap.isOpened():

    print("Ошибка при открытии веб-камеры.")

    exit(1)

Определение пути для сохранения скриншотов

Для сохранения скриншотов создаем отдельную директорию:

import os

# Определение пути для сохранения скриншотов

current_directory = os.getcwd()  # Получение текущего рабочего каталога

screenshots_directory = os.path.join(current_directory, "screenshots")  # Определение пути к каталогу для скриншотов

if not os.path.exists(screenshots_directory):

    os.makedirs(screenshots_directory)  # Создание каталога, если он не существует

Отправка изображений в Telegram

Создадим асинхронную функцию для отправки изображений в Telegram:

from telegram import Bot

from telegram.error import TelegramError

import asyncio

# Установка токена бота Telegram

TOKEN = "ВАШ_ТЕЛЕГРАМ_ТОКЕН"

# ID пользователя, которому будет отправлено сообщение

USER_ID = ВАШ_USER_ID

# Создание объекта бота

bot = Bot(token=TOKEN)

async def send_photo_to_telegram(photo_path):

    # Отправка изображения в Telegram

    with open(photo_path, 'rb') as photo_file:

        try:

            await bot.send_photo(chat_id=USER_ID, photo=photo_file)

            print(f"Labeled screenshot sent to Telegram user {USER_ID}")

        except TelegramError as e:

            print(f"Failed to send photo: {e}")

Обработка видеопотока

Создадим асинхронную функцию для обработки видеопотока, поиска лиц и отправки скриншотов:

from datetime import datetime

face_present_start_time = None  # Время начала обнаружения лица

screenshot_taken = False  # Флаг, указывающий, был ли сделан скриншот

async def process_video():

global face_present_start_time, screenshot_taken

    while True:

        ret, frame = cap.read()  # Чтение кадра с веб-камеры

        if not ret:

            print("Ошибка при захвате кадра.")

            break

        # Конвертация изображения из BGR в RGB

        rgb_frame = frame[:, :, ::-1]  # Конвертация кадра из BGR (формат OpenCV) в RGB (формат face_recognition)

        # Поиск всех лиц в текущем кадре видео

        face_locations = face_recognition.face_locations(rgb_frame)  # Нахождение всех лиц в кадре

        if face_locations:  # Если лица найдены

            if face_present_start_time is None:

                face_present_start_time = datetime.now()  # Установка времени начала обнаружения лица

            else:

                elapsed_time = (datetime.now() - face_present_start_time).total_seconds()  # Вычисление времени, прошедшего с начала обнаружения

                if elapsed_time >= 3 and not screenshot_taken:  # Если прошло 3 секунды и скриншот еще не был сделан

                    screenshot_path = os.path.join(screenshots_directory, f"face_{len(os.listdir(screenshots_directory)) + 1}.png")

                    cv2.imwrite(screenshot_path, frame)  # Сохранение скриншота

                    saved_screenshot = cv2.imread(screenshot_path)  # Загрузка сохраненного скриншота

                    # Поиск всех лиц на скриншоте

                    face_locations_test = face_recognition.face_locations(saved_screenshot)  # Нахождение всех лиц на скриншоте

                    encodings_test = face_recognition.face_encodings(saved_screenshot)  # Кодирование всех лиц на скриншоте

                    for (top, right, bottom, left), encodeTest in zip(face_locations_test, encodings_test):

                        results = face_recognition.compare_faces([encodeElon], encodeTest)  # Сравнение каждого лица на скриншоте с эталонным лицом

                        label = "Slava" if True in results else "Unknown"  # Определение метки для лица

                        cv2.rectangle(saved_screenshot, (left, top), (right, bottom), (255, 0, 255), 2)  # Отрисовка прямоугольника вокруг лица

                        cv2.putText(saved_screenshot, label, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 255), 2)  # Добавление метки

                    print(f"Screenshot saved as {screenshot_path}")

                    screenshot_taken = True  # Установка флага, что скриншот был сделан

                    cv2.imshow('Test Image', saved_screenshot)  # Отображение скриншота с помеченными лицами

                    # Сохранение изображения с помеченными лицами

                    labeled_screenshot_path = os.path.join(screenshots_directory, f"labeled_face_{len(os.listdir(screenshots_directory)) + 1}.png")

                    cv2.imwrite(labeled_screenshot_path, saved_screenshot)  # Сохранение скриншота с метками

                    print(f"Labeled screenshot saved as {labeled_screenshot_path}")

                    # Отправка изображения в Telegram

                    await send_photo_to_telegram(labeled_screenshot_path)

            for top, right, bottom, left in face_locations:

                cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)  # Отрисовка прямоугольника вокруг лиц в текущем кадре

        else:

            face_present_start_time = None  # Сброс времени начала обнаружения лица

            screenshot_taken = False  # Сброс флага скриншота

        cv2.imshow('Video', frame)  # Отображение текущего кадра

        if cv2.waitKey(25) == 13:  # Нажатие Enter для выхода из цикла

            break

    cap.release()  # Освобождение видеозахвата

    cv2.destroyAllWindows()  # Закрытие всех окон OpenCV

asyncio.run(process_video())  # Запуск асинхронной функции обработки видео

Заключение

Мы рассмотрели, как создать простую систему распознавания лиц с использованием Python и популярных библиотек. Эта система не только распознает лица, но и делает скриншоты, отправляет их в Telegram, что может быть полезно для различных целей, таких как обеспечение безопасности или просто наблюдение. Надеюсь, что этот пример будет полезен для вас и поможет в создании собственных проектов на основе распознавания лиц.

Теги:
Хабы:
+3
Комментарии6

Публикации

Истории

Работа

Data Scientist
81 вакансия
Python разработчик
133 вакансии

Ближайшие события