Как Я Научился Перестать Беспокоиться И Полюбил Компьютерное Зрение

Привет, Хабр! Меня зовут Артем Нагуманов, у меня более 15 лет опыта работы в разработке программного обеспечения, управлении проектами, командами и ИТ-отделами.

Меня всегда интересовала тема искусственного интеллекта и компьютерного зрения.

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



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

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

в мире искусственного интеллекта.

Процесс этот довольно трудоемкий и не очень веселый.

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

И все, что мне нужно сделать, это нажать несколько больших стеклянных кнопок и получить результат. Для привлечения внимания на картинке (в первом абзаце статьи) приведен пример распознавания струй воды из оросителя, но обо всем по порядку.



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

Моя идея была следующая — сделать сайт, на который пользователь сможет загружать любые изображения, нажимать кнопку «Распознать» и получать результат в формате json. Но дело в том, что не существует универсального алгоритма или нейросети, способной найти любые объекты в мире.

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

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

Как оказалось, в этом направлении работают многие гиганты IT-индустрии: Яндекс, Mail.ru, Amazon. Главным недостатком было то, что все эти гиганты хотели денег за свои услуги.

Этого мне хватило, чтобы начать собственное развитие.

У меня уже был бэкграунд, и я умел хорошо находить и классифицировать объекты на изображениях, оставалось только собрать всё воедино и сделать удобный интерфейс.

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

  • ASP.NET (язык C#)
  • ВебАпи
  • JavaScript, JQuery
  • MSSQL-сервер
  • Питон
  • Тензорный поток
Прежде всего, я решил создать 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, т.к.

видеокамера позволяла сделать фото и отправить его указанному фтп.

Добавлена возможность сохранять результат в базе данных, а затем через API в течение заданного периода времени получать результаты, анализировать их и фиксировать в системе учета, написанной на 1С, что, кстати, является огромным контролем.

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

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



Насколько это было легко?

Основная идея сервиса распознавания — простота создания и обучения собственных моделей.

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

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

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

Ниже скриншот окна, в котором обучается модель.



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

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



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

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

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

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

Услуга полностью бесплатна.

Сейчас я сам использую сервис для решения своих задач по автоматизации процессов на предприятиях, где можно использовать машинное зрение.

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

Буду очень рад, если кто-то еще сможет решить свои проблемы с помощью этого сервиса.

Теги: #Машинное обучение #облачные сервисы #искусственный интеллект #искусственный интеллект #машинное зрение #TensorFlow

Вместе с данным постом часто просматривают: