Pull to refresh

Как я научился не волноваться и полюбил машинное зрение

Reading time 5 min
Views 4.8K
Привет, Хабр! Меня зовут Нагуманов Артем, за своими плечами я имею более чем 15 летний опыт разработки программного обеспечения, управления проектами, командами, IT отделами. Меня всегда интересовала тема искусственного интеллекта и машинного зрения. Разрабатывая программное обеспечение, меня всегда посещала мысль, почему бы не добавить в enterprise приложение хоть какую-то частичку интеллекта, чтобы частично или полностью отказаться от участия пользователя в каком-либо процессе, который на первый взгляд кажется абсолютно не формализуемым.

image

Чтобы это сделать, мне каждый раз приходилось заново проходить весь путь: изучать/вспоминать подходящие библиотеки, устанавливать на виртуальную машину Linux, чтобы протестировать бесплатные инструменты по созданию и обучению нейронных сетей, находить архитектуры сетей, которые на данный момент являются венцом творения человека в мире искусственного интеллекта. Этот процесс достаточно трудоемкий и не очень веселый. Однажды, разбираясь с архитектурой очередной нейронной сети я понял, что пора положить этому конец и создать универсальный инструмент, который всю рутину возьмет на себя. А мне лишь нужно будет нажать несколько больших стеклянных кнопок и получить результат. На картинке для привлечения внимания (в первом абзаце статьи), показан пример распознавания струй воды от поливальной машины, но обо всем по порядку.

Делаем сервис распознавания


Идея у меня была следующая — сделать сайт, на который пользователь может загрузить любые изображения, нажать кнопку “Распознать” и в формате json получить результат. Но дело в том, что не существует универсального алгоритма или нейронной сети, которая сможет находить любые объекты в мире. В результате я решил сделать возможность обучать собственные модели нейронных сетей на распознавание нужных нам объектов, используя только сайт и образцы изображений, которые нужно распознавать. Перед тем как приступить к работе я проанализировал, какие существуют наработки в мире, касающиеся этой темы. Как оказалось, многие гиганты IT индустрии работают в этом направлении: Yandex, Mail.ru, Amazon. Основным минусом было то, что все эти гиганты хотят за свои сервисы денег. Этого было для меня достаточно, чтобы начать собственную разработку. У меня уже был background, и я знал, как можно хорошо находить и классифицировать объекты на изображениях, осталось только собрать все вместе и сделать удобный интерфейс.

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

  • ASP.NET (язык C#)
  • WebApi
  • JavaScript, JQuery
  • MSSQL Server
  • Python
  • Tensorflow

Первым делом я решил создать REST сервис, который будет мозгом всей системы, позволит через API принимать команды и выполнять всю черновую работу. Архитектуру нейронной сети я выбрал Mask R-CNN, данная сеть умеет находить объекты на изображении и классифицировать их.

Все шло более-менее штатно, пока я не дошел до реализации обучения собственных моделей. Процесс обучения оказался очень затратным и требовательным к железу. Конечно я это знал и раньше, но до этого, я мог себе позволить ждать обучения модели и сутки и двое, используя для вычислений CPU. Но так как идея была создать удобный и быстрый инструмент, я не мог мириться с долгим обучением модели. Вот и назрел вопрос с установкой специального сервера с подходящей видеокартой, которая будет поддерживать технологию CUDA (https://ru.wikipedia.org/wiki/CUDA) и позволит значительно сократить время на обучение модели. Чтобы не раздувать бюджет проекта я выбрал не дорогую видеокарту NVIDIA GeForce GTX 1050 Ti. Параллельно с сервисом я делал клиента на Windows Forms, который позволял бы проводить тестирование.

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

Я был несказанно рад, когда загрузил изображение, выбрал готовую модель для распознавания, нажал кнопку “Распознать” и получил первый результат.

image

Реальная задача машинного зрения


Пока я работал над системой распознавания, ко мне прилетела реальная задача – определять положение передней лопаты специальной машины, которая чистит снег на дороге. Для решения этой задачи я был не ограничен в выборе подхода к решению и с начала я хотел использовать установку специальных датчиков, которые определяют угол наклона лопаты, но быстро отказался от этой идеи. Как оказалось, эти датчики нужно постоянно калибровать из-за того, что лопату периодически снимают и ставят другую, к тому же пообщавшись с коллегами, занимающимися установкой подобных датчиков, выяснил, что эти датчики находятся на улице и доступны для саботажа. Пришла на ум идея анализировать рабочие органы управления лопатой, но как оказалось, в реальной жизни доходят до того, что снимают лопату, а на рабочих органах подают сигнал, что лопата опущена, одним словом снова не надежный вариант. Ну что же, мне не оставили выбора, кроме как воспользоваться всей мощью сервиса распознавания. Я поставил камеру в салон автомобиля, которая смотрит на переднюю лопату, собрал несколько сотен образцов лопаты, разметил их с помощью инструмента, VGG, который я встроил в сайт и начал обучение. Процесс занял примерно два часа и на 30-й эпохе я получил вполне приемлемый результат распознавания, точность распознавания была в районе 95%.

image

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

Насколько просто получилось?


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

image

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

Развитие и использование


Пример того, как все работает вживую, можно посмотреть на видео ролике.

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

Сейчас я сам пользуюсь сервисом для решения своих задач по автоматизации процессов на предприятиях, в которых можно применить машинное зрение. В дальнейшем планирую добавлять другие подходы распознавания, не только нейронные сети. Я буду очень рад, если кто-то еще с помощью данного сервиса сможет решить свои задачи.
Tags:
Hubs:
+6
Comments 7
Comments Comments 7

Articles