В настоящее время системы распознавания лиц (face recognition) получают все более широкое распространение, начиная от систем безопасности и заканчивая различными системами контроля доступа.
В данной статье мы рассмотрим создание системы распознавания лиц на основе модуля ESP32-CAM (ESP32 Camera module), которую можно использовать в качестве системы безопасности, предотвращающей проникновение неавторизованных лиц в охраняемое помещение. ESP32-CAM представляет собой очень маленький модуль камеры с чипом ESP32-S. На основе данного модуля мы можем достаточно просто создать систему распознавания лиц, не прибегая к каким то "тяжеловесным" технологиям как, например, система распознавания лиц на основе платы Raspberry Pi с модулем камеры и библиотеки OpenCV.
Общие сведения о модуле ESP32-CAM
Модуль ESP32-CAM содержит в своем составе чип ESP32-S, очень маленького размера камеру OV2640 и слот для карт памяти формата micro SD, на которых можно хранить снимки с камеры и различные файлы. Модуль ESP32-CAM находит широкое применение в различных проектах интернета вещей (IoT). Он может использоваться в системах обнаружения лиц в офисах, школах и других охраняемых зонах, также он может использоваться для беспроводного мониторинга, беспроводной идентификации по QR коду и многих других приложениях.
Модуль ESP32-CAM можно программировать с помощью ESP-IDF или Arduino IDE. Также модуль содержит несколько контактов ввода/вывода общего назначения (GPIO pins) для подключения внешних устройств. Модуль ESP32-CAM не содержит USB разъема, поэтому для его программирования необходима плата FTDI.
Особенности модуля ESP32-CAM:
- самый маленький SoC модуль с поддержкой 802.11b/g/n Wi-Fi BT;
- 32-битный процессор с низкой потребляемой мощностью;
- тактовая частота процессора до 160MHz, суммарная вычислительная мощность до 600 DMIPS;
- встроенная 520 KB SRAM, внешняя 4MPSRAM;
- поддержка UART/SPI/I2C/PWM/ADC/DAC;
- поддержка камер OV2640 и OV7670, встроенная флэш-лампа;
- загрузка изображений через Wi-Fi;
- поддержка TF карт;
- поддержка нескольких типов спящих режимов;
- можно установить Lwip и FreeRTOS;
- поддержка режимов Wi-Fi STA/AP/STA+AP;
- "умное" конфигурирование с помощью технологии AirKiss;
- поддержка локальных и удаленных обновлений прошивки (FOTA).
Технические характеристики модуля ESP32-CAM:
- SPI Flash: по умолчанию 32Mbit;
- RAM: 520KB SRAM+ 4M PSRAM;
- поддержка TF карт: максимум 4G;
- поддержка интерфейсов UART, SPI, I2C, PWM;
- выходные форматы изображений: JPEG, BMP, GRAYSCALE;
- количество портов (IO): 9;
- напряжение питания: 5V.
Необходимые компоненты
- Модуль ESP32-CAM (купить на AliExpress).
- Плата FTDI (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема системы распознавания лиц на основе модуля ESP32-CAM представлена на следующем рисунке.
Как видите, схема очень проста. Достаточно просто подключить модуль ESP32-CAM к плате FTDI для его программирования с компьютера.
Контакты Vcc и GND модуля ESP32-CAM подключены к контактам Vcc и GND платы FTDI. Контакты Tx и Rx модуля ESP32-CAM подключены к контактам Rx и Tx платы FTDI.
Примечание: перед загрузкой кода программы в модуль замкните контакт IO0 модуля на землю. Когда контакт GPIO 0 модуля замкнут на землю (GND) – модуль находится в режиме загрузки программы (flashing mode), если он не замкнут на землю – то модуль не находится в режиме загрузки.
После загрузки программы в модуль ESP32-CAM можно отключить от него плату FTDI и подать на модуль питание 3.3V используя регулятор напряжения 7805. В результате у вас должна получиться конструкция примерно следующего вида:
Установка модуля ESP32-CAM в Arduino IDE
Мы будем программировать модуль ESP32-CAM с помощью Arduino IDE. Для этого мы в Arduino IDE должны установить дополнение (add-on) для работы с данным модулем.
Для этого в Arduino IDE выберите пункт меню File> Preferences.
Затем в открывшемся окне в поле “Additional Board Manager URLs” вставьте строку https://dl.espressif.com/dl/package_esp32_index.json как показано на рисунке ниже. После этого нажмите кнопку “OK”.
Далее в Arduino IDE выберите пункт меню Tools > Board > Boards Manager.
В открывшемся менеджера плат (Board Manager) выполните поиск ESP32, после чего из результатов поиска установите библиотеку “ESP32 by Espressif Systems“.
Код веб-сервера для камеры модуля ESP32
У нас в Arduino IDE уже есть пример кода для камеры модуля ESP32 чтобы с ее помощью осуществлять видео трансляции (video streaming) и распознавание лиц (face recognition). Откройте этот пример выбрав пункт меню File > Examples > ESP32 > Camera и из него открыв пример CameraWebServer.
Но прежде чем загружать код этого примера в свой модуль измените в нем параметры доступа к сети Wi-Fi (имя и пароль) на свои.
1 2 |
const char* ssid = "WiFi Name"; const char* password = "Password"; |
После этого в программе инициализируйте модуль камеры ESP32. В представленном примере представлены примеры инициализации 5 модулей камеры, для нашего проекта раскомментируйте строку “CAMERA_MODEL_AI_THINKER” и оставьте в комментариях остальные 4 строки. Теперь наш код программы готов к загрузке в модуль.
Для загрузки кода программы в модуль ESP32-CAM подключите плату FDTI в компьютеры и в качестве своей платы (модуля) выберите ‘ESP32 Wrover Module’. Также измените другие настройки как показано на следующем рисунке.
Перед загрузкой программы в модуль ESP32-CAM нажмите на нем кнопку сброса (reset button) и затем нажмите на кнопку upload в Arduino IDE.
Примечание: если во время загрузки кода программы у вас появились сообщения об ошибках, убедитесь в том, что контакт IO0 замкнут на землю (GND) и что вы выбрали правильные настройки в меню Tools.
После загрузки кода программы в модуль отключите его контакт IO0 от земли (GND). Затем откройте окно монитора последовательной связи и измените в нем бодовую скорость на 115200. После этого нажмите кнопку сброса на ESP32-CAM – в результате этого в окне монитора последовательной связи должен отобразиться IP адрес модуля и номер порта, к которому он подключен, как показано на следующем рисунке.
Теперь, чтобы получить доступ к видеотрансляции камеры, откройте браузер и введите в нем в строке адреса IP адрес вашего модуля ESP. После этого вас должно перебросить на страницу с видео трансляцией (streaming page). Чтобы начать видео трансляцию с модуля камеры ESP32 нажмите на кнопку ‘Start Stream’ внизу страницы.
Изменить качество видео трансляции можно изменяя параметр ‘Resolution’ на странице видео трансляции. Также вместо видео вы можете включить показ картинки нажав на кнопку ‘Get Still’, но используемый нами код примера не содержит опции для сохранения этих картинок.
После того как мы протестировали видео трансляцию с модуля ESP32-CAM, можно приступить к тестированию обнаружения лиц и их распознавания. Для этого в настройках выберите опции обнаружения лиц (detection) и их распознавания (Face recognition) как показано на следующем рисунке.
Для того чтобы использовать распознавание лиц вы сначала должны добавить/внести в список лицо. Вы можете добавить новое лицо в систему нажав на опцию ‘Enroll Face’. Произойдет несколько попыток сохранения лица. После сохранения лица система будем обнаруживать это лицо под именем subject 0 и после этого его можно будет использовать в нашей системе безопасности.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
В следующем пункте приведен код программы, также его можно скачать по следующей ссылке.
Исходный код программы (скетча)
Библиотеку esp_camera.h можно скачать по следующей ссылке (либо самостоятельно можете скачать ее с github'а).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
#include "esp_camera.h" #include <WiFi.h> // WARNING!!! Убедитесь в том, что в настройках Arduino IDE вы выбрали ESP32 Wrover Module, // или другую плату, которая имеет // Select camera model (выбираем модель камеры) //#define CAMERA_MODEL_WROVER_KIT //#define CAMERA_MODEL_ESP_EYE //#define CAMERA_MODEL_M5STACK_PSRAM //#define CAMERA_MODEL_M5STACK_WIDE #define CAMERA_MODEL_AI_THINKER #include "camera_pins.h" const char* ssid = "Galaxy-M20"; const char* password = "ac312124"; void startCameraServer(); void setup() { Serial.begin(115200); Serial.setDebugOutput(true); Serial.println(); camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; //init with high specs to pre-allocate larger buffers if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } #if defined(CAMERA_MODEL_ESP_EYE) pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP); #endif // camera init (инициализация камеры) esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } sensor_t * s = esp_camera_sensor_get(); //initial sensors are flipped vertically and colors are a bit saturated if (s->id.PID == OV3660_PID) { s->set_vflip(s, 1);//flip it back s->set_brightness(s, 1);//up the blightness just a bit (увеличиваем немного яркость) s->set_saturation(s, -2);//lower the saturation (уменьшаем немного насыщенность) } //drop down frame size for higher initial frame rate (уменьшаем размер кадра чтобы увеличить частоту кадров) s->set_framesize(s, FRAMESIZE_QVGA); #if defined(CAMERA_MODEL_M5STACK_WIDE) s->set_vflip(s, 1); s->set_hmirror(s, 1); #endif WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); startCameraServer(); Serial.print("Camera Ready! Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect"); } void loop() { // put your main code here, to run repeatedly: delay(10000); } |
Эти слова "Всё просто" убивают на самом деле далеко это от реальности
1 нет библиотеки esp_camera.h /\скачивал с гетХаба но её ардуино Айди не воспринимает
2 после загрузки плата стала нагреваться в руках нельзя держать, ни при подключении питания от ПК ни от аккумулятора 3.5В
3 и без библиотеки которая указана в заголовке ничего не работает пожалуйста если она у вас есть разместите её архивом, без ссылок на ГетХаб там всё меняется каждый день, новые названия и папки с дополнениями
Разместил перед кодом ссылку на скачивание этой библиотеки, но мне кажется с гитхаба ее скачивать все же лучше потому что там вы скачаете самую свежую версию библиотеки, я же свою ссылку на скачивание часто обновлять не смогу. Гитхаб для того и создан ведь чтобы у конечных пользователей не болела голова насчет того где же скачать самую свежую версию библиотеки
Не знаю, как у вас это работает, у меня ничего работает, не работает, у вас есть здесь везде отметки, начало установки на библиотеки, где вы взяли эти библиотеки, пожалуйста, загрузите на своём сайте архивы этих библиоте, потому что скачиваешь с. Там вообще нет таких названий папок, просто это не работает.
Добрый день! А Вы можете сделать камеру смартфона (Андроид) выносной? Цель : извлечь основной модуль камеры из смартфона, и соединить проводом 1-1, 5 метра. Варианты доп камеры блютуз, вай фай, USB - не подходят. Есть приложения которые работают только с основной камерой. Если это возможно, напишите на электронную почту, заранее спасибо.
Здравствуйте. Нет, к сожалению не занимался этой проблематикой, не могу подсказать по этому вопросу ничего дельного