Оглавление:
- Шаг 1. Объяснение архитектуры модели обнаружения объектов
- Шаг 2: Подготовьте среду
- Шаг 3. Обучите модель обнаружения объектов с помощью Keras
- Шаг 4. Преобразуйте его в формат.kmodel
- Шаг 5. Запустите микропрограмму Micropython
- Шаг 6: Резюме
Видео: Обнаружение объектов с помощью Sipeed MaiX Board (Kendryte K210): 6 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
В продолжение моей предыдущей статьи о распознавании изображений с помощью Sipeed MaiX Boards я решил написать еще один урок, посвященный обнаружению объектов. Недавно появилось интересное оборудование с чипом Kendryte K210, в том числе Seeed AI Hat для периферийных вычислений, M5StickV стека M5 и HuskyLens от DFRobot (хотя у него проприетарная прошивка и больше нацелена на начинающих). Благодаря низкой цене Kendryte K210 понравился людям, желающим добавить компьютерное зрение в свои проекты. Но, как обычно с китайскими аппаратными продуктами, отсутствует техническая поддержка, и это то, что я пытаюсь улучшить своими статьями и видео. Но имейте в виду, что я не вхожу в команду разработчиков Kendryte или Sipeed и не могу ответить на все вопросы, связанные с их продуктом.
Имея это в виду, давайте начнем! Мы начнем с краткого (и упрощенного) обзора того, как работают модели CNN для распознавания объектов.
ОБНОВЛЕНИЕ, МАЙ 2020: Увидев, что моя статья и видео об обнаружении объектов с досками K210 по-прежнему очень популярны и среди лучших результатов на YouTube и Google, я решил обновить статью, включив в нее информацию о aXeleRate, фреймворке для искусственного интеллекта на основе Keras. Край развиваю. aXeleRate, по сути, основан на коллекции скриптов, которые я использовал для обучения моделей распознавания изображений / обнаружения объектов - объединенных в единую структуру и оптимизированных для рабочего процесса в Google Colab. Пользоваться им удобнее и актуальнее.
Вы все еще можете увидеть старую версию статьи на steemit.com.
Шаг 1. Объяснение архитектуры модели обнаружения объектов
Модели распознавания изображений (или классификации изображений) принимают все изображение в качестве входных данных и выводят список вероятностей для каждого класса, который мы пытаемся распознать. Это очень полезно, если интересующий нас объект занимает большую часть изображения и нас не волнует его расположение. Но что, если наш проект (скажем, камера слежения за лицом) требует, чтобы мы не только знали тип объекта на изображении, но и его координаты. А как насчет проекта, требующего обнаружения нескольких объектов (например, для подсчета)?
Вот когда пригодятся модели обнаружения объектов. В этой статье мы будем использовать архитектуру YOLO (вы посмотрите только один раз) и сосредоточимся на объяснении внутренней механики этой конкретной архитектуры.
Мы пытаемся определить, какие объекты присутствуют на картинке и каковы их координаты. Поскольку машинное обучение - это не волшебство и не «думающая машина», а просто алгоритм, который использует статистику для оптимизации функции (нейронной сети) для лучшего решения конкретной проблемы. Нам нужно перефразировать эту проблему, чтобы сделать ее более «оптимизируемой». Наивным подходом здесь было бы иметь алгоритм, минимизирующий потерю (разницу) между его предсказанием и правильными координатами объекта. Это будет работать очень хорошо, пока у нас есть только один объект на изображении. Для нескольких объектов мы используем другой подход - мы добавляем сетку и заставляем нашу сеть предсказывать присутствие (или отсутствие) объекта (ов) в каждой сетке. Звучит здорово, но по-прежнему оставляет слишком много неопределенности для сети - как вывести прогноз и что делать, когда есть несколько объектов с центром внутри одной ячейки сетки? Нам нужно добавить еще одно ограничение - так называемые якоря. Якоря - это начальные размеры (ширина, высота), некоторые из которых (наиболее близкие к размеру объекта) будут изменены до размера объекта - с использованием некоторых выходных данных нейронной сети (окончательная карта функций).
Итак, вот общее представление о том, что происходит, когда нейронная сеть архитектуры YOLO выполняет обнаружение объекта на изображении. В соответствии с особенностями, обнаруженными сетью экстрактора признаков, для каждой ячейки сетки делается набор прогнозов, который включает смещение привязки, вероятность привязки и класс привязки. Потом с малой вероятностью отбрасываем прогнозы и вуаля!
Шаг 2: Подготовьте среду
В основе aXeleRate лежит замечательный проект penny4860, детектор цифр SVHN yolo-v2. aXeleRate выводит эту реализацию детектора YOLO в Keras на новый уровень и использует свою удобную систему конфигурации для обучения и преобразования сетей распознавания изображений / обнаружения объектов и сегментации изображений с различными внутренними процессами.
Есть два способа использовать aXeleRate: запускать локально на машине Ubuntu или в Google Colab. Для работы в Google Colab взгляните на этот пример:
Блокнот Colab для обнаружения объектов PASCAL-VOC
Обучение вашей модели локально и экспорт ее для использования с аппаратным ускорением теперь также намного проще. Я настоятельно рекомендую вам установить все необходимые зависимости в среде Anaconda, чтобы отделить ваш проект от других и избежать конфликтов.
Загрузите установщик здесь.
После завершения установки создайте новую среду:
conda create -n yolo python = 3.7
Давайте активируем новую среду
Конда активировать йоло
Перед вашей оболочкой bash появится префикс с именем среды, указывающий, что вы сейчас работаете в этой среде.
Установите aXeleRate на свой локальный компьютер с помощью
pip install git +
А затем запустите это, чтобы загрузить скрипты, которые понадобятся вам для обучения и вывода:
git clone
Вы можете запускать быстрые тесты с помощью tests_training.py в папке aXeleRate. Он будет выполнять обучение и вывод для каждого типа модели, сохранять и конвертировать обученные модели. Поскольку это обучение только для 5 эпох, а набор данных очень мал, вы не сможете получить полезные модели, но этот скрипт предназначен только для проверки отсутствия ошибок.
Шаг 3. Обучите модель обнаружения объектов с помощью Keras
Теперь мы можем запустить обучающий сценарий с файлом конфигурации. Поскольку реализация Keras детектора объектов YOLO довольно сложна, вместо того, чтобы объяснять каждый соответствующий фрагмент кода, я объясню, как настроить обучение, а также опишу соответствующие модули, на случай, если вы захотите внести в них некоторые изменения самостоятельно.
Начнем с примера игрушки и обучим детектор енотов. Внутри папки / config есть файл конфигурации raccoon_detector.json. Мы выбрали MobileNet7_5 в качестве архитектуры (где 7_5 - это альфа-параметр исходной реализации Mobilenet, управляющий шириной сети) и 224x224 в качестве размера ввода. Давайте посмотрим на самые важные параметры в конфиге:
Тип - это интерфейс модели - Classifier, Detector или SegnetArchitecture - это серверная часть модели (средство извлечения функций)
- Полный Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Дополнительную информацию о якорях можно найти здесь
Ярлыки - это ярлыки, присутствующие в вашем наборе данных. ВАЖНО: Пожалуйста, перечислите все метки, присутствующие в наборе данных.
object_scale определяет, насколько наказывать за неправильное предсказание достоверности предсказателей объекта
no_object_scale определяет, насколько наказывать за неправильный прогноз достоверности предикторов, не являющихся объектами
Coord_scale определяет, насколько штрафовать за неправильные прогнозы положения и размера (x, y, w, h)
class_scale определяет, насколько штрафовать за неправильное предсказание класса
Увеличение - увеличение изображения, изменение размера, сдвиг и размытие изображения для предотвращения переобучения и большего разнообразия в наборе данных.
train_times, validation_times - сколько раз повторять набор данных. Полезно, если у вас есть аугментация
включено
first_trainable_layer - позволяет заморозить определенные слои, если вы используете предварительно обученную сеть объектов
Теперь нам нужно загрузить набор данных, который я опубликовал на моем Google Диске (исходный набор данных), который представляет собой набор данных по обнаружению енотов, содержащий 150 аннотированных изображений.
Обязательно измените строки в файле конфигурации (train_image_folder, train_annot_folder) соответствующим образом, а затем запустите обучение с помощью следующей команды:
python axelerate / train.py -c config / raccoon_detector.json
train.py считывает конфигурацию из файла.json и обучает модель с помощью скрипта axelerate / networks / yolo / yolo_frontend.py. yolo / backend / loss.py - это то место, где реализована пользовательская функция потерь, а yolo / backend / network.py - это место, где создается модель (входные слои, экстрактор функций и слои обнаружения вместе). axelerate / networks / common_utils / fit.py - это скрипт, который реализует процесс обучения, а axelerate / networks / common_utils / feature.py содержит экстракторы функций. Если вы собираетесь использовать обученную модель с чипом K210 и прошивкой Micropython, из-за ограничений памяти вы можете выбрать между MobileNet (2_5, 5_0 и 7_5) и TinyYolo, но я обнаружил, что MobileNet дает лучшую точность обнаружения.
Поскольку это игрушечный пример и содержит всего 150 изображений енотов, процесс обучения должен быть довольно быстрым, даже без графического процессора, хотя точность будет далека от звездной. Для проекта, связанного с работой, я обучил детектор дорожных знаков и детектор чисел, оба набора данных включали более нескольких тысяч обучающих примеров.
Шаг 4. Преобразуйте его в формат.kmodel
С aXeleRate преобразование модели выполняется автоматически - это, наверное, самое большое отличие от старой версии обучающих скриптов! Кроме того, вы получаете файлы модели и график обучения, аккуратно сохраненные в папке проекта. Также я обнаружил, что точность проверки иногда не дает оценки реальной производительности модели для обнаружения объектов, и поэтому я добавил mAP в качестве метрики проверки для моделей обнаружения объектов. Вы можете узнать больше о карте здесь.
Если средняя средняя точность mAP (наша метрика проверки) не улучшается в течение 20 периодов, обучение будет прекращено преждевременно. Каждый раз, когда mAP улучшается, модель сохраняется в папке проекта. После завершения обучения aXeleRate автоматически конвертирует лучшую модель в указанные форматы - на данный момент вы можете выбрать «tflite», «k210» или «edgetpu».
А теперь переходим к последнему шагу, собственно, запуску нашей модели на оборудовании Sipeed!
Шаг 5. Запустите микропрограмму Micropython
Можно выполнить логический вывод с нашей моделью обнаружения объектов с помощью кода C, но для удобства мы будем использовать вместо него прошивку Micropython и MaixPy IDE.
Загрузите MaixPy IDE отсюда и прошивку micropython отсюда. Вы можете использовать python-скрипт kflash.py для записи прошивки или загрузить здесь отдельный графический интерфейс.
Скопируйте model.kmodel в корень SD-карты и вставьте SD-карту в Sipeed Maix Bit (или другое устройство K210). В качестве альтернативы вы можете записать.kmodel во флэш-память устройства. В моем примере скрипт читает.kmodel из флэш-памяти. Если вы используете SD-карту, измените эту строку
task = kpu.load (0x200000)
к
task = kpu.load ("/ sd / model.kmodel")
Откройте MaixPy IDE и нажмите кнопку подключения. Откройте скрипт raccoon_detector.py из папки example_scripts / k210 / Detector и нажмите кнопку «Пуск». Вы должны видеть прямую трансляцию с камеры с ограничивающими рамками вокруг… ну, еноты. Вы можете повысить точность модели, предоставив больше обучающих примеров, но имейте в виду, что это очень маленькая модель (1,9 M), и у нее будут проблемы с обнаружением мелких объектов (из-за низкого разрешения).
Один из вопросов, который я получил в комментариях к моей предыдущей статье о распознавании изображений, заключается в том, как отправить результаты обнаружения через UART / I2C на другое устройство, подключенное к платам разработки Sipeed. В моем репозитории на github вы сможете найти еще один пример скрипта, raccoon_detector_uart.py, который (как вы уже догадались) обнаруживает енотов и отправляет координаты ограничивающих прямоугольников через UART. Имейте в виду, что контакты, используемые для связи UART, отличаются на разных платах, это то, что вам нужно проверить самостоятельно в документации.
Шаг 6: Резюме
Kendryte K210 - надежный чип для компьютерного зрения, гибкий, хотя и с ограниченным объемом доступной памяти. До сих пор в моих руководствах мы рассматривали его использование для распознавания настраиваемых объектов, обнаружения настраиваемых объектов и выполнения некоторых задач компьютерного зрения на основе OpenMV. Я точно знаю, что он также подходит для распознавания лиц, и с некоторой доработкой должна быть возможность выполнять обнаружение позы и сегментацию изображения (вы можете использовать aXeleRate для обучения модели семантической сегментации, но я еще не реализовал логический вывод с K210). Не стесняйтесь взглянуть на проблемы репозитория aXeleRate и сделать PR, если вы думаете, что есть некоторые улучшения, которые вы можете внести!
Вот несколько статей, которые я использовал при написании этого руководства, посмотрите, хотите ли вы узнать больше об обнаружении объектов с помощью нейронных сетей:
Детекторы объектов ограничивающей рамки: понимая YOLO, смотришь только один раз
Понимание YOLO (больше математики)
Подробное руководство о том, как локализация объектов YOLO работает с Keras (часть 2)
Обнаружение объектов в реальном времени с помощью YOLO, YOLOv2 и теперь YOLOv3
Надеюсь, вы сможете использовать полученные знания для создания потрясающих проектов с использованием машинного зрения! Вы можете купить платы Sipeed здесь, они являются одними из самых дешевых вариантов, доступных для ML во встроенных системах.
Добавьте меня в LinkedIn, если у вас есть какие-либо вопросы, и подпишитесь на мой канал на YouTube, чтобы получать уведомления о более интересных проектах, связанных с машинным обучением и робототехникой.
Рекомендуемые:
Обнаружение объектов Raspberry Pi: 7 шагов
Обнаружение объектов Raspberry Pi: в этом руководстве представлены пошаговые инструкции по настройке API обнаружения объектов TensorFlow на Raspberry Pi. Выполнив действия, описанные в этом руководстве, вы сможете использовать Raspberry Pi для обнаружения объектов на видео в реальном времени с P
Обнаружение объектов с помощью Dragonboard 410c или 820c с использованием OpenCV и Tensorflow .: 4 шага
Обнаружение объектов W / Dragonboard 410c или 820c с использованием OpenCV и Tensorflow. В этой инструкции описывается, как установить OpenCV, Tensorflow и фреймворки машинного обучения для Python 3.5 для запуска приложения Object Detection
Обнаружение объектов во время вождения радиоуправляемой машины: 9 шагов
Обнаружение объектов во время вождения радиоуправляемого автомобиля: этот проект посвящен использованию ультразвуковых датчиков на автомобиле для обнаружения препятствий
Обнаружение опухолей головного мозга с помощью МРТ с помощью Matlab: 6 шагов
Обнаружение опухоли головного мозга с помощью МРТ с помощью Matlab: Авторы: Мадхумита Каннан, Генри Нгуен, Эшли Уррутия Авила, Мей Джин Этот код MATLAB представляет собой программу для определения точного размера, формы и местоположения опухоли, обнаруженной на снимках МРТ головного мозга пациента. Эта программа изначально предназначена для работы с детектором опухолей
Обнаружение визуальных объектов с помощью камеры (TfCD): 15 шагов (с изображениями)
Обнаружение визуальных объектов с помощью камеры (TfCD): когнитивные сервисы, которые могут распознавать эмоции, лица людей или простые объекты, в настоящее время все еще находятся на ранней стадии разработки, но с машинным обучением эта технология все больше развивается. Мы можем ожидать увидеть больше этой магии в