Как мы разработали сервис для контроля бизнес-процессов на основе ИИ
Я Павел, бэкенд-разработчик сервиса интеллектуальной видеоаналитики zool.ai в компании Programming Store. В статье вместе с фулстек-разработчиком Еленой рассказал с какими трудностями мы столкнулись и какие технологии использовали при создании продукта.
Содержание
Как все начиналось: рождение 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 объектов.
Затем клиенты стали обращаться к нам с узконаправленными задачами — определение оружия, перчаток на руках. Мы пришли к выводу, что готовые датасеты нам не подходят, они выполнены некачественно, и решили собирать их самостоятельно.
Хотя сбор датасетов не требует каких-то специфических навыков, оказалось, что это довольно долго и не так уж и просто. Мы не смогли заниматься разработкой и собирать датасеты одновременно, поэтому набрали в команду специальных людей, ответственных за набор данных.
Кейс: сокращение издержек в производстве изделий из титана
Для решения этой задачи мы использовали метод Харалика. Это метод текстурного анализа изображений. Его применяют для поиска дефектов на большинстве металлических поверхностей, на пластике и других изделиях, имеющих однородную поверхность.
При решении этого кейса неожиданным для нас оказалось, что самый ресурсозатратный процесс – это определение условий тестирования.
Мы собирали тестовый стенд, нам нужно было выстроить правильный свет, подобрать камеру и определить скорость, с которой необходимо передвигать титановый прут под камерой.
Кейс: модуль распознавания оружия для повышения безопасности в школе
Готовые датасеты нам снова не подошли, потому что они имели некачественную разметку, либо некачественный подбор изображений. Поэтому собирали датасет своими силами.
Работа с моделями не всегда монотонный и скучный труд, как это может показаться. Иногда удается немножко покривляться на камеру и побегать по офису с макетами оружия. :)
В этом проекте мы остановились на определении пистолетов и автоматов. Получили множество ложных срабатываний: деревья, бордюр, тени.
Чтобы избежать таких ошибок, мы решили «привязывать» оружие к человеку. Если система определяет оружие, мы сначала проверяем, есть ли рядом человек.
Кажется, что задача на определение оружия кажется логичной и востребованной для сферы видеоаналитики. И можно предположить, что существуют готовые решения, но на самом деле это не так.
Выводы
Начать работать с искусственным интеллектом может каждый. Для этого достаточно базовых навыков разработчика и желания углубиться в эту сферу.
Также многие думают, что machine learning – это про сложные формулы нейросети. На самом деле чаще всего это работа с данными и их анализ.
Самая креативная часть разработки – это тестирование модели.
Входить в эту сферу еще не поздно. Хотя кажется, что уже много готовых решений существует на рынке, но это не так. И промышленность, и другие сферы очень нуждаются в креативных решениях в сфере искусственного интеллекта.