Введение

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

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

Что такое OpenCV AI Kit

Люксонис: ДУБ — D

Комплект OpenCV AI Kit (OAK) появился, когда группа создателей сформировалась вокруг идеи использования пространственного ИИ и компьютерного зрения для расширения человеческого восприятия.

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

Что такое пространственный ИИ?

Пространственный ИИ — это способность системы визуального ИИ принимать решения на основе двух факторов:

  1. Визуальное восприятие: ИИ, который может «видеть» и «интерпретировать» свое окружение визуально. Хорошим примером может быть система, в которой камера подключена к процессору и работает нейронная сеть для обнаружения объектов, которая может обнаруживать кошку, человека или автомобиль в сцене, на которую смотрит камера.

2. Восприятие глубины: ИИ, который может понимать, насколько далеко находятся объекты. На жаргоне компьютерного зрения «глубина» просто означает «насколько далеко».

Идея пространственного ИИ вдохновлена ​​человеческим зрением: мы используем наши глаза, чтобы интерпретировать наше окружение, и мы также используем наши два глаза (то есть стереозрение), чтобы воспринимать, насколько далеко от нас находятся предметы.

По словам его создателей, OpenCV AI Kit — это пространственная электростанция искусственного интеллекта, которая способна одновременно запускать расширенные нейронные сети, предоставляя глубину от двух стереокамер и информацию о цвете от одной камеры 4K в центре. Камеры OAK построены на базе ускорителя искусственного интеллекта Myriad X, что делает их компактными и мощными.

Существуют разные типы устройств OAK: OAK–1, OAK–D, OAK–D–Lite, OAK–D–IoT и т. д. Буква D в названии камеры означает «Глубина». Таким образом, мы можем думать об OAK-D как о камере 4K с возможностью запуска нейронных сетей и расчета расстояния до объектов.

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

Возможности

Есть две основные задачи, которые может решить OAK: запуск нейронных сетей на граничном устройстве и расчет расстояния и позиционирование объекта от кадра. Эта комбинация дает нам очень мощный инструмент.

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

Давайте посмотрим, чего мы можем достичь, используя OpenCV AI Kit.

Обзор

Существующие модели CV можно использовать для дальнейшего преобразования в подходящий формат, либо можно обучить модель с нуля.

Полезный совет: Luxonis предоставляет ноутбуки для учебных моделей для многих целей. В настоящее время они предлагают модели MobileNetv2-SSD, tiny-YOLOv3, tiny-YOLOv4, YOLOv5 и Deeplabv3+ для обучения. Кроме того, можно изучить существующие проекты. в Luxonis repo.

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

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

Обучение

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

В этой записной книжке авторы используют версию TensorFlow 1.x. Согласно нашему исследованию, необходимо использовать TF1 вместо TF2 из-за проблем на этапе преобразования модели. Некоторые модели TensorFlow 2.x не могут быть успешно преобразованы в формат OpenVino (по крайней мере, без глубокого изучения и модификации модели). О преобразовании шагов мы поговорим чуть дальше.

Первым шагом в обучении является подготовка данных. Мы будем обучать модель с использованием фреймворка Darknet. Это означает, что данные должны быть подготовлены для формата даркнета. Не вдаваясь в подробности, нам нужно скачать репозиторий Даркнет, создать txt файлы с аннотациями данных, создать конфигурационные файлы и запустить процесс обучения.

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

Преобразование

Преобразование является одним из наиболее важных шагов. Когда модель готова, пришло время конвертировать ее для работы на камере ОАК–Д, или вы можете выбрать существующую модель из Зоопарка моделей. Также нужно учитывать, что не все модели можно конвертировать. Не все операции доступны для OpenVino convert. Здесь вы можете найти поддерживаемые операции.

Поскольку мы работаем с ноутбуком, предоставленным Luxonis, продолжим работу с полученной моделью. Мы остановились на шаге обучения, и теперь у нас есть готовая модель даркнета. Во-первых, нам нужно преобразовать модель даркнета в модель TensorFlow. Мы можем использовать этот репозиторий для преобразования нашей модели. Теперь вы можете преобразовать модель, выполнив эту команду:

python convert_weights_pb.py --class_names PATH_TO_obj.names --data_format NHWC --weights_file PATH_TO_yolov4-tiny_best.weights --tiny

Сейчас модель конвертируется в TensorFlow 1, что необходимо в связи с предстоящим конвертированием. Если вы используете модель TensorFlow 2, то следующий шаг может вызвать ошибки. Вам необходимо установить OpenVino toolkit для дальнейшей конвертации. Шаги по установке также представлены в блокноте Luxonis. Если вы успешно установили инструментарий и подготовили модель TF, вы готовы к следующему преобразованию. Обязательно измените файл yolo_v4_tiny.json в соответствии с количеством классов в модели.

При преобразовании модели в IR следует использовать файл mo.py из набора инструментов OpenVino:

python deployment_tools/model_optimizer/mo.py \
--input_model frozen_darknet_yolov4_model.pb \
--tensorflow_use_custom_operations_config yolo_v4_tiny.json \
--batch 1 \
--data_type FP16 \
--reverse_input_channel \
--output_dir TinyIR

Эта команда создает файлы .xml и .bin. Теперь мы должны скомпилировать модель IR в .blob для использования в модулях/платформе DepthAI.

blobconverter можно установить с помощью pip. Для последнего шага мы должны:

import blobconverterblob_path = blobconverter.from_openvino(
xml=xmlfile,
bin=binfile,
data_type="FP16",
shaves=5
)

Вот и все! Мы получаем .blob-файл модели, и теперь он готов к использованию в среде камеры ОАК–Д.

Трубопровод

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

Luxonis предоставляет визуальный редактор пайплайнов для создания пайплайнов. Мы можем создать конвейер с помощью этого компоновщика или создать его с помощью библиотеки depthai. Давайте визуализируем пайплайн в билдере, но реализуем его с помощью библиотеки python.

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

Во-первых, мы должны импортировать библиотеку DepthAI и создать объект конвейера:

import depthai
pipeline = depthai.Pipeline()

Нам нужно определить все узлы и связи между ними для репликации конвейера. Мы определяем источники ввода и XLinkOut для взаимодействия с выходами и обработки изображений с камеры. XLinkOuts могут иметь имена потоков, поэтому мы можем получить к ним доступ для получения результатов. Обратите внимание, что мы будем использовать два выхода основной камеры: xout_rgb и xout_vid. Первый будет содержать измененную версию кадра для ввода для сети YOLO, а второй — полный кадр.

На изображении ниже вы можете увидеть, какие кадры мы можем получить с камеры.

Мы также определим настройки и свойства для камер и модели YOLO. Обратите внимание, что мы используем YoloSpatialDetectionNetwork, что позволяет нам одновременно обрабатывать результаты обнаружения и пространственные изображения. Вы должны указать параметры YOLO, которые использовались во время обучения.

Есть две части конвейерного графа, которые не связаны ссылками. Первый график связан с обнаружением номера и обработкой пространственного изображения, а второй график связан с кадрированием и распознаванием изображения номерного знака. Чтобы соединить эти две части, мы будем использовать XLinks и узел ImageManip.

Давайте определим ImageManip и NeuralNetwork для распознавания номерных знаков. Мы будем использовать существующую модель для распознавания номерных знаков из модельного зоопарка. Модель обучалась на китайских номерных знаках, но мы можем использовать ее для любого типа номеров, если проигнорируем часть, предсказывающую регион.

Теперь нам нужно соединить узлы между собой.

На данном этапе мы успешно реализовали весь конвейер. Теперь нам нужно подключиться к нашему устройству и запустить конвейер. После этого мы сможем получить все необходимые данные с камеры.

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

Как упоминалось ранее, у нас нет прямой связи между двумя частями конвейера. Это связано с масштабированием и кадрированием изображений номерных знаков. Для преобразования изображений пластин и связи между двумя частями конвейера мы используем ImageManipCofig:

На этом этапе мы выделили все важные части для реализации текущего демонстрационного проекта.

Заключение

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

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

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

Аппаратная часть устройства также на высоте. Основная камера с разрешением 4K, стереопара камер и Myriad X VPU вместе составляют очень мощное устройство.

Эта статья написана @danya.kosmin, инженером по машинному обучению Akvelon.