Оглавление:

Система безопасности распознавания лиц для холодильника с Raspberry Pi: 7 шагов (с изображениями)
Система безопасности распознавания лиц для холодильника с Raspberry Pi: 7 шагов (с изображениями)

Видео: Система безопасности распознавания лиц для холодильника с Raspberry Pi: 7 шагов (с изображениями)

Видео: Система безопасности распознавания лиц для холодильника с Raspberry Pi: 7 шагов (с изображениями)
Видео: Методы распознавания образов 2024, Июль
Anonim
Image
Image
Система безопасности распознавания лиц для холодильника с Raspberry Pi
Система безопасности распознавания лиц для холодильника с Raspberry Pi
Система безопасности распознавания лиц для холодильника с Raspberry Pi
Система безопасности распознавания лиц для холодильника с Raspberry Pi

Просматривая Интернет, я обнаружил, что цены на системы безопасности варьируются от 150 до 600 долларов и выше, но не все решения (даже очень дорогие) могут быть интегрированы с другими интеллектуальными инструментами у вас дома! Например, вы не можете установить камеру видеонаблюдения у входной двери, чтобы она автоматически открывала дверь для вас или ваших друзей!

Я решил сделать простое, дешевое и мощное решение, которое можно использовать где угодно! Есть много руководств по созданию дешевых и самодельных систем безопасности, но я хочу продемонстрировать действительно нетривиальное их применение - систему безопасности для холодильника с распознаванием лиц!

Как это работает? IP-камера, размещенная в верхней части холодильника, датчики (две кнопки) обнаруживают, когда человек открывает дверь холодильника, после этого Raspberry Pi делает снимок этого человека (с помощью IP-камеры), а затем отправляет его в Microsoft Face API. проанализировать изображение и получить имя человека. С помощью этой информации Raspberry Pi сканирует «список доступа»: если у человека нет разрешения на доступ к холодильнику, Raspberry уведомляет владельца по электронной почте, текстовым сообщением и твиттером! (См. Изображения выше)

Почему? Система позволяет вам контролировать членов вашей семьи, особенно когда они сидят на диете или изо всех сил стараются не есть после полуночи! Или используйте это просто для удовольствия!

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

Давай начнем!

Шаг 1: подготовка

Подготовка
Подготовка

Тебе понадобится:

  • Raspberry Pi 3 (можно использовать более старые версии, но у третьего поколения есть Wi-Fi, так что это очень удобно)
  • Кнопки
  • Провода
  • Старый смартфон или камера Raspberry Pi

Первое, что вам нужно сделать, это настроить Raspberry Pi. Подробные инструкции о том, как это сделать, вы можете найти здесь и здесь, но мы рассмотрим наиболее важные шаги в этом руководстве.

  1. Загрузите Win32 DiskImager отсюда (если вы используете Windows)
  2. Загрузите SD Formatter отсюда
  3. Вставьте SD-карту в свой компьютер и отформатируйте ее с помощью SD Formatter
  4. Загрузите образ Raspbian отсюда (выберите «Raspbian Jessie with pixel»)
  5. Запускаем Win32 DiskImager, выбираем SD-карту, указываем путь к образу Raspbian, нажимаем «Написать»
  6. Вставьте SD-карту в Raspberry Pi и включите питание!

Кроме того, вам нужно будет настроить Raspberry Pi для доступа к системе через SSH. В Интернете есть много инструкций, вы можете использовать это, например, или вы можете прикрепить монитор и клавиатуру.

Теперь ваш Pi настроен, и вы готовы к работе!

Шаг 2: Изготовление сенсора

Изготовление сенсора
Изготовление сенсора
Изготовление сенсора
Изготовление сенсора
Изготовление сенсора
Изготовление сенсора

Описание шага: на этом шаге мы создадим датчик, который определяет, когда человек открывает дверь холодильника и активирует Raspberry Pi.

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

  1. Припаиваем провода к кнопкам.
  2. Прикрепите первую кнопку к дверце холодильника так, чтобы она нажималась при закрытии дверцы (см. Рисунок выше)
  3. Прикрепите вторую пуговицу к дверце холодильника, как показано на фото выше. Эту кнопку необходимо отпускать все время, кроме тех случаев, когда дверь достигает точки, когда система делает снимок. Для его настройки необходимо прикрепить что-нибудь к холодильнику, чтобы эта кнопка нажималась, когда дверца открывается до нужной степени (см. Фото выше).
  4. Подсоедините провода от кнопок к Raspberry Pi: первая кнопка к GPIO 23 и заземлению, вторая кнопка к GPIO 24 и заземлению (см. Схему фритзинга).

Примечание: я использую распиновку BCM (а не плату), подробнее о различиях читайте здесь.

После подключения к Raspberry Pi через SSH, чтобы запустить оболочку python, введите в терминале:

python3

Если вы подключаете монитор и клавиатуру к Raspberry Pi, просто запустите «Python 3 IDLE» из меню.

Следующий шаг - заставить Raspberry Pi работать с кнопками. Мы подключим специальные слушатели к контактам GPIO 23 и 24, которые будут прослушивать события «нарастающего фронта» и «спадающего фронта» на этих контактах. В случае события слушатели будут вызывать функции, которые мы определили. «Передний край» означает, что кнопка была нажата, а теперь отпущена (первая кнопка - дверь открыта), «спадающий край» означает, что кнопка была отпущена и теперь нажата (вторая кнопка - дверь достигла определенной точки). Подробнее о функциях кнопок - здесь.

Во-первых, импортируйте библиотеку, которая дает нам доступ к контактам:

импортировать RPi. GPIO как GPIO

Теперь определите специальные функции, которые будут вызываться при срабатывании события:

def sensor1 (канал): print («датчик 1 сработал») def sensor2 (канал): print («датчик 2 сработал»)

Установите тип распиновки:

GPIO.setmode (GPIO. BCM)

Настроить контакты:

GPIO.setup (23, GPIO. IN, pull_up_down = GPIO. PUD_UP) GPIO.setup (24, GPIO. IN, pull_up_down = GPIO. PUD_UP)

Прикрепите слушателей:

GPIO.add_event_detect (23, GPIO. RISING, callback = sensor1, bouncetime = 300) GPIO.add_event_detect (24, GPIO. FALLING, callback = sensor2, bouncetime = 300)

Теперь вы можете это протестировать! Если вы нажмете кнопку 1, вы увидите сообщение на терминале «сработал датчик 1», кнопка 2 выдает сообщение «сработал датчик 2».

Примечание. Когда вы закончите экспериментировать, не забудьте вызвать следующую функцию: GPIO.cleanup ().

Давайте настроим еще одну функцию, которая вызывается, когда дверь достигает точки, где мы делаем снимок! Вы можете сделать это сами или использовать мою реализацию, которую я прикрепил сюда (sensor.py)

Примечание: sensor.py используется только для целей тестирования, файлы с полной функциональностью я прикрепил к последнему шагу.

Шаг 3. Настройте IP-камеру

Настроить IP-камеру
Настроить IP-камеру
Настроить IP-камеру
Настроить IP-камеру
Настроить IP-камеру
Настроить IP-камеру

Описание шага: Теперь настроим старый смартфон как IP-камеру.

Использование смартфона в качестве IP-камеры осуществляется через приложение. Существуют разные приложения для Android, iOS, Windows Phone, которые вы можете использовать. Я выбрал ту, которая называется «IP Webcam» для Android. Это бесплатное приложение, которое легко настроить.

Запустите приложение, перейдите в «Настройки видео», чтобы настроить разрешение фотографий, которые приложение будет предоставлять. Затем нажмите «Запустить сервер» (первое изображение выше). Внизу экрана вы должны увидеть IP-адрес камеры (см. Второе изображение выше). В браузере вы можете ввести https://cam_ip_address/photo.jpg, и вы получите изображение с ip-камеры! Введите https://cam_ip_address/photoaf.jpg, чтобы получить сфокусированное изображение. Запишите этот ip-адрес, мы будем использовать его для получения изображения человека, открывающего холодильник.

Наконец, прикрепите камеру к холодильнику (последнее изображение выше).

Шаг 4: Face API

Face API
Face API

Описание шага: на этом шаге мы поговорим о Microsoft Face API, который распознает лица и идентифицирует людей.

Face API от Microsoft - это служба распознавания лиц, с помощью которой мы можем анализировать фотографии и идентифицировать людей на них.

Во-первых, вам потребуется учетная запись Microsoft Azure. Если у вас его нет, вы можете создать его бесплатно здесь.

Во-вторых, перейдите на https://portal.azure.com, нажмите «Создать» слева, введите в форму «API Cognitive Services», выберите его и нажмите «Создать». Или вы можете открыть эту ссылку. Теперь вам нужно ввести название вашей службы, выбрать тип подписки, тип API, который вам нужен (в нашем случае это Face API), местоположение, ценовой уровень, группу ресурсов и согласиться с юридическими условиями (см. Снимок экрана, добавленный к этому шагу).

В-третьих, нажмите «Все ресурсы», выберите сервис Face API и просмотрите статистику использования, учетные данные и т. Д.

Подробности Face API можно найти здесь, приведены примеры на разных языках программирования. Для этого проекта мы используем Python. Вы можете прочитать документацию и создать свой собственный набор функций, или вы можете использовать тот, который предоставлен здесь (это не полный набор функций, предоставляемых Microsoft, а только те моменты, которые необходимы для этого проекта). Мои файлы python прикреплены к этому шагу.

Перейдем к структуре работы с Face API. Чтобы использовать функцию «Идентификация», мы должны создать библиотеку людей, с помощью которых служба Face API будет распознавать фотографии, сделанные приложением. Чтобы настроить его, выполните следующие действия:

  1. Создать группу
  2. Добавить людей в эту группу
  3. Добавить лица этим людям
  4. Группа поездов
  5. Отправьте фотографию с человеком, которого вы хотите идентифицировать (вы должны предоставить фотографию и идентификатор группы, в которой служба будет искать кандидатов)
  6. Результат: В ответ вы получите список кандидатов, которые могут быть на отправленной вами фотографии.

Я создал три файла с определенным функционалом, который позволяет работать с группами, отдельными людьми и отдельными фотографиями:

  • PersonGroup.py - содержит функции, которые позволяют: создать группу, получить информацию о группе, получить список всех ваших групп, обучить группу и получить статус обучения
  • Person.py - содержит функции, которые позволяют: создать человека, получить информацию о человеке, перечислить всех лиц в указанной группе, добавить лица к указанному человеку
  • Face.py - содержит функции, которые позволяют: обнаруживать лицо на изображении, идентифицировать человека, получать имя идентифицированного человека

В файле с именем «распознавание.py» я предоставляю функции, которые позволяют вам проверять, содержит ли изображение лицо, и добавлять лица к указанному человеку (автоматически добавляет лицо из множества изображений из указанной папки).

Загрузите файл, прикрепленный к этому шагу, распакуйте его, измените глобальную переменную KEY в этих трех файлах: PersonGroup.py, Person.py и Face.py на свой собственный ключ, который вы можете найти: portal.azure.com> все ресурсы > сервис face api (или как вы его назвали)> вкладка ключей. Вы можете использовать любой из двух ключей.

Примечание: здесь мы собираемся обучить сервис Face API распознавать людей, поэтому следующие действия можно выполнять с любого компьютера (Raspberry Pi для этого не нужен) - изменения сохраняются на сервере Microsoft.

После изменения KEY запустите распознавание.py и введите следующую команду в оболочке python:

PersonGroup.create ("family", 'fff-fff')) // вы можете использовать собственное имя и идентификатор для

группа printResJson (PersonGroup.getPersonGroup ('fff-fff'))

Вы должны увидеть данные о только что созданной группе. Теперь введите:

printResJson (Person.createPerson ('fff-fff', 'имя человека'))

Теперь вы получаете идентификатор человека. Создайте папку с изображениями этого человека, чтобы все изображения содержали лицо этого человека. Вы можете использовать функцию detectFaceOnImages в признании.py, которая показывает вам, на каких фотографиях обнаружено лицо. Теперь запустите команду:

addFacesToPerson ('папка с изображениями', 'идентификатор человека, который вы получили после предыдущей команды', 'fff-fff')

Затем нам нужно обучить наш сервис, введя следующее:

PersonGroup.trainPersonGroup ('fff-fff') printResJson (PersonGroup.getPersonGroupTrainingStatus ('fff-fff'))

Теперь наша группа обучена и готова идентифицировать человека.

Чтобы проверить человека на изображении, вы можете:

Face.checkPerson (изображение, 'fff-fff')

В ответ вы получите список кандидатов и вероятностей, кто на фото.

Примечание: каждый раз, когда вы добавляете лица к человеку или человеку в группу, вы должны тренировать группу!

Шаг 5: Конфигурация Node-Red

Конфигурация Node-Red
Конфигурация Node-Red

Описание шага: на этом шаге мы создадим поток Node-Red, который будет уведомлять вас о нарушении доступа к вашему холодильнику =)

Если ваш Raspberry Pi работает на Raspbian Jessie от ноября 2015 года или более поздней версии, вам не нужно устанавливать Node-Red, потому что он уже предустановлен. Вам просто нужно его обновить. Пожалуйста, используйте руководство здесь.

Теперь нам нужно установить узел Twilio на Node-Red, чтобы мы могли вызвать текстовое сообщение. Откройте терминал и введите:

cd ~ /.node-rednpm установить node-red-node-twilio

Подробнее об узле Twilio здесь. После этого запустите Node-Red, набрав в терминале:

узел красный

Затем перейдите по адресу: https://127.0.0.1:1880/ - если вы открываете браузер на своем Raspberry Pihttps:// {raspberry_pi_ip}: 1880 / - если вы хотите открыть редактор Node-Red с другого компьютера

Чтобы узнать IP-адрес Raspberry Pi, воспользуйтесь этой инструкцией.

Теперь вам нужно найти узел Twilio в списке узлов в редакторе Node-Red (обычно он появляется после группы «social»).

Пора создать поток!

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

Наш поток начинается с узла «уведомить», который принимает POST-запрос от нашей основной программы с некоторыми данными о нарушении доступа (пример данных можно найти в узле комментариев «о получении объектов»). Этот узел немедленно отвечает сообщением «Ok», поэтому основная программа знает, что данные были получены (Flow: / notify> response with Ok> response). Зеленый узел внизу с именем msg.payload предназначен для отладки: если что-то не работает, вы можете его использовать.

Из первого узла (/ notify) данные распространяются в «Тема данных» и «Тема изображения», где соответственно добавляются темы «данные» и «изображение».

В ноде «compile» мы получаем данные (которые мы получаем на первом шаге) с темой «data» и изображение с темой «image» (изображение взято из /home/pi/image.jpg). Эти два сообщения должны быть скомпилированы в один объект, но оба объекта принимаются в разное время! Чтобы справиться с этим, мы будем использовать функцию «контекста», которая позволяет нам хранить данные между вызовами функций.

Следующим шагом будет проверка, является ли человек из нашего списка доступа или он посторонний (узел checkConditions). В данных, которые мы получаем, есть поле «trustPerson»: «true» означает, что мы знаем этого человека, но он / она нарушил разрешение на доступ, «false» означает, что этот человек является посторонним.

Когда результат «истина», мы отправляем уведомление в twitter, twilio и по электронной почте; когда результат «ложный» - только электронная почта и твилио. Мы создаем объект для электронной почты с сообщением, прикрепленным изображением и темой электронного письма, объект для twilio с сообщением. Для твиттера мы добавляем данные к объекту, если "trustPerson" истинно. Затем отправьте эти три объекта на три разных узла.

Примечание. Если следующий узел не должен получать сообщение, мы просто отправляем ему «null».

Пришло время настроить ноды для уведомлений!

Twitter Добавьте в поток узел «twitter». Откройте его двойным щелчком. Нажмите на карандаш рядом с «Twitter ID». Затем нажмите «Щелкните здесь, чтобы пройти аутентификацию в Twitter». Войдите в свою учетную запись Twitter и дайте Node-Red необходимые разрешения.

Электронная почта Добавьте в поток узел "электронная почта". Если вы не используете Gmail, вам нужно будет изменить данные в следующих полях - «Сервер» и «Порт» (вы можете найти, какой сервер и порт следует использовать на страницах справки вашего почтового агента), в противном случае не меняйте их. поля.

  • Кому> адрес электронной почты, на который будут отправляться сообщения
  • Userid> логин с вашего адреса электронной почты (возможно, то же самое, что и поле "Кому")
  • Пароль> пароль от вашей учетной записи электронной почты
  • Имя> имя для этого узла

Twilio Перейдите на https://www.twilio.com/try-twilio и зарегистрируйте учетную запись. Проверить это. Перейдите на https://www.twilio.com/console. Нажмите «Номера телефонов» (большой значок #) и создайте бесплатный номер. Если вы находитесь за пределами США, вам необходимо добавить разрешения GEO, перейдите на https://www.twilio.com/console/sms/settings/geo-pe… и добавьте свою страну.

Теперь перейдите в редактор Node-Red, добавьте узел Twilio, дважды щелкните по нему, чтобы настроить, и заполните все поля:

  • Учетные данные> Использовать локальные учетные данные
  • Twilio> редактировать

    • Account SID> взять отсюда
    • From> введите виртуальный номер, который вы создали
    • Токен> возьми отсюда
    • Имя> Twilio
  • Выход> SMS
  • Кому> ваш номер телефона
  • Имя> имя для этого узла.

Щелкните Развернуть

Теперь ваш поток готов! Вы можете проверить это, отправив запрос POST с указанным объектом!

Шаг 6: Компиляция всего проекта

Компиляция всего проекта
Компиляция всего проекта
Компиляция всего проекта
Компиляция всего проекта

Описание шага: на этом шаге мы соберем все части вместе и заставим их работать как отдельную систему.

На этом этапе вы должны:

  1. Настроить старый смартфон как ip-камеру
  2. Есть рабочие датчики
  3. Обученный Microsoft Face API
  4. Настроенный поток Node-Red

Теперь нам нужно улучшить код, который мы написали на шаге 2. В частности, функция process () вызывается, когда человек открывает дверь. В этой функции мы сделаем следующее:

  1. Получите изображение с ip-камеры и сохраните его в «/ home / pi /» с именем «image.jpg» (функция «fromIpCam» в файле «getImage»)
  2. Получить имя человека на этом изображении (функция «checkPerson» в файле «распознавание»)
  3. Проверить права доступа для этого человека (функция «проверить» в файле «доступ»)
  4. По результату функции «проверка» составить сообщение
  5. Отправить составленное сообщение в Node-Red (функция «toNodeRed» в файле «sendData»)

Примечание: чтобы увидеть полный код упомянутых функций, загрузите zip-файл, прикрепленный к этому шагу.

О функции fromIpCam. Эта функция делает запрос GET к вашей ip-камере, получает сфокусированное изображение в ответ и сохраняет его по указанному вами пути. Для этой функции необходимо указать IP-адрес камеры.

О функции «checkPerson». Функция получает в качестве параметров путь к изображению и группе, в которой вы хотите искать человека с фотографии. Во-первых, он обнаруживает лицо на предоставленном изображении (файл Face.py, функция «обнаружить»). В ответ получает идентификатор, если лицо было обнаружено. Затем он вызывает функцию «идентифицировать» (файл Face.py), которая находит похожих людей в указанной группе. В ответ он получает идентификатор человека, если человек найден. Затем вызываем функцию «человек» (файл Person.py) с идентификатором человека в качестве параметра, функция «человек» возвращает человека с указанным идентификатором, мы получаем имя человека и возвращаем его.

О функции «проверка». Эта функция помещается в файл «доступ», где также помещается «список доступа» как глобальная переменная (вы можете изменить его по своему усмотрению). Получив имя человека из предыдущей функции, функция «проверка» сравнивает этого человека со списком доступа и возвращает результат.

Примечание: полный проект прилагается к следующему шагу.

Шаг 7: Заключение

На этом этапе я прикрепил полный проект, который вы должны распаковать и поместить на свой Raspberry Pi.

Чтобы этот проект заработал, запустите файл «main.py».

Если вы управляете Raspberry Pi через SSH, вам придется запускать две программы из одной оболочки: программу python и Node-Red. Введите в терминал следующее:

узел красный

Нажмите «Ctrl + Z» и введите:

рабочие места

Вы видите процесс Node-Red. Посмотрите ID процесса и введите:

bg

Теперь Node-Red должен начать работать в фоновом режиме. Затем перейдите в каталог с вашим проектом и запустите основную программу:

python3 main.py

Примечание: не забудьте изменить KEY в файлах python (шаг 4) и учетные данные в потоке Node-Red (шаг 5).

Выполнено! Ваш холодильник в безопасности!

Надеюсь, вам понравилась эта неразрешимая вещь! Не стесняйтесь оставлять свои мысли в комментариях.

Буду признателен, если вы проголосуете за мой проект =)

Спасибо!

Рекомендуемые: