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