Есть ли жизнь после Nvidia?

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

Есть ли жизнь после Nvidia?

Предпосылки к исследованию

Наша команда разработала собственное цифровое решение для мониторинга транспортного потока, которое работает на одноплатном компьютере Nvidia Jetson. Однако санкции со стороны Запада внесли свои коррективы в будущее проекта: нам пришлось искать альтернативные варианты для бесперебойной работы системы.

Прежде, чем ответить на вопрос: “Есть ли жизнь после Nvidia?”, хотелось бы немного рассказать о самих задачах и методах их решения.

В рамках создания интеллектуальной транспортной системы перед нами стояли следующие задачи:

  • подсчет автомобильного трафика,
  • подсчет пешеходного трафика,
  • определение средней скорости движения на дороге,
  • определение гос. номера автомобиля.

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

Таким образом, эти задачи становятся задачами компьютерного зрения. Один из методов решения таких задач заключается в использовании детектора и трекера объектов.

Детектор объектов ‒ это алгоритм, который позволяет находить объекты на изображении. Например, на изображении с камеры можно обнаружить транспортные средства (ТС), вычислить их положение в кадре, а также классифицировать их (легковое авто, грузовое, автобус и т.д.).

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

Сначала детектор объектов используется для нахождения всех ТС в кадре. Затем трекер объектов используется для отслеживания перемещения каждого обнаруженного ТС. Когда ТС покидает область перекрестка, оно считается учтенным, и данные о количестве выехавших ТС обновляются.

Чисто теоретически…

Перед тем как перейти к исследованию аналогов одноплатника, нам нужно рассмотреть те алгоритмы, которые необходимы для решения задач и соотнести с тем, что предлагает рынок. Довольно подробно мы отразили эту часть вопроса в статье на Хабр “Расчет транспортного потока на основе YOLOv5 и DeepSORT на базе Deepstream”.

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

Про детекторы

Существует большое количество алгоритмов, способных решать задачу детекции.

<i>Рассматриваемые нами детекторы</i>
Рассматриваемые нами детекторы

Из существующих алгоритмов, YOLOv5 является наиболее подходящим по следующим причинам:

1. Возможность работы в реальном времени, так как решение относится к one-stage детекторам и требует небольших вычислительных затрат;

2. Большое коммьюнити, что позволяет легко находить решение практически любых проблем;

3. Решение опубликовано 25 января 2020 года, благодаря чему уже найдено и исправлено большое количество багов;

4. Развернуть решение можно на любом ноутбуке по несложной инструкции.

Существуют и более новые версии YOLO с новым набором функций, например, YOLOv6 и YOLOv8. YOLOv8, дополнительно позволяет выполнять еще и сегментацию объектов. Однако данная версия не имеет плюсов, описанных во 2 и 3 пунктах.

Про трекеры

Трекинг в первую очередь нацелен на присвоение уникального идентификатора каждому объекту. Это позволяет соотнести один и тот же объект между кадрами. Для этого используются данные детектора объектов и специально разработанный алгоритм, позволяющий отслеживать объекты в кадре по мере их перемещения. При помощи присвоения идентификатора (ID) каждому объекту становится возможным вести подсчёт уникальных объектов на видео.

Так же, как и в случае с детекторами, существует большое количество решений. Несмотря на это, всё же наиболее оптимальным представляется DeepSORT по ниже указанным причинам.

  1. Возможность работы в реальном времени, так как решение является относительно легковесным;
  2. Легкий запуск, так как есть реализация на Tensorflow и PyTorch.
  3. Большое комьюнити (не такое, как у YOLOv5, но все же).
  4. Имеет большое количество реализаций для различных платформ и фреймворков.
<i>Трекер DeepSORT</i>
Трекер DeepSORT

Таким образом, реализация описанного решения включает в себя 4 основных шага:

  1. принять видеопоток;
  2. пропустить его через детектор YOLOv5;
  3. полученные детекции обработать с помощью DeepSORT;
  4. проанализировать треки, полученные на основе работы DeepSORT (подсчитать проехавшие автомобили).

Проблема ресурсов

Из выше сказанного можно видеть, что для анализа дорожного трафика используются нейросетевые алгоритмы. Несмотря на высокую эффективность, они всё же имеют один существенный недостаток: требовательность к ресурсам. Для исполнения нейронных сетей нужно либо специальное оборудование и его поддержка, либо максимально эффективное использование существующего. Для ИТС наиболее актуально встраиваемое (embedded) железо. Такое оборудование позволяет на месте собирать статистику с исследуемых участков дороги. Однако это усложняет задачу, так как данное оборудование имеет ограниченные вычислительные мощности по сравнению с их северными аналогами.

Почему Nvidia?

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

Как правило, они предоставляют возможность конвертировать нейросеть в нужный формат и использовать её максимально эффективно. Nvidia здесь не исключение, а скорее даже наоборот, некий эталон. Nvidia предоставляет следующие продукты для ускорения вычислений.

CUDA ‒ платформа параллельных вычислений от Nvidia, которая позволяет использовать графические процессоры для ускорения вычислений.

TensorRT – это оптимизированный для работы с глубокими нейронными сетями фреймворк от Nvidia, который позволяет ускорить работу нейросетей за счет оптимизации их архитектуры и вычислений. Использование этих технологий позволяет значительно ускорить обработку видео и анализ данных в реальном времени.

Jetson – это серия встраиваемых вычислительных платформ от Nvidia, предназначенных для работы с искусственным интеллектом и машинным обучением. Они оснащены мощными процессорами и графическими ускорителями, которые позволяют обрабатывать данные в реальном времени и выполнять сложные вычисления. Самый дешёвый из них ‒ Jetson Nano. Он содержит маломощный процессор с архитектурой ARM (4 ядра на 1.5 ГГц), а также видеокарту с 128 ядрами.

Nvidia даже предоставляет SDK, который включает в себя мощь CUDA и TensorRT, и который оптимизирован для работы на Jetson – Deepstream.

<i>Вычислительные процессоры NVidia: Jetson Nano и Jetson TX2</i>
Вычислительные процессоры NVidia: Jetson Nano и Jetson TX2

Безусловно, Jetson является лидером среди конкурентов, так как сопровождается понятной и полной документацией с большим количеством примеров. Однако санкции со стороны компании Nvidia в отношении РФ затрудняют покупку продукции.

Аналоги

До проведения НИР мы рассмотрели аналоги одноплатного компьютера Nvidia Jetson.

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

Первый из них ‒ это Rockchip.

<i>Характеристики Rockchip</i>
Характеристики Rockchip

Rockchip RK-3588S-PC — это одноплатный компьютер, оснащенный 4-х ядерным процессором Cortex-A76 @ до 2.4 ГГц, 4-х ядерным видеопроцессором Arm Mali-G610 MP4 с поддержкой OpenGL ES3.2 / OpenCL 2.2 / Vulkan1.1, 6 TOPS NPU и декодирование видео 8Kp60 H.265 / VP9 / AVS2, 4Kp60 AV1 и кодирование видео 8Kp30 H.265/H.264.

На выбор по оперативной памяти представлены конфигурации на 4 Гб, 8 Гб, 16 Гб или 32 Гб LPDDR4 / LPDDR4x / LPDDR5.

Для проведения НИР мы остановили внимание на этом варианте. Решение выбрать именно Rockchip было принято по нескольким причинам:

1. Его относительная дешевизна, по сравнению с аналогами. Как бы здесь все было просто, будь у нас неограниченный бюджет. Но мы живем в реальном мире с реальными заказчиками, для которых цена играет не последнюю роль. Поэтому нас интересовали одноплатники дешевле Jetson Nano

2. Время и предсказуемость доставки. Получить его можно в течении 1-го месяца после заказа. Это быстро, сравнительно с любым устройством Nvidia Jetson, которые сейчас имеют проблемы с поставками и ждать их предстоит дольше.

3. Rockchip RK3588S-PC оснащен NPU модулем, способным быстро производить на себе многие вычисления, необходимые для обработки изображений с помощью нейросети.

4. NPU модуль Rockchip может частично покрыть задачи, которые могут выполнять инструменты, предоставляемые с платформой Nvidia.

В ходе изучения данного устройства выявили следующие недостатки:

1. Скудная документация (большая ее часть на китайском).

2. Малое количество примеров в официальных репозиториях и часть из них не работают.

3. Слабая поддержка пользователей.

4. Проблема с конвертацией собственных моделей под NPU Rockchip.

Вообще существует целый класс подобных Raspberry образных устройств с NPU, например, Orange Pi. Большинство из них обладают схожим с Rockchip нейропроцессором.

Такие устройства зачастую имеют 2 дистрибутива операционных систем, которые предоставляет производитель. Первый это стандартный GNU/Linux, обычно Debian. Второй ‒ это своя версия андроида. Из-под андроида в теории можно использовать Tensorflow lite. Он может исполнять нейронные сети как и на обычном GPU устройства, так и на возможных сопроцессорах, если производитель соблюдает некий набор стандартов.

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

Второй ‒ Huawei Atlas 500

Периферийная ИИ-станция Huawei Atlas 500 также предназначена для использования на границе вычислительных систем для анализа больших данных. Устройство выполнено в компактном корпусе и характеризуется исключительной плотностью размещения вычислительных ресурсов. Основное назначение станции — интеллектуальные системы типа «умный город», автоматизация производственных процессов.

Atlas обладает мощным NPU модулем, который делает inference модели YOLOv5s за 2.2 миллисекунды. Таблица с характеристиками здесь. Среди достоинств ‒ очень мощный NPU, который поставляется сразу в промышленном корпусе.

В ходе исследования столкнулись с теми же проблемами, что и у Rockchip ‒ плохая документация, языковой барьер и малое количество примеров работы с моделями. Также столкнулись еще с одним существенным недостатком в виде слабого CPU, который не позволяет производить подготовку данных перед обработкой моделью стандартными средствами. Предоставляемая библиотека ACL в теории должна брать эти задачи на себя. Однако ее документация также страдает, а большая часть примеров не запускается.

Третий вариант ‒ это Sophon

В наших глазах это некая тёмная лошадка. имеют несколько edge устройств, которые, судя по характеристикам, конкурируют c Jetson Nano и TX2 (краткая таблица со сравнением устройств ниже).

Так же, как и Атлас, устройства поставляются сразу в промышленном корпусе. Вместе с устройствами подставляется специальный SDK.

BMNNSDK (BITMAIN Neural Network SDK) предоставляет ряд программных инструментов, включая базовую среду драйверов, компилятор и инструмент inference.

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

<i>Сравнение edge устройств Sophon</i>
Сравнение edge устройств Sophon

Переходим к практике

Список задач

Изначально Rockchip приобретался для того, чтобы попробовать заменить Nvidia Jetson, который используется сейчас для решения следующих задач:

  • Object detection – детектор объектов на базе YOLOv5 (поиск объектов в кадре и их классификация);
  • Object tracker – трекер объектов в видеопоследовательности, на Jetson используются трекеры NvDCF и DeepSORT;
  • Text recognition. Используется в целях распознавания номеров. На Jetson используется проект NomeroffNet или Deepstream-lpr.

Детекторы

Делимся результатами тестирования алгоритмов на базе Rockchip.

Default YOLOv5s

Стандартный формат YOLOv5 (PyTorch) создан для того, чтобы inference модели можно было производить на основе фреймворка PyTorch.

Фреймворк способен производить операцию inference с использованием видеокарты Nvidia или же с использованием CPU (библиотеки есть как для архитектуры x86, так и для arm). Данный формат можно также запустить на Rockchip, однако inference будет производиться только с использованием CPU, что не имеет смысла, так как будет выполняться слишком долго из-за его малой мощности. Поэтому для запуска inference с использованием NPU на базе Rockchip существует rknn-toolkit, использующий формат модели ‘.rknn’. Таким образом, конвертация позволяет перенести вычисления на NPU (нейросетевой процессор).

В официальных примерах от Rockchip есть реализация детектора YOLO с примером модели YOLOv5s, после конвертации модели из её стандартного формата “.pt” (формат модели, используемый фреймворком PyTorch) в формат, используемый на Rockchip “.rknn”, YOLO снимает детекции с кадра и отдает позиции, название объекта и точность определения.

При конвертации возникли трудности, связанные с малым количеством информации в документации со стороны производителя Rockchip. Изначально не было понимания, где должен запускаться этот пример и что нужно для его корректной работы. Решением стала установка Python библиотеки rknn-toolkit2 из официального репозитория на ноутбук и запуск проекта на этом ноутбуке.

После конвертации YOLO-модели в формат моделей Rockchip - “.rknn” было принято решение запустить эту модель на самом Rockchip. Для этого пришлось установить на него rknn-toolkit2-lite, так как rknn-toolkit2, как оказалось, предназначался только для работы вне Rockchip RK3588S-PC.

После установки и небольшой доработки примера по конвертации (изменение rknn на rknn-lite) получилось запустить стандартный inference модели YOLOv5s на самом Rockchip. И уже после этого получилось создать полноценный детектор объектов.

Custom YOLOv5s

Для того, чтобы разобраться с тем, как конвертировать custom модель YOLOv5 (обученную на основе других классов) под Rockchip, ушло довольно много времени, так как по документации было много вопросов, с которыми пришлось разбираться самостоятельно. В итоге был разработан алгоритм конвертации для YOLOv5-моделей любых версий в .rknn формат.

Для начала необходимо конвертировать YOLO-модель из формата “.pt” в общий формат моделей “.onnx”.

После этого уже можно конвертировать полученную модель формата “.onnx” в формат, с которым может работать Rockchip, используя нейропроцессор - “.rknn”.

Подробная инструкция по конвертации описана ниже.

1. Конвертировать модель в onnx, при помощи репозитория YOLO.

2. Убедиться в том, что opset конвертированной модели <=12.

3. Просмотреть структуру модели и найти outputs.

Изменить файл test.py. Указать названия ваших входных и выходных моделей:

10:ONNX_MODEL = ‘yolov5s.onnx’

11:RKNN_MODEL = ‘yolov5s.rknn’

Изменить CLASSES (список классов) для используемой модели.

4. Добавить в функцию rknn.load_onnx аргумент outputs=['', '', ''.]. Изменить значения массива outputs на outputs значения объектов conv.

5. Запустить файл test.py

Трекеры

Оптический трекер

В качестве оптического трекера был проверен алгоритм centroid трекера объектов. Он основывается на координатах рамки, внутри которой находится объект. Эти координаты он получает от модели YOLOv5s. По координатам рамки он находит центральное положение, запоминает его и присваивает объекту уникальный id. Затем вычисляется Евклидово расстояние между созданными объектами и объектами на следующем кадре и исходя из этого определяется, куда переместился объект. На данный момент оптический трекер работает на скорости около 13 кадров в секунду.

Плюсы оптического трекера

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

Минусы оптического трекера

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

SORT трекер

SORT трекер подразумевает алгоритмический подход к отслеживанию объектов при помощи детекции. SORT игнорирует прочие элементы за пределами детектируемого объекта. Он также использует местоположение и размер рамки, полученной от YOLO как для оценки движения, так и для сопоставления данных по кадрам.

Сначала он показывал скорость обработки около 5 кадров в секунду. Оптимизация SORT трекера прошла успешно, средняя производительность стала держаться в промежутке от 12 до 27 кадров в секунду. Оптимизация была сделана через разделение на потоки получения кадров, inference на нейропроцессоре и работы SORT трекера с отрисовкой изображений.

Плюсы SORT трекера

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

Минусы SORT трекера

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

DeepSORT трекер

Алгоритм DeepSORT объединяет алгоритм SORT и алгоритм ReIdentification (Deep).

ReIdentification алгоритм – это алгоритм, который запоминает внешние признаки того или иного объекта, в результате чего может сопоставить объект на двух разных кадрах за счёт его визуальных признаков. DeepSORT в качестве ReIdentification модели использует архитектуру ResNet. Изначально ResNet нацелен на классификацию изображений, но так как архитектура способна извлекать уникальные признаки из изображения она находит применение в других областях.

Авторы DeepSORT изменили архитектуру ResNet так, что убрали из нее слой, отвечающий за определение класса изображения. Поэтому алгоритм использует нейронную сеть, которая выдает вектор признаков, он сравнивается с векторами признаков на других кадрах. При схожести данных признаков делается вывод, что объект один и тот же. Помимо этого существуют реализации с использованием архитектуры MobileNetV2.

Для адаптации под Rockchip была выбрана модель «mobilenetv2_bottleneck_wts.pt» из репозитория «https://github.com/levan92/deep_sort_realtime ». Для конвертации модели в формат Rockchip было необходимо сначала привести модель формата PyTorch в формат onnx. После этого можно уже можно было конвертировать модель в формат rknn, немного видоизменив пример конвертации YOLO.

Данный алгоритм позволяет не терять объект при перекрытии его другим каким-либо объектом или временном исчезновении из кадра. Алгоритм SORT такими свойствами не обладает.

Авторам DeepSORT обучена ResNet на базе 1,100,000 картинок с более 1000 разных людей. Поэтому DeepSORT способен лучше работать с людьми, однако применим он для совершенно разных объектов. Если же есть цель добиться максимальной производительности, то советуется обучить нейронную сеть на базе фотографий целевых объектов.

Плюсы DeepSORT трекера

Точность его работы в разы выше, чем у SORT трекера. Правильно настроенный DeepSORT трекер гораздо реже теряет объекты в кадре.

Минусы DeepSORT трекера

Было потрачено достаточно много времени на адаптацию проекта DeepSORT под Rockchip, также на данный момент скорость работы DeepSORTt трекера недостаточно высока для трекинга объектов в режиме реального времени.

Работа DeepSORT трекера ‒ очень ресурсоемкая операция, как для NPU устройства (для выполнения inference нейронной сети), так и для CPU (расчет вектора признаков и работа с каждым треком), поэтому для добавления новых возможностей в проект, например, определения номеров транспортных средств, придется поработать над оптимизацией трекера, так как он может нагружать процессор до 70-ти процентов.

Распознавание номеров автомобилей

Решение этой задачи на данный момент невозможно на Rockchip, так как в примерах Rockchip не получилось найти пример по конвертации моделей, которые распознают текст на изображении.

Оптимизации

За время работы с Rockchip нами были предприняты попытки использовать разные типы оптимизации.

  1. Сокращение кода и избавление от ненужных функций, использующихся в примерах. Этот метод дал выигрыш около 1-го кадра в секунду, но сильно код не сократил.
  2. Многопоточность. Было произведено разбиение функций на потоки: получение кадров из видеопотока, предобработка полученного изображения, отрисовка детекций/треков на изображении, отдача кадров по http. Благодаря этому методу получалось ускорить работу примерно в 2 раза без потери точности.
  3. Главное, чем помогла многопоточность, это распараллеливание действий. Благодаря этому получилось оптимизировать код так, чтобы имелась возможность одновременно обрабатывать изображения и транслировать результаты через http трансляцию. Все это делается без заметных потерь в производительности.
  4. Пересоздание полигонов. Для повышения точности была предпринята попытка изменить полигоны, за счет которых происходит определение зоны выезда и зоны въезда. Полигоны были расположены только в зонах въезда и выезда автомобилей, чтобы исключить лишние срабатывания за счет реинициализации Id.
Есть ли жизнь после Nvidia?

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

Оптимизация работы DeepSORT. Для начала было необходимо переписать DeepSORT под работу с RknnToolkit. Это получилось сделать благодаря изменению файла «deep_sort_realtime/deep_sort_realtime/embedder/embedder_pytorch.py», но этого оказалось недостаточно, скорость работы трекера составила около 1-2 кадров в секунду. Для большего ускорения работы DeepSORT трекера была предпринята попытка сделать обработку изображений методом батчевания, по 20 изображений за раз. Это ускорило работу трекера до 4-5 кадров в секунду. После решения проблемы с долгим inference появилась другая проблема. На математические операции для сравнения полученных векторов на основе inference модели в DeepSORT трекере могло уходить по секунде на один кадр. Пока не получилось придумать оптимального решения для этой проблемы, но небольшой прирост в скорости (до 6-7 кадров в секунду) удалось получить благодаря распараллеливанию математических вычислений внутри DeepSORT трекера.

Перспективы развития исследования

Основными перспективами развития исследований для одноплатного компьютера Rockchip RK3588-S-PC являются следующие направления:

  1. Распознавание номеров автомобилей. Для этого планируется разработать алгоритм конвертации модели, необходимой для перевода текста с изображения в строковые данные;
  2. Попробовать упростить алгоритм DeepSORT трекера. Благодаря его упрощению, должны появиться ресурсы, которые позволят ускорить трекинг;
  3. Еще одним направлением для развития является оптимизация имеющихся наработок, так как оптимизация может значительно ускорить имеющиеся программы и открыть новые возможности для исследований на Rockchip RK3588-S-PC;
  4. Исследовать NNAPI под Андроид. Android Neural Networks API (NNAPI) — это Android C API, предназначенный для выполнения ресурсоемких операций машинного обучения на устройствах Android. NNAPI предназначен для обеспечения базового уровня функциональности для высокоуровневых сред машинного обучения, таких как TensorFlow Lite и Caffe2, которые создают и обучают нейронные сети. Rockchip RK-3588S-PC не поддерживает работу с NNAPI, поэтому планируется приобрести другую плату и оценить целесообразность работы с этим API.

Есть ли жизнь без Nvidia?

Действительно, существуют устройства, которые могут быть альтернативой продуктам Nvidia. Устройства и их SDK сложны в освоении во многом из-за проблем с документацией.

Изучаемые устройства требуют высокую квалификацию разработчика для развертывания собственных моделей, а также любого другого использования вычислительных мощностей (OpenCL, Vulkan, RKNN Toolkit, нативные кодеки).

<i>Сравнение Rockchip и Jetson</i>
Сравнение Rockchip и Jetson

На данный момент Rockchip RK3588S может быть использован для решения задач, где нужен только “Object detection”, при помощи SORT трекера, DeepSORT трекер сейчас работает на скорости 6-7 кадров в секунду, этого недостаточно для трекинга в режиме реального времени.

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

55
Начать дискуссию