- Регистрация
- 12.04.17
- Сообщения
- 19.095
- Реакции
- 107
- Репутация
- 0
Привет, Хабр! Меня зовут Нагуманов Артем, за своими плечами я имею более чем 15 летний опыт разработки программного обеспечения, управления проектами, командами, IT отделами. Меня всегда интересовала тема искусственного интеллекта и машинного зрения. Разрабатывая программное обеспечение, меня всегда посещала мысль, почему бы не добавить в enterprise приложение хоть какую-то частичку интеллекта, чтобы частично или полностью отказаться от участия пользователя в каком-либо процессе, который на первый взгляд кажется абсолютно не формализуемым.
Чтобы это сделать, мне каждый раз приходилось заново проходить весь путь: изучать/вспоминать подходящие библиотеки, устанавливать на виртуальную машину Linux, чтобы протестировать бесплатные инструменты по созданию и обучению нейронных сетей, находить архитектуры сетей, которые на данный момент являются венцом творения человека в мире искусственного интеллекта. Этот процесс достаточно трудоемкий и не очень веселый. Однажды, разбираясь с архитектурой очередной нейронной сети я понял, что пора положить этому конец и создать универсальный инструмент, который всю рутину возьмет на себя. А мне лишь нужно будет нажать несколько больших стеклянных кнопок и получить результат. На картинке для привлечения внимания (в первом абзаце статьи), показан пример распознавания струй воды от поливальной машины, но обо всем по порядку.
Делаем сервис распознавания
Идея у меня была следующая — сделать сайт, на который пользователь может загрузить любые изображения, нажать кнопку “Распознать” и в формате json получить результат. Но дело в том, что не существует универсального алгоритма или нейронной сети, которая сможет находить любые объекты в мире. В результате я решил сделать возможность обучать собственные модели нейронных сетей на распознавание нужных нам объектов, используя только сайт и образцы изображений, которые нужно распознавать. Перед тем как приступить к работе я проанализировал, какие существуют наработки в мире, касающиеся этой темы. Как оказалось, многие гиганты IT индустрии работают в этом направлении: Yandex, Mail.ru, Amazon. Основным минусом было то, что все эти гиганты хотят за свои сервисы денег. Этого было для меня достаточно, чтобы начать собственную разработку. У меня уже был background, и я знал, как можно хорошо находить и классифицировать объекты на изображениях, осталось только собрать все вместе и сделать удобный интерфейс.
В подавляющем большинстве случаев в своих проектах я использую технологии Microsoft, что значительно сказалось на технологиях, используемых в данном проекте:
Первым делом я решил создать REST сервис, который будет мозгом всей системы, позволит через API принимать команды и выполнять всю черновую работу. Архитектуру нейронной сети я выбрал Mask R-CNN, данная сеть умеет находить объекты на изображении и классифицировать их.
Все шло более-менее штатно, пока я не дошел до реализации обучения собственных моделей. Процесс обучения оказался очень затратным и требовательным к железу. Конечно я это знал и раньше, но до этого, я мог себе позволить ждать обучения модели и сутки и двое, используя для вычислений CPU. Но так как идея была создать удобный и быстрый инструмент, я не мог мириться с долгим обучением модели. Вот и назрел вопрос с установкой специального сервера с подходящей видеокартой, которая будет поддерживать технологию CUDA (
На втором этапе я сделал сайт, который по сути является клиентом к сервису. Я особо не заморачивался с дизайном и даже не брал готовый шаблон, все написал самостоятельно, используя только то, что дает Visual Studio из коробки. На создание и тестирование сайта ушло еще три месяца.
Я был несказанно рад, когда загрузил изображение, выбрал готовую модель для распознавания, нажал кнопку “Распознать” и получил первый результат.
Реальная задача машинного зрения
Пока я работал над системой распознавания, ко мне прилетела реальная задача – определять положение передней лопаты специальной машины, которая чистит снег на дороге. Для решения этой задачи я был не ограничен в выборе подхода к решению и с начала я хотел использовать установку специальных датчиков, которые определяют угол наклона лопаты, но быстро отказался от этой идеи. Как оказалось, эти датчики нужно постоянно калибровать из-за того, что лопату периодически снимают и ставят другую, к тому же пообщавшись с коллегами, занимающимися установкой подобных датчиков, выяснил, что эти датчики находятся на улице и доступны для саботажа. Пришла на ум идея анализировать рабочие органы управления лопатой, но как оказалось, в реальной жизни доходят до того, что снимают лопату, а на рабочих органах подают сигнал, что лопата опущена, одним словом снова не надежный вариант. Ну что же, мне не оставили выбора, кроме как воспользоваться всей мощью сервиса распознавания. Я поставил камеру в салон автомобиля, которая смотрит на переднюю лопату, собрал несколько сотен образцов лопаты, разметил их с помощью инструмента, VGG, который я встроил в сайт и начал обучение. Процесс занял примерно два часа и на 30-й эпохе я получил вполне приемлемый результат распознавания, точность распознавания была в районе 95%.
Чтобы система полноценно могла работать на автомобиле, пришлось ее доработать: добавить возможность загружать фотоснимки через ftp, а не только через API т.к. видеокамера позволяла делать фотоснимок и отправлять его на указанный ftp. Добавил возможность сохранять результат в БД, а затем через API за указанный промежуток времени получать результаты, анализировать их и записывать в учетную систему, написанную на 1С, которая к слову является огромной системой контроля, анализирующей тысячи автомобилей одновременно и контролирующей множество параметров, таких как пробег, машино-часы, топливо в баке, ездки, работу на холостых оборотах и т.д., но это совсем отдельная история. Первый вариант контроля лопаты готов, но в бою он будет протестирован только когда выпадет снег.
Насколько просто получилось?
Основная идея сервиса распознавания — это простота создания и обучения собственных моделей. Чтобы понять, реально ли любой человек сможет создать и обучить собственную модель, я попросил свою помощницу создать модель распознавания струй воды от поливальной машины. Единственные входные данные, которые я ей дал, был видеоролик работы поливальной машины, снятый из кабины, и адрес сервиса распознавания, вечером я ей поставил эту задачу, а уже утром, зайдя в систему, увидел готовую модель, которая реально работала. Ниже скриншот окна, в котором происходит обучение модели.
По мере обучения сохраняются эпохи модели, и мы можем, не прерывая процесс обучения протестировать любую эпоху.
Развитие и использование
Пример того, как все работает вживую, можно посмотреть
Я долго думал над тем, что если любой желающий может создать собственную модель, то почему не сделать возможность поделиться этой моделью с другими пользователями системы. В результате я добавил раздел, в который можно одним кликом мыши разместить удачную модель и любой участник может ей пользоваться. Сервис является полностью бесплатным.
Сейчас я сам пользуюсь сервисом для решения своих задач по автоматизации процессов на предприятиях, в которых можно применить машинное зрение. В дальнейшем планирую добавлять другие подходы распознавания, не только нейронные сети. Я буду очень рад, если кто-то еще с помощью данного сервиса сможет решить свои задачи.
Чтобы это сделать, мне каждый раз приходилось заново проходить весь путь: изучать/вспоминать подходящие библиотеки, устанавливать на виртуальную машину 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 (
You must be registered for see links
) и позволит значительно сократить время на обучение модели. Чтобы не раздувать бюджет проекта я выбрал не дорогую видеокарту NVIDIA GeForce GTX 1050 Ti. Параллельно с сервисом я делал клиента на Windows Forms, который позволял бы проводить тестирование.На втором этапе я сделал сайт, который по сути является клиентом к сервису. Я особо не заморачивался с дизайном и даже не брал готовый шаблон, все написал самостоятельно, используя только то, что дает Visual Studio из коробки. На создание и тестирование сайта ушло еще три месяца.
Я был несказанно рад, когда загрузил изображение, выбрал готовую модель для распознавания, нажал кнопку “Распознать” и получил первый результат.
Реальная задача машинного зрения
Пока я работал над системой распознавания, ко мне прилетела реальная задача – определять положение передней лопаты специальной машины, которая чистит снег на дороге. Для решения этой задачи я был не ограничен в выборе подхода к решению и с начала я хотел использовать установку специальных датчиков, которые определяют угол наклона лопаты, но быстро отказался от этой идеи. Как оказалось, эти датчики нужно постоянно калибровать из-за того, что лопату периодически снимают и ставят другую, к тому же пообщавшись с коллегами, занимающимися установкой подобных датчиков, выяснил, что эти датчики находятся на улице и доступны для саботажа. Пришла на ум идея анализировать рабочие органы управления лопатой, но как оказалось, в реальной жизни доходят до того, что снимают лопату, а на рабочих органах подают сигнал, что лопата опущена, одним словом снова не надежный вариант. Ну что же, мне не оставили выбора, кроме как воспользоваться всей мощью сервиса распознавания. Я поставил камеру в салон автомобиля, которая смотрит на переднюю лопату, собрал несколько сотен образцов лопаты, разметил их с помощью инструмента, VGG, который я встроил в сайт и начал обучение. Процесс занял примерно два часа и на 30-й эпохе я получил вполне приемлемый результат распознавания, точность распознавания была в районе 95%.
Чтобы система полноценно могла работать на автомобиле, пришлось ее доработать: добавить возможность загружать фотоснимки через ftp, а не только через API т.к. видеокамера позволяла делать фотоснимок и отправлять его на указанный ftp. Добавил возможность сохранять результат в БД, а затем через API за указанный промежуток времени получать результаты, анализировать их и записывать в учетную систему, написанную на 1С, которая к слову является огромной системой контроля, анализирующей тысячи автомобилей одновременно и контролирующей множество параметров, таких как пробег, машино-часы, топливо в баке, ездки, работу на холостых оборотах и т.д., но это совсем отдельная история. Первый вариант контроля лопаты готов, но в бою он будет протестирован только когда выпадет снег.
Насколько просто получилось?
Основная идея сервиса распознавания — это простота создания и обучения собственных моделей. Чтобы понять, реально ли любой человек сможет создать и обучить собственную модель, я попросил свою помощницу создать модель распознавания струй воды от поливальной машины. Единственные входные данные, которые я ей дал, был видеоролик работы поливальной машины, снятый из кабины, и адрес сервиса распознавания, вечером я ей поставил эту задачу, а уже утром, зайдя в систему, увидел готовую модель, которая реально работала. Ниже скриншот окна, в котором происходит обучение модели.
По мере обучения сохраняются эпохи модели, и мы можем, не прерывая процесс обучения протестировать любую эпоху.
Развитие и использование
Пример того, как все работает вживую, можно посмотреть
You must be registered for see links
.Я долго думал над тем, что если любой желающий может создать собственную модель, то почему не сделать возможность поделиться этой моделью с другими пользователями системы. В результате я добавил раздел, в который можно одним кликом мыши разместить удачную модель и любой участник может ей пользоваться. Сервис является полностью бесплатным.
Сейчас я сам пользуюсь сервисом для решения своих задач по автоматизации процессов на предприятиях, в которых можно применить машинное зрение. В дальнейшем планирую добавлять другие подходы распознавания, не только нейронные сети. Я буду очень рад, если кто-то еще с помощью данного сервиса сможет решить свои задачи.



