Как мы разработали сервис для контроля бизнес-процессов на основе ИИ

Я Павел, бэкенд-разработчик сервиса интеллектуальной видеоаналитики zool.ai в компании Programming Store. В статье вместе с фулстек-разработчиком Еленой рассказал с какими трудностями мы столкнулись и какие технологии использовали при создании продукта.

Как мы разработали сервис для контроля бизнес-процессов на основе ИИ

Содержание

Павел
Бэкенд-разработчик zool.ai

Как все начиналось: рождение zool.ai и первый кейс

В компании Programming Store появилась идея разработать сервис видеоаналитики с применением искусственного интеллекта. И нас с Леной позвали в этот проект в качестве разработчиков.

До этого мы не работали с нейросетями, но тема ИИ была актуальной, популярной, поэтому мы с удовольствием приняли предложение. Я стал писать логику нейросети, Елена обучала наш сервис определять объекты.

Нашим первым кейсом стала разработка решения для сети автомоек и автосервисов, находящихся в Ижевске. Заказчик хотел получить систему, которая фиксирует въезд/выезд автомобилей и определяет автономера.

Так мы с Леной начали свой путь в ИИ :)
Так мы с Леной начали свой путь в ИИ :)

Первые трудности

  • Нужно было разобраться какие технологии применять: как забрать кадр с видеопотока, как детектировать автомобиль на этом кадре и как определить автономер.
  • Мы не понимали как устроен бизнес-процесс: как ведется съемка, с какого ракурса, как заезжают автомобили, по какой траектории, и в какой момент нужно фиксировать событие въезда.
  • У нас не было сервиса/платформы. Необходимо было разработать как будет выглядеть наш сервис в будущем и какой функционал выполнять.

Мы разделили работу над проектом на два этапа: сначала решили научить zool.ai обнаруживать автомобиль и затем распознавать номер. Чтобы приступить к работе, мы запросили архив с видеозаписями у нашего клиента.

Технические решения и подходы

Задача 1: получение, извлечение, качественных кадров с видео и их обработка

  • Нам нужно было получать качественные кадры, в которых четко виден автомобиль и можно легко определить его номер.
    Для этого мы решили придумать — «виртуальную линию». Когда автомобиль пересекал ее, система фиксировала событие и отправляла изображение на последующую обработку для распознавания.
  • Извлечение и обработку кадров с видео обеспечивала библиотека OpenCV на Python.
  • Чтобы в последующем с этого кадра задетектировать автомобиль, мы использовали фреймворк YOLA.

Задача 2: считывание номеров

Для считывания номеров мы использовали фреймворк на Python. С помощью YOLO находили ключевые точки госномера, затем переводили их в подходящий для нейросети формат, далее она считывала символы.

Задача 3: демонстрация обработанного результата пользователю

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

Чтобы пользователю было понятнее, что происходит «под капотом» у нейросети, мы решили отобразить процессы в веб-интерфейсе в виде стрима, видеопотока.

На Python нашли решение, как можно имитировать стрим при помощи динамической подмены кадров в виде закодированных изображений. Браузер достаточно умен, и распознает это в виде стрима в интерфейс.

Вот стек технологий, которые мы изучили за время разработки:

  • YOLO.
  • OpenCV.
  • TensorFlo.
  • Roboflow.
  • PyTorch.
Первая версия нашего продукта. На скриншоте мы видим госномер, дату, функцию и на какой камере это было зафиксировано
Первая версия нашего продукта. На скриншоте мы видим госномер, дату, функцию и на какой камере это было зафиксировано
Схема процесса. Далее мы добавили имитацию видеопотока и вывод в интерфейс
Схема процесса. Далее мы добавили имитацию видеопотока и вывод в интерфейс

«Дом» для zool.ai: как собирали сервер

Елена
Фулстек-разработчик

Облачный сервер vs физический сервер

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

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

Выбор комплектующих

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

Ключевые характеристики при выборе видеокарты:

  • Объем памяти — необходим для работы с большими данными и сложными моделями.
  • Количество CUDA-ядер. CUDA-ядра ответственны за параллельную обработку множества простых задач.
  • Количество тензорных ядер: специализируются на задачах ИИ.
  • Поддержка специализированных библиотек и совместимость с фреймворками машинного обучения. Сейчас на рынке существует два производителя видеокарт — это NVIDIA и AMD. Но для решения задач искусственного интеллекта подходит только производитель NVIDIA, эти видеокарты поддерживают платформу CUDA.

Ключевые характеристики при выборе процессора:

  • Количество ядер.
  • Тактовая частота.
Характеристики нашего сервера
Характеристики нашего сервера

Ошибка «Кабачок»

При запуске нашего сервиса на самом первом простом сервере у нас возникла ошибка. Мы в команде разработки в шутку называем ее «Кабачком», потому что в описании ошибки используется аббревиатура «Кабак».

Суть ошибки в том, что происходит какая-то проблема с декодированием при обработке видеопотока. Это приводит к появлению артефактов на кадрах или к их утере.

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

Поэтому для продовой версии мы решили собирать сервер мощнее и выбрали процессор Threadripper. Это очень крутой процессор. Таким образом мы сняли часть нагрузки с видеокарт.

Что касается видеокарт, мы выбрали две карты GeForce RTX 4090.

Ошибка «Кабачок»
Ошибка «Кабачок»

Датасеты

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

Для определения автомобилей мы использовали предобученную модель YOLO. Она может фиксировать людей, автомобили и еще порядка 80 объектов.

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

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

На фото zool.ai обнаружил человека в кадре, снятом на камеру с ночным режимом. Чтобы это стало возможным, мы собрали собственный датасет. Завесили кабинет пледами, создали темноту, сняли материал и вручную отметили, где на кадрах находятся люди. 
На фото zool.ai обнаружил человека в кадре, снятом на камеру с ночным режимом. Чтобы это стало возможным, мы собрали собственный датасет. Завесили кабинет пледами, создали темноту, сняли материал и вручную отметили, где на кадрах находятся люди. 

Кейс: сокращение издержек в производстве изделий из титана

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

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

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

Так мы определяли условия тестирования
Так мы определяли условия тестирования

Кейс: модуль распознавания оружия для повышения безопасности в школе

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

Работа с моделями не всегда монотонный и скучный труд, как это может показаться. Иногда удается немножко покривляться на камеру и побегать по офису с макетами оружия. :)

В этом проекте мы остановились на определении пистолетов и автоматов. Получили множество ложных срабатываний: деревья, бордюр, тени.

Чтобы избежать таких ошибок, мы решили «привязывать» оружие к человеку. Если система определяет оружие, мы сначала проверяем, есть ли рядом человек.

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

Ложное срабатывание: бордюр определился как оружие
Ложное срабатывание: бордюр определился как оружие
Наш продакт-менеджер Иван с муляжом оружия, тренирует zool.ai
Наш продакт-менеджер Иван с муляжом оружия, тренирует zool.ai

Выводы

Начать работать с искусственным интеллектом может каждый. Для этого достаточно базовых навыков разработчика и желания углубиться в эту сферу.

Также многие думают, что machine learning – это про сложные формулы нейросети. На самом деле чаще всего это работа с данными и их анализ.

Самая креативная часть разработки – это тестирование модели.

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

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