Привет, Хабр! Это моя первая статья, по этому не судите строго. Однажды я решил создать стартап по разработке автоматической автозаправочной станции, включающий, в том числе "роботизированную" руку, способную автоматически заправлять транспортные средства, независимо от марки. В целом про проект я планирую написать отдельную статью, а в этой рассказать об одной из его задач - распознавании лючка горловины топливного бака. Для открытия лючка бензобака, для дальнейшей заправки транспортного средства, необходимо правильно спозиционировать руку робота. После позиционирования, осуществляется открытие лючка с помощью присоски. Соответственно, необходимо, в автоматическом режиме, распознавать контур лючка бензобака. Так как я слабо разбирался в распознавании образов, первым делом, я решил изучить различные методы, с помощью которых, данная задача может быть решена.      Мы можем отнести задачу распознавания крышки лючка заправочной горловины бензобака к типу - сегментации образов. Для решения задач данного типа применяются, к примеру, следующие методы: контурный анализ, нейронные сети, методы фильтрация и т.д. В общем случае задача сегментации образов не решена - отсутствуют универсальные алгоритмы, но существуют решения для частных случаев. Задачу распознавания лючка я пробовал решать классическим (контурный анализ) и нейросетевым методом. В рамках классического подхода был разработан алгоритм обнаружения, на основе методов контурного анализа. В рамках нейросетевого подхода, были опробованы  различные нейросетевые архитектуры и в дальнейшем выбор остановился на U-net, дополненной промежуточным слоем нормализации весов. Как показано далее — качество обнаружения объектов при помощи нейросети, основанной на архитектуре U-Net – слабо зависит от условий освещенности (достаточно освещения самого объекта), от расстояния до объекта и зашумленности (уровень перекрытия контура объекта должен быть не более 20%).  В результате применения алгоритма на основе классических методов контурного анализа качество распознавания заданного объекта (измерялось метрикой Дайса) – 0.85, качество распознавания алгоритмом обнаружения на основе нейросетевого метода – 0.96, что свидетельствует о том, что применение нейросетевого подхода для решения задачи обнаружения заданных объектов дает более точный результат. Качество распознавания измерялось на контрольной выборке, состоящей из произвольно выбранном из собранного датасета множестве изображений. Но обо всем по порядку. Для тестирования и оценки качества распознавания реализованных алгоритмов был собран датасет изображений крышeк горловин бензобаков (далее — КЛГ), состоящий из более чем 2500 различных фотографий крыльев автомобилей  (разрешение не меньше 1024x1024x3), а также «попиксельных» масок (разметок) КЛГ, аналогичного размера.  В датасет включались изображения произвольных крыльев легковых транспортных средств, находящихся на улицах и соответствующие следующим требованиям: легковой автомобиль произвольной расцветки,   площадь загрязнений не более 20% от площади КЛГ, то есть в базу данных попадали только «слабо» загрязненные изображения,   расстояние до автомобиля от фотоаппарата 50-150 см,   преимущественно светлое время суток, фотографии были сделаны без дополнительной вспышки, причем в датасет были включены несколько фотографий, выполненных в темное время суток, с использованием вспышки,   фотографии были сделаны при помощи камеры мобильного телефона, которая обеспечивала заданное разрешение.   Разметка фотографий (то есть выделение контура КЛГ) осуществлялась по внутренней границе КЛГ. Для оценки качества обнаружения объектов был применен следующий подход: Из датасета было выбрано подмножество - контрольная выборка, состоящая из 70 изображений, полученных в условиях различного освещения, разной степени загрязненности, а также с изображением разных видов КЛГ («скругленный прямоугольник» или «круглый» КЛГ).   Все изображения из контрольной выборки подавались на вход разработанных алгоритмов. В результате работы алгоритм на выходе выдавал маску, отмечающую местоположение объекта КЛГ. По каждой полученной, в результате работы алгоритма, маске, и маске, сохраненной в датасете, рассчитывалась метрика Дайса. Для каждого разработанного алгоритма рассчитывалась усредненное значение, получаемое расчетом среднего по величине метрики Дайса на каждом изображении контрольной выборки.    Для каждого алгоритма измерялось его время работы для каждого изображения из контрольной выборки. Для получения второй оценки качества время работы усреднялось по всем фотографиям контрольной выборки. Одновременно с расчетом, сохранялось время работы алгоритма.   Для контроля качества обнаружения КЛГ на изображении использовалась метрика Дайса (Dice):  где P - площадь, A - предсказанная маска, B - фактическая маска Эта метрика представляет собой отношение площади пересечения обнаруженного контура КЛГ и контура фактической маски к площади объединения данных контуров.   За лучший алгоритм брался алгоритм, у которого оба параметра являются наилучшими на контрольной выборке: усредненная метрика Дайса – максимальная, среднее время работы – минимальное.   Применение к исходному изображению алгоритма Mean Shift Алгоритм Mean Shift является итерационным, выполняет сдвиг каждой точки изображения к среднему из точек в ее окрестности, среднее смещение — это процесс поиска мод на поверхности, построенной с выбранным ядром.  Применение билатерального фильтра Трансформация изображения в пространство HSV и получение HSV маски После трансформации вычисляется маска. При вычислении маски в расчет берутся следующие предположения: большая часть изображения имеет однородный тон (H) съемка производилась при естественном освещении Тогда в каждой локальной области изображения размера выбранного шага, производится поиск максимальных порогов для H и V, при которых обнуляется наибольшее количество пикселей рассматриваемой области. В результате ненулевые элементы маски будут отражать неосвещенные участки изображения. Применяется метод Phase Stretch Transform для поиска границ на изображении PST или Phase Stretch Transform — алгоритм обнаружения краев, который находит изменения интенсивности цвета на изображении. PST работает с входным изображением в градациях серого и выводит карту границ. Выходная карта границ, такая же, как размер входного изображения, является двоичной с значение пикселя равно 1, где оператор PST находит резкие переходы по интенсивности, и 0 в остальных точках. PST использует изотропный фильтр Гаусса с заданной пользователем масштабом. Поскольку резкие переходы интенсивности на краях и/или углах, отображаются в высоких частотах.   Полученные на шаге 4 границы отфильтровываются при помощи маски, полученной на шаге 3. К полученным на шаге 5 границам применяется медианный фильтр и морфологическое преобразование - наращивание. Производится выделение контуров на полученной на предыдущем шаге изображении при помощи алгоритма Satoshi Suzuki. Найденные контуры аппроксимируются при помощи алгоритма Рамера-Дугласа-Пеккера. Производится отбор полученных контуров по геометрическим признакам Полученные на предыдущем шаге контуры, отбираются по следующим критериям: площадь и длина контура. В случае если площадь или периметр найденного контура меньше заданного порогового значения – данный контур исключается из рассмотрения, те исключаются очень маленькие и очень большие контуры по сравнению с изображением. Для полученных контуров производится вычисление дескрипторов Фурье За лучший контур берется тот, у которого Евклидово расстояние между его дескрипторами Фурье и дескрипторами Фурье шаблона - наименьшее. Для отсеивания ложно положительных контуров используется классификатор 	«Случайный лес». Который предварительно обучается следующим образом: рассчитывается метрика Дайса для полученного контура и известной маски. 		 в случае если значение метрики Дайса меньше порогового значения, то 	дескрипторам полученного контура присваивается метка 0, иначе 1.  	 по результатам прогона всего датасета производится обучение классификатора с подобранными параметрами. Алгоритм машинного обучения, заключающийся в использовании комитета (ансамбля) решающих деревьев. Алгоритм сочетает в себе две основные идеи: метод бэггинга и метод случайных подпространств. Алгоритм применяется для задач классификации, регрессии и кластеризации. Основная идея заключается в использовании большого ансамбля решающих деревьев, каждое из которых само по себе даёт очень невысокое качество классификации, но за счёт их большого количества результат получается хорошим.  Метрика Дайса рассчитывалась на контуре, полученном в результате работы алгоритмов и его размеченной маски. Решение задачи обнаружения КЛГ, основанное на контурном анализе, содержит в себе следующие отрицательные моменты: тонкая настройка на конкретный датасет и условия съемки (освещение, расстояние до КЛГ), то есть в случае изменчивости условий данный подход требует перенастройки и зачастую применения разных алгоритмов обнаружения.  В конкретной задаче обнаружения КЛГ существует большое количество различных типов лючков, лючки могут быть повернуты к камере под разными углами, и съемка может происходить в разное время суток и в разных метеорологических условиях.   Для решения задачи обнаружения КЛГ при помощи нейронной сети были проанализированы различные их архитектуры, используемых для решения задач компьютерного зрения.  Основными архитектурами, продемонстрировавшими наименьшую ошибку на обучающих данных, являются: AlexNet, GoogLeNet, VGG-19, ResNet-50, ResNet-152, Inception v4, U-net. На момент проведения анализа одни из лучших результатов по качеству распознавания изображений показала архитектура U-Net именно поэтому она была выбрана за основу для решения задачи обнаружения КЛГ.  U-Net — архитектура свёрточной нейронной сети, предназначенная для сегментации изображений. Архитектура сети представляет собой полносвязную свёрточную сеть, модифицированную так, чтобы она могла работать с меньшим количеством примеров (обучающих образов).  U-Net считается одной из стандартных архитектур сверточной нейронной сети для решения задач сегментации (в том числе и обнаружения объектов), когда нужно не только определить класс изображения целиком, но и сегментировать его области по классу, т. е. создать маску, которая будет разделять изображение на несколько классов. Архитектура состоит из стягивающего пути для захвата контекста и симметричного расширяющегося пути, который позволяет осуществить точную локализацию Сжимающий путь похож на типичную свёрточную сеть, он содержит два подряд свёрточных слоя 3x3, после которых идет слой ReLU и пулинг с функцией максимума 2×2 с шагом 2.   Каждый шаг расширяющего пути содержит слой, обратный пулингу, который расширяет карту признаков, после которого следует свертка 2x2, которая уменьшает количество каналов признаков. После идет конкатенация с соответствующем образом обрезанной картой признаков из сжимающего пути и две свертки 3x3, после каждой из которой идет ReLU. Обрезка нужна из-за того, что мы теряем пограничные пиксели в каждой свертке. На последнем слое свертка 1x1 используется для приведения каждого 64-компонентного вектора признаков до требуемого количества классов.   Исходные изображения с разрешением не ниже 1024x1024 и соответствующие им изображения масок использовались для обучения сети. В качестве функции активации на последнем свёрточном слое использовалась сигмоида. Функция активация на остальных слоях – ReLU. Минимизируемая функция потерь – кросс-энтропия с добавлением метрики Дайса: где P-площадь фигуры, A — предсказанная маска на изображении x, B – размеченная маска (размеченная). В качестве оптимизатора был выбран Adam. Каждую эпоху сравнивалась усредненная метрика Дайса на валидационной выборке, в случае если значение метрики было меньше чем, из предыдущей сохраненной, то полученные на данной эпохе веса нейронной сети — сохранялись.  Также осуществлялась аугментация данных, то есть генерация дополнительных изображений на основе существующих. Существует множество вариантов аугментации. Самыми популярными являются следующие: отражение по горизонтали (horizontal flip), случайное кадрирование (random crop) и изменение цвета (color jitter). Можно применять различные комбинации, например, одновременно выполнять поворот и случайное масштабирование. Кроме того, можно варьировать величину насыщенности (saturation) и значения (value) всех пикселей (компоненты S и V цветового пространства HSV). Для каждого изображения применялась процедура аугментации с настраиваемыми случайными параметрами.   По сравнению с оригинальной архитектурой U-Net для ускорения тренировки НС была применена методика нормализации весов по мини батчам. Если на вход некоторому слою нейронной сети поступает вектор размерности. Нормализуем данный вектор по каждой размерности k и добавим два параметра сжатия и сдвига нормализованной величины для каждого   Данные параметры настраиваются в процессе обучения вместе с остальными параметрами модели. Тестирование алгоритмов осуществлялось на сервере со следующими характеристиками:   CPU: 2 x Intel Xeon 2.3 GHz Memory: 13 Gb GPU Алгоритм реализован на языке Python с использованием библиотеки OpenCV. На вход алгоритму последовательно подаются изображения из контрольной выборки. Качество обнаружения КЛГ оценивалось при помощи метрики Дайса.  Усредненная метрика Дайса на контрольной выборке: 0.842 Примеры изображений, полученные после выполнения соответствующего шага алгоритма представлены ниже Алгоритм реализован на языке Python с использованием библиотек Tensorflow и Keras. Экспериментально подобраны следующие значения гиперпараметров:   размер батча: 2 кол-во эпох обучения: 30 разделение датасета на тренировочный и валидационный в пропорции: 80/20 по сравнению с исходной архитектурой U-Net после сверточного слоя добавлена нормализация весов функция активации после каждого слоя – ReLU функция активации после последнего слоя – Сигмоида функция потерь: сумма кросс-энтропия и 1-Дайс Параметры аугментации нормализация яркости изображения   отражение по горизонтали: случайно с вероятность 50%   сдвиги по горизонтали и вертикали случайно не более чем на 10% от размера изображения По результатам обучения значение метрики Дайса, рассчитанное за эпоху сократилось с 0.45 после первой эпохи до 0. 02565 после 30 эпохи обучения, что свидетельствует о "хорошей" сходимость НС. Результаты обнаружения КЛГ на тестовой выборке после двух эпох и после 30 эпох обучения НС представлены ниже.  Распознанные НС точки, считаются относящимися к КЛГ в случае, если значение яркости в них выше 0.9. Усредненный коэффициент Дайса по тестовой выборке (70 изображений, не участвовавших в обучении) составляет:  после 2-х эпох обучения: 0.4863103, после 30 эпох обучения: 0.9668401, это значит, что 96% всех точек КЛГ нейросеть смогла детектировать успешно. Две эпохи обучения недостаточны для уверенного распознавания КЛГ, при этом после 30 эпох обучения НС распознает КЛГ достаточно уверенно. В рамках работы было проведено обучение НС на разном количестве эпох (при одинаковых остальных параметрах), результаты контроля точности представлены в таблице ниже:   Количество эпох обучения Усредненная Dice  5    0,41    12    0.95    15    0.95   Как можно увидеть из таблицы, приемлемое качество обнаружения КЛГ достигается после 12 эпох обучения НС, что подтверждается графиком. В рамках работы было проведено исследование процесса обучения и последующего обнаружения КЛГ при помощи различных модификаций архитектуры U-Net, а именно: применение нормализации по мини батчам, добавление дропаута. Результаты обучения НС и усредненной метрики Дайса представлены в таблице ниже: Архитектура U-Net Количество эпох обучения    Dice   Время обучения (мин) U-Net + batch normalization 12 0.95 61 U-Net + batch normalization + dropout (0.1)   12 0.96 63 U-Net + dropout (0.1)   12 0.90 55 В дальнейших исследованиях использовалась НС, обученная с добавлением нормализации по минибатчам и дропаутом 0.1. Исследование устойчивости работы НС в зависимости от входных данных для проведения обучения НС. Для исследования зависимости обнаружения КЛГ было выполнено следующие действия: Сформирован второй датасет в 1349 изображений, который был разделен на два подмножества: для обучения и для контроля. Данные датасета разделены на классы: «скругленные» лючки и «круглые» лючки – см рисунок ниже.    Проведено обучение НС только подмножестве «круглых».   Рассчитана метрика Дайса для контрольной выборки из подмножества изображений «круглые» лючки.    Проведено обучение на всем датасете («круглые» и «скругленные» совместно). После обучения НС на всем датасете повторно рассчитана метрика на контрольной выборке круглые лючки и на контрольной выборке, которая включала как круглые, так и скругленные КЛГ.   Результаты представлены в таблице ниже:  Вид контрольной выборки Датасет, на котором проведено обучение U-Net  Dice  «Круглые» КЛГ  Только «круглые» КЛГ  0.96  «Скругленные» КЛГ  Только «скругленные» КЛГ  0.92  «Круглые» и «скругленные» КЛГ  «круглые» и скругленные» КЛГ  0.96 Для обучения НС обнаружению КЛГ в различных условиях, которые могут встретиться при работе на автозаправочных станциях в датасет были включены изображения ТС с загрязненными, плохо различимыми, повернутыми, слабо освещенными КЛГ. Некоторые изображения с КЛГ могут содержать на себе рисунки, надписи, переходы цвета (например, раскраска «хамелеон»), отражения фотографа (человека, участвующего в сборе датасета), а также изображения могут не содержать КЛГ вообще. Такие изображения также были включены в датасет Результаты обнаружения «нетипичных» КЛГ приведены ниже Вид лючка  Dice    КЛГ с надписями, рисунками, снегом    0.80    КЛГ с переходами цвета, а также нетипичной формы или расположения    0.89    КЛГ с отсутствующими лючками и результат работы НС    0.81   В результате были разработаны и реализованы классический и нейросетевой подход обнаружения заданных объектов на изображениях по их контурному представлению и выполнено сравнение их эффективности: Алгоритм Время обнаружения КЛГ (сек.) Качество обнаружения (Dice) На основе дескрипторов Фурье и классификатора контуров «Случайный лес»   0.5 0.842 На основе нейронной сети U-Net (+батч нормализация, +дропаут) 0.3 0.96 По результатам сравнения можно сделать однозначный вывод о преимуществе нейросетевого подхода перед классическим для обнаружения КЛГ.