AzoftR&DПоиск объекта на изображении с помощью полносвёрточных нейронных сетей

Поиск объекта на изображении с помощью полносвёрточных нейронных сетей

Иван Ожиганов Ноябрь 24, 2016

Поиск объекта на изображении с помощью полносвёрточных нейронных сетей

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

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

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

Цель исследования – найти и выделить объект на изображении методом полносвёрточных нейронных сетей.

Обзор исследования

Исследование выполняется в рамках проекта по распознаванию кассовых чеков. Для достижения поставленной цели исследования требуется натренировать полносвёрточную нейросеть распознавать, где на фото находится объект – кассовый чек, а где фон.

В рамках исследования реализованы следующие стадии:

1. Изучение особенностей применения полносвёрточных нейронных сетей
2. Сравнение свёрточных и полносвёрточных нейросетей
3. Освоение архитектуры полносвёрточной нейронной сети
4. Препроцессинг
5. Тренировка сети на поиск нужного объекта

Реализация

1. Особенности применения полносвёрточных нейронных сетей

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

Пример работы полносвёрточной нейронной сетиРис. 1. Пример работы полносвёрточной нейронной сети

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

2. Сравнение свёрточных и полносвёрточных нейронных сетей

Самым очевидным отличием полносвёрточных сетей от других нейросетей является конечный результат работы сети. Простые сверточные сети могут использоваться для классификации, определяя к какому классу принадлежит то или иное изображение, и для локализации объекта на изображении (регрессия).

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

Полносвёрточные нейронные сети на выходе выдают сегментированое изображение, соответствующее по размерности входному. Поэтому их второе название – сегментационные нейронные сети.

Сегментация – это объединение объектов в группы по общим признакам. Таким образом, мы получаем от сети намного больше информации, а достигнутый результат можем обработать простыми эвристическими методами.

3. Архитектура

Чтобы лучше понимать принцип работы полносвёрточных сетей и выяснить, для решения каких задач их можно использовать, важно изучить их общую архитектуру. При проектировании свёрточных сетей в архитектуру могут добавляться разнообразные слои для повышения точности распознавания (drop out layer, local response normalization layer и т.д.). Мы же рассмотрим лишь базовую архитектуру, которая практически неизменна и определяет работу полносвёрточной сети.

Основа работы полносвёрточных сетей – свёртка изображения. Ключевыми слоями являются свёрточные слои (convolution layer). В свёрточном слое указывается количество выходов со слоя, ядро свёртки, его шаг, размеры, отступ.

Операция свёртки проходит ядром по всему изображению, в результате мы получаем величину отклика на ядро свёртки в каждой точке изображения. Количество ядер каждого слоя свёртки равно произведению количества выходов со слоя на количество входных картинок. Далее результаты проходят через следующий слой свёртки, получая значения уже для других ядер. К каждому свёрточному слою можно добавлять слои регуляризации или нормализации (в зависимости от выбора разработчика). Прохождение изображений через многие свёрточные слои позволяет получить богатое разнообразие возможных интерпретаций изображения.

Пройдя через требуемое количество слоёв свёртки, изображение затем попадает в слой пулинга (pooling layer). Этот слой уменьшает размер входных изображений, не уменьшая их количества. Слой имеет ядро, которое движется подобно ядру свертки, вычисляя единственное значение для каждой области изображения. Уменьшение изображения способствует более быстрой обработке сетью большего количества данных. Это позволяет добавлять в следующих свёрточных слоях большее количество выходов, а также повышает точность результатов. Дело в том, что на уменьшенном изображении ядра свёртки того же размера способны захватывать большую область искомого объекта.

Последовательность: convolution/../../convolution/pooling (где количество convolutions layers определяется разработчиком) может повторяться несколько раз, вплоть до того, пока не будет достигнут минимальный размер изображения. Этот размер определяется экспериментально.

Архитектура полносвёрточной сетиРис. 2. Архитектура полносвёрточной сети

Для того чтобы выделенные объекты соответствовали оригинальному масштабу, уменьшенное изображение требуется вернуть к изначальному размеру. Слой upsample (upsample layer) выполняет увеличение изображения. На каждый выход имеется два входных изображения: первое – это обработанная картинка с предыдущего слоя (это может быть convolution или pooling), второе – это картинка из pooling layer, количество выходов которого равны количеству входов соответствующего upsample, а также размеры выходной картинки pooling равны размеру входной картинки upsample.

Так мы получаем симметричную архитектуру относительно последнего pooling слоя и первого upsample слоя. Между слоями увеличения размеров изображения также помещаются свёрточные слои, но количество выходов с них постепенно уменьшается.

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

4. Препроцессинг – формирование датасета (набора данных) для создания модели архитектуры нейросети

Для реализации алгоритма полносвёрточной сети в своём исследовании мы используем фреймворк Caffe Segnet – это версия Caffe специально разработанная для полносвёрточных нейронных сетей.

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

Маска – это монохромное изображение, на котором каждая группа объектов определена определенным цветом от 0 до 255. Например, в нашем случае всего 2 группы – чек и фон. Фону присваивается цвет 0, а всей области чека – цвет 1. На рисунке ниже представлен пример пары изображение-маска, а для того чтобы увидеть помеченный чек, его значение цвета установлено в 255.

Изображение для обучения сети и маска для негоРис. 3. Изображение для обучения сети и маска для него

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

5. Тренировка сети на поиск нужного объекта

Большой датасет изображений, который мы подготовили для обучения сети, удобнее формировать в виде двух директорий: оригинал и маска. Пусть каждая маска имеет такое же имя, как и изображение оригинала, тогда алгоритм поиска будет проще, если нужно будет отыскать пару оригинал/маска. Далее необходимо добавить текстовый файл, содержащий пути к парам изображений, где каждая пара может быть задана как “путь/к/изображению/оригиналу” и “путь/к/изображению/маске”. Одна строка - одна пара. Данный файл необходимо подавать в сеть, чтобы определить местоположение загружаемых тренировочных данных.

Архитектура сети для задачи сегментации чекаРис. 4. Архитектура сети для задачи сегментации чека

Первым делом мы загружаем в сеть изображение и его маску. Затем начинается итерация обучения – изображение проходит через все слои по порядку, а получившийся на выходе результат сравнивается с маской с помощью функции ошибки (loss function). С каждой следующей итерацией веса сети в процессе обучения постепенно подгоняются к оптимальному значению, необходимому для точного решения поставленной задачи.

Когда весь цикл обучения сети завершен, начинаем тестирование, чтобы оценить точность распознавания. Тестирование нужно проводить на данных, которые не были в тренировочной выборке. Полученные на выходе сети изображения обрабатываются для более доступного глазу визуального представления и затем выдаются пользователю. На выходе изображение имеет формат, где каждый пиксель представлен значением от 0.0 до 1.0 в зависимости от принадлежности к какой-либо группе искомых объектов. Поэтому необходимо привести изображение в одноканальное, серое изображение (от 0 до 255). Затем, для лучшего визуального отображения, результат можно перевести в трёхканальное RGB-изображение, где каждому цветовому значению на сером изображении соответствует свой RGB-цвет.

Примеры работы обученной сетиРис. 5. Примеры работы обученной сети

Заключение

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

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

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

Комментарии

комментарии