Найти в Дзене

ESP32-CAM в качестве источника базы изображений для Edge Impulse

Ранее мы рассмотрели процесс создания модели TinyML для использования на ESP32-Cam. В качестве источника изображений для наполнения базы использовались веб-камеры, или смартфоны. Теперь, как и обещали, рассмотрим вариант использования модуля ESP32-CAM в качестве автоматического фотофиксатора. Обратите внимание, что данная технология может быть использована не только для создания базы и последующего обучения модели в среде Edge Impulse. Сам вариант получения с ESP32-CAM потока фотографий может быть применена и в других проектах, ограничиваемых лишь вашей фантазией. Так, например, робот может заехать в малодоступное место и сделать серию фотографий какого-то объекта, причем робот может поворачивать камеру, снимая объект в динамике. В ряде случаев такая фотофиксация удобнее, чем видео. Первое, что нам понадобиться – установка очередной библиотеки в среду Arduino IDE и загрузить нужный скетч в память модуля ESP32-CAM. Библиотека EloquentEsp32cam в открытом доступе выложена по ссылке – ht
Оглавление

Ранее мы рассмотрели процесс создания модели TinyML для использования на ESP32-Cam. В качестве источника изображений для наполнения базы использовались веб-камеры, или смартфоны.

Теперь, как и обещали, рассмотрим вариант использования модуля ESP32-CAM в качестве автоматического фотофиксатора. Обратите внимание, что данная технология может быть использована не только для создания базы и последующего обучения модели в среде Edge Impulse. Сам вариант получения с ESP32-CAM потока фотографий может быть применена и в других проектах, ограничиваемых лишь вашей фантазией. Так, например, робот может заехать в малодоступное место и сделать серию фотографий какого-то объекта, причем робот может поворачивать камеру, снимая объект в динамике. В ряде случаев такая фотофиксация удобнее, чем видео.

Этап 1. Подготовка ESP32-Cam к потоковому захвату фотографий.

Первое, что нам понадобиться – установка очередной библиотеки в среду Arduino IDE и загрузить нужный скетч в память модуля ESP32-CAM.

Библиотека EloquentEsp32cam в открытом доступе выложена по ссылке

https://github.com/eloquentarduino/EloquentEsp32cam

В данном случае библиотека выложена на ресурсе github.com. Для наших задач библиотеку можно просто загрузить в виде Zip архива, воспользовавшись кнопкой

"< > Соde" – Download ZIP.

Загружаем библиотеку в Zip – архиве с github.com
Загружаем библиотеку в Zip – архиве с github.com

Получаем архив EloquentEsp32cam-main.zip

Далее следует подключение библиотеки к среде Arduino IDE. Вы уже делали подобные операции, поэтому просто кратко напомним. Используется меню среды Arduino IDE: Скетч – Подключить библиотеку – Добавить .ZIP библиотеку.

Теперь используем пример скетча, входящего в состав данной библиотеки.

Используем меню Файл – Примеры, прокручиваем до примеров из пользовательских библиотек, находим там блок примеров свежеустановленной библиотеки EloquentEsp32cam и выбираем пример "Collect_Images_for_EdgeImpulse".

Не забываем проверить подключение модуля ESP32-CAM и порт подключения. В скетч потребуется внести изменения, заполнив поля WI_FI_SSID и WI_FI_PASS.

Вносим исправления в скетч – заполняем данные вашей Wi-Fi сети
Вносим исправления в скетч – заполняем данные вашей Wi-Fi сети

Для передачи изображений мы будем использовать Wi-Fi сеть. Это ваша сеть, например, домашняя, в эти поля, между кавычками, надо будет внести ее название (ssid) и пароль (PASS). Имейте в виду, что сеть должна быть 2.4 ГГц, с вариантом 5 ГГц ESP32-CAM не работает. Если у вас нет в распоряжении стационарной сети WiFi, можете использовать мобильный вариант точки доступа со смартфона.

Все, можно загружать скетч в модуль ESP32-CAM.

Если все удачно (иногда требуется повторить несколько раз, иногда – зажать кнопку I00 до загрузки) и по экрану Arduino IDE пробежали до 100 проценты загрузки скетча, то далее нам требуется узнать IP адрес, который получил модуль ESP32-CAM в нашей сети.

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

Узнаем IP адрес, присвоенный нашему модулю ESP32-CAM
Узнаем IP адрес, присвоенный нашему модулю ESP32-CAM

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

Переходим ко второму этапу.

Этап 2. Фотографируем объекты в автоматическом режиме и получаем архив фотографий от ESP32-Cam.

Для соединения с ESP32-CAM ваше устройство (компьютер, ноутбук, смартфон) должно быть подключено к той же Wi-Fi сети, что и ESP32-CAM.

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

Итак, в браузере на смартфоне мы вводим адрес 192.168.6.107 и соединяемся с веб-страницей, созданной для ESP32-CAM.

Готовимся к съемке.
Готовимся к съемке.

При соединении мы увидим изображение, получаемое камерой. Здесь так же удобно использовать устойчивый штатив, при съемке "с рук" придется все время удерживать объект в поле зрения камеры. Рекомендуем замерить расстояние, на котором происходит съемка, в дальнейшем с такого же расстояния будет проводится распознавание объектов. В качестве примера мы будем использовать знаки "крестик" и "круг".

Вы можете поэкспериментировать с разными вариантами. Главное – знаки должны сильно отличаться друг от друга. Так, например, отличить квадрат от круга ESP32-CAM сможет с низкой вероятностью, т.к. фигуры (для ее вычислительных возможностей) очень похожи. А вот треугольник от круга – вполне. Так же можно поэкспериментировать с цветами, например, использовать красный круг и зеленый треугольник. Это значительно повысит степень распознавания, но и увеличит размеры модели, так что она может просто не поместиться в память модуля. Тогда надо уменьшить количество фотографий, например - не больше 100. Экспериментируйте, пробуйте, все получится.

Далее, для получения автоматического захвата изображений, нажимаем зеленую кнопку "Start collecting". Получаем поток фотографий, прервать который можно кнопкой "Stop". Помним, что у нас не слишком мощное вычислительное устройство в лице ESP32-CAM, а поток создается очень быстро. Так что готовьтесь почти сразу останавливать набор фотографий для базы.

Идет потоковая съемка.
Идет потоковая съемка.

После остановки потока вы можете либо очистить поток и начать все заново, (кнопка "Clear" если вам что-то не понравилось), либо загрузить полученные фото в виде одного архива (кнопка "Download"). Далее этот архив надо будет передать на то устройство, где вы работаете с Edge Impulse. Если вы использовали смартфон, то передать архив можно как с помощью почты, так и в большинстве мессенджеров, где предусмотрена отправка файлов "себе".

Набор фотографий готов к выгрузке.
Набор фотографий готов к выгрузке.

Теперь можно повторить операцию с другим объектом и так же получить архив с фотографиями. Мы ограничились двумя объектами, вы можете пробовать больше, но все время помним, что операции распознавания и так на грани возможностей процессора ESP32-CAM.

После получения всех архивов фотографий на компьютере, архивы надо распаковать, отсмотреть фото, убрать плохо получившиеся, или лишние (если вы задержались и фотографий получилось слишком много, на один объект рекомендуем не больше 100 изображений), и соединить фотографии всех объектов в одну папку. Конечно, добавить изображения в Edge Impulse можно и по очереди из каждой папки, но зачем усложнять процесс.

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

Этап 3. Создание и обучение модели в сервисе Edge Impulse.

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

1. Создаем новый проект, присваиваем ему название, например "ESP32CAM"

2. Получаем внешние данные для загрузки в проект (Getting started – Add existing data – Upload data)

 Выбираем загрузку данных с внешнего источника.
Выбираем загрузку данных с внешнего источника.

Теперь потребуется отметить, что загружать мы будем все фотографии, что есть в выбранной нами папке (Select a folder) и нажать кнопку "Обзор" для указания, где находится данная папка. Да, здесь же можно указать и label для всех фото из папки, чтобы потом вручную не ставить.

Показываем в открывшемся окне проводника путь и нажимаем кнопку загрузки данных (Upload data)

Указываем загрузку из папки
Указываем загрузку из папки

Будет вопрос, подтверждаете ли вы загрузку данных с этой конкретно папки, соглашаемся.

Если процесс прошел успешно, то вы увидите надпись об удачном выполненной работе ( Job completed) и перечень загруженных файлов.

 Работа по загрузке фотографий из папки проведена успешно
Работа по загрузке фотографий из папки проведена успешно

В разделе "Image" и в поле "Color depth" (Глубина цвета) измените значение RGB на Greyscale (Оттенки серого). Это уменьшит размер модели и увеличит ее быстродействие. Это для варианта с нашим примером, мы используем не цветные изображения. Если вы будете работать с цветом, выберите соответствующие параметры.

Далее следует работа по созданию меток полученным изображениям. Мы использовали символы "R" (для крестика) и "L" (для круга). Выбор символов обусловлен тем, что мы планируем в будущем использовать результаты распознавания для реализации поворотов реального робота направо и налево. Напомним, что в метках надо не пропустить появление фотографий второго объекта и на этом этапе присвоить новую метку.

Идет работа с метками.
Идет работа с метками.

3. Обработка данных и обучение модели.

На этом этапе создается "импульс" для проекта (Подпункт меню "Create impulse"). Процесс детально описан в предыдущих материалах цикла.

Остановимся на результатах, полученных в нашем примере.

Сформированное облако точек в разделе Generate Features.
Сформированное облако точек в разделе Generate Features.
Результаты обучения.
Результаты обучения.

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

Все, модель создана, можете проверить ее работоспособность с помощью смартфона, используя полученную ссылку или QR код. Наводим смартфон на наши картинки, получаем распознавание. Да, смартфон обычно очень неплохо справляется с этой задачей, но мы же должны научить этому модуль ESP32-CAM.

Этап 3. Загружаем модель для распознавания в ESP32-CAM.

Ранее мы рассмотрели процессы создания модели, библиотеки для Arduino IDE и загрузки модели в ESP32-CAM.

В текущем примере мы уже создали модель, так что можно переходить к этапу создания на ее основе библиотеки для Arduino IDE.

Напомним, что для этого в разделе "Deployment" (Размещение, развертывание) надо выбрать в вариантах "Arduino library", после чего нажать кнопку "Build" (Создавать, строить) внизу экрана, для запуска сборки библиотеки. Библиотека создается в виде zip архива.

Далее загружаем библиотеку в Arduino IDE (Скетч→Подключить библиотеку→ Добавить .ZIP библиотеку).

Все, можно переходить к проверке работоспособности нашей модели в случае использования ESP32-CAM в качестве и источника изображения и процессора обработки.

Напомним, что для этого вам потребуется открыть скетч-пример из меню Файл→Примеры (прокручиваем вниз, до примеров из пользовательских библиотек) →ИмяВашегоПроекта_inferencing →esp32->esp32_camera

Далее надо внести изменения в скетч, в нём необходимо изменить тип используемой камеры, выбрав камеру CAMERA_MODEL_AI_THINKER. Сохраните скетч.

Нужные строки должны выглядеть так:

//#define CAMERA_MODEL_ESP_EYE // Has PSRAM

#define CAMERA_MODEL_AI_THINKER // Has PSRAM

Все, после загрузки скетча можно пробовать работу модели. Перезагружаем модуль ESP32-CAM (кнопка RST), включаем последовательный монитор в Arduino IDE. Подносим к фотомодулю картинки с объектами и наблюдаем процент распознавания.

Итак, мы научились создавать модель и на основе фотографий, полученных со смартфона или веб-камеры, и на основе автоматизированного получения изображений с фотомодуля ESP32-CAM. Научились создавать библиотеку для Arduino IDE на основе этих данных и загружать ее в модуль ESP32-CAM для использования. Даже проверили работоспособность наших методов.

Остается последний шаг – установить модуль ESP32-CAM на нашего робота, подключить к Arduino Uno, выделить из потока распознавания нужный объект и, при успешном распознавании, передать от ESP32-CAM к Arduino Uno определенный сигнал, который далее будет обработан и запустит какой-то процесс, выполняемый роботом. Например, при распознавании крестика, ESP32-CAM передаст символ "R", а при распознавании круга – "L".

Требовать от связки Arduino Uno и ESP32-CAM больших подвигов мы вряд ли сможем, просто для распознавания изображений "на ходу", во время движения, надо использовать более мощное "железо".