Главная » Хабрахабр » Mask R-CNN: архитектура современной нейронной сети для сегментации объектов на изображениях

Mask R-CNN: архитектура современной нейронной сети для сегментации объектов на изображениях

На данный момент нейронные сети способны выполнять куда более сложные и интересные задания по обработке изображений. Времена, когда одной из самых актуальных задач компьютерного зрения была способность отличать фотографии собак от фотографий кошек, уже остались в прошлом. Сеть так же способна к распознаванию поз людей на изображении.
В начале этого года мне довелось в учебных целях поучаствовать в соревновании Data Science Bowl 2018 на Kaggle. В частности, сеть с архитектурой Mask R-CNN позволяет выделять на фотографиях контуры («маски») экземпляров разных объектов, даже если таких экземпляров несколько, они имеют различный размер и частично перекрываются. Это была нейросеть с архитектурой Mask R-CNN, разработанная недавно Facebook Research. В учебных же целях мною была использована одна из тех моделей, которые великодушно выкладывают некоторые участники, занимающие высокие позиции. Судя по всему, более подходящую для биомедицинских задач, к которым и относилось Data Science Bowl 2018).
Поскольку цель состояла в ознакомлении с задачами Deep Learning, а не занятии высокого места, после завершения соревнования осталось стойкое желание разобраться, как устроена использованная нейросеть «под капотом». (Стоит отметить, что победившая команда использовала всё-таки другую архитектуру — U-Net. Материал носит исключительно теоретический характер (хотя в конце есть ссылки про практическое применение), и большего, чем есть в указанных источниках, он не содержит. Данная статья представляет обобщение сведений, полученных из оригинальных документов с arXiv.org и нескольких статей на Medium. Но информации по теме на русском мало, так что, возможно, статья окажется кому-то полезной.

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

Типы задач computer vision

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

  • Classification — классификация изображения по типу объекта, которое оно содержит;
  • Semantic segmentation — определение всех пикселей объектов определённого класса или фона на изображении. Если несколько объектов одного класса перекрываются, их пиксели никак не отделяются друг от друга;
  • Object detection — обнаружение всех объектов указанных классов и определение охватывающей рамки для каждого из них;
  • Instance segmentation — определение пикселей, принадлежащих каждому объекту каждого класса по отдельности;

На примере изображения с воздушными шарами из [9] это можно проиллюстрировать так:

Эволюционность развития Mask R-CNN

Концепции, лежащие в основе в Mask R-CNN прошли поэтапное развитие через архитектуры нескольких промежуточных нейросетей, решавших разные задачи из приведённого выше списка. Вероятно, самый простой способ разобраться в принципах функционирования данной сети — последовательно рассмотреть все эти этапы.

Не останавливаясь на базовых вещах вроде backpropagation, функции нелинейной активации, и того, что из себя представляет многослойная нейронная сеть в целом, кратко пояснить, как работают слои Convolution Neural Networks, вероятно, всё-таки стоит (R-CNN же).

Convolution и MaxPooling

Сверточный (convolutional) слой позволяет объединять значения расположенных рядом пикселей и выделять более обобщённые признаки изображения. Для этого по картинке последовательно скользят квадратным окном небольшого размера (3х3, 5х5, 7х7 пикселей и т.п.) называемым ядром (kernel). Каждый элемент ядра имеет свой весовой коэффициент, умножаемый на значение того пикселя изображения, на который в данный момент наложен элемент ядра. Затем полученные для всего окна числа складываются, и эта взвешенная сумма даёт значение очередного признака.

В следующих слоях операция свертки применяется уже к картам признаков, полученным из предыдущих слоёв. Для получения матрицы («карты») признаков всего изображения, ядро последовательно сдвигается по горизонтали и вертикали. Графически процесс можно проиллюстрировать так:

Настройка весов каждого фильтра происходит при помощи всё той же процедуры backpropagation. Изображение или карты признаков в рамках одного слоя могут сканироваться не одним, а несколькими независимыми фильтрами, давая таким образом на выход не одну карту, а несколько (их ещё называют «каналами»).

Если нужно сохранить тот же размер, применяют так называемые paddings — значения, которыми дополняется изображение по краям и которые потом захватываются фильтром вместе с реальными пикселями картинки. Очевидно, если ядро фильтра при сканировании не выходит за пределы изображения, размерность карты признаков будет меньше, чем у исходной картинки.

Помимо paddings на изменение размерности так же влияют strides — значения шага, с которым окно перемещается по изображению/карте.

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

В отличие от convolution, maxpooling обычно применяется к непересекающимся группам пикселей.

R-CNN

Архитектура сети R-CNN (Regions With CNNs) была разработана командой из UC Berkley для применения Convolution Neural Networks к задаче object detection. Существовавшие на тот момент подходы к решению таких задач приблизились к масимуму своих возможностей и значимо улучшить их показатели не получалось.

Для этого на вход CNN подавалось не всё изображение целиком, а предварительно выделенные другим способом регионы, на которых предположительно имеются какие-то объекты. CNN хорошо показывали себя в классификации изображений, и в данной сети они по сути были применены для того же самого. На тот момент таких подходов было несколько, авторы выбрали Selective Search, хотя они указывают, что особых причин для предпочтения именно его нет.

Такие нейросети, как и другие для набора изображений ImageNet, проводят классификацию на 1000 классов. В качестве CNN-сети использовалась так же готовая архитектура — CaffeNet (AlexNet). R-CNN разрабатывалась для детектирования объектов меньшего количества классов (N= 20 или 200), поэтому последний классификационный слой CaffeNet был заменён на слой с N+1 выходами (с дополнительным классом для фона).

Для этого изображение из региона заключалось в наименьший охватывающий квадрат. Selective Search выдавал около 2000 регионов разного размера и соотношений сторон, однако CaffeNet принимает на вход изображения фиксированного размера 227х227 пикселей, поэтому перед подачей регионов на вход сети их приходилось модифицировать. Полученный квадрат масштабировался под размер 227x227 и подавался на вход CaffeNet. Вдоль той (меньшей) стороны, по которой образовывались поля, добавлялось несколько «контекстных» (окружающих регион) пикселей изображения, оставшаяся часть поля ничем не заполнялась.

Несмотря на то, что CNN тренировалась на распознавание N+1 классов, в итоге она использовалась только для извлечения фиксированного 4096-размерного вектора признаков. Непосредственным определением объекта на изображении занимались N линейных SVM, каждый из которых проводил бинарную классификацию по своему типу объектов, определяя есть ли такой в переданном регионе или нет. В оригинальном документе вся процедура иллюстрируется такой схемой:

Авторы утверждают, что процесс классификации в SVM происходит весьма производительно, представляя собой по сути просто матричные операции. Полученные из CNN векторы признаков объединяются по всем регионам в матрицу 2000х4096, которая затем умножается на матрицу 4096xN с весами SVM.

Считать ли регион содержащим объект или нет, определялось по метрике Intersection over Union (IoU). Надо отметить, что полученные при помощи Selective Search регионы только могут содержать какие-то объекты, и не факт, что содержат их целиком. Если отношение превосходит заданную пороговую величину, регион-кандидат считается содержащим нужный объект. Эта метрика представляет собой отношение площади пересечения прямоугольного региона-кандидата с прямоугольником, на самом деле обхватывающим объект, к площади объединения этих прямоугольников.

Если IoU некоторого региона с регионом, получившим для того же объекта максимальный результат, был выше некоторого порога, первый регион просто отбрасывался. IoU так же использовался для отсеивания избыточного количества регионов, содержащих определённый объект (non-maximum suppression).

После классификации содержимого региона-кандидата, при помощи линейной регрессии на основе признаков из CNN определялись четыре параметра — (dx, dy, dw, dh). В ходе процедуры error analysis авторы так же разработали метод, позволяющий уменьшить ошибку выделения охватывающей рамки объекта — bounding-box regression. Они описывали, насколько надо сдвинуть центр рамки региона по х и у, а также на сколько изменить её ширину и высоту, чтобы точнее охватывать распознанный объект.

Таким образом, процедуру детектирования объектов сетью R-CNN можно разделить на следующие шаги:

  1. Выделение регионов-кандидатов при помощи Selective Search.
  2. Преобразование региона в размер, принимаемый CNN CaffeNet.
  3. Получение при помощи CNN 4096-размерного вектора признаков.
  4. Проведение N бинарных классификаций каждого вектора признаков при помощи N линейных SVM.
  5. Линейная регрессия параметров рамки региона для более точного охвата объекта

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

Fast R-CNN

Несмотря на высокие результаты, производительность R-CNN была всё же невысока, особенно для более глубоких, чем CaffeNet сетей (таких как VGG16). Кроме того, обучение bounding bog repressor и SVM требовало сохранения на диск большого количества признаков, поэтому оно было дорогим с точки зрения размера хранилища.

Авторы Fast R-CNN предложили ускорить процесс за счёт пары модификаций:

  • Пропускать через CNN не каждый из 2000 регионов-кандидатов по отдельности, а всё изображение целиком. Предложенные регионы потом накладываются на полученную общую карту признаков;
  • Вместо независимого обучения трёх моделей (CNN, SVM, bbox regressor) совместить все процедуры тренировки в одну.

Преобразование признаков, попавших в разные регионы, к фиксированному размеру производилось при помощи процедуры RoIPooling. Окно региона шириной w и высотой h делилось на сетку, имеющую H×W ячеек размером h/H × w/W. (Авторы документа использовали W=H=7). По каждой такой ячейке проводился Max Pooling для выбора только одного значения, давая таким образом результирующую матрицу признаков H×W.

Бинарные SVM не использовались, вместо этого выбранные признаки передавались на полносвязанный слой, а затем на два параллельных слоя: softmax с K+1 выходами (по одному на каждый класс + 1 для фона) и bounding box regressor.

Общая архитектура сети выглядит так:

Для совместного обучения softmax-классификатора и bbox regressor-а использовалась объединённая loss-функция:

$L(p, u, t^u,v)=L_ (p, u)+\lambda[u\ge1]L_{loc}(t^u,v)$

Здесь:
$u$ — класс объекта, реально изображённого в регионе-кандидате;
$L_{cls}(p,u)=-\log(p_{u})$ – log loss для класса u;
$v=(v_{x},v_{y},v_{w},v_{h})$ – реальные изменения рамки региона для более точного охватывания объекта;
$t^u=(t_{x}^u,t_{y}^u,t_{w}^u,t_{h}^u)$ – предсказанные изменения рамки региона;
$L_{loc}$ – loss-функция между предсказанными и реальными изменениями рамки;
$[u\ge1]$ – индикаторная функция, равная 1, когда $u\ge1$, и 0, когда наоборот. Классом $u=0$ обозначается фон (т.е. отсутствие объектов в регионе).
$\lambda$ – коэффициент, предназначенный для балансирования вклада обоих loss-функций в общий результат. Во всех экспериментах авторов документа, он, однако, был равен 1.

Авторы так же упоминают, что для ускорения вычислений в полносвязанном слое они использовали разложение матрицы весов по Truncated SVD.

Faster R-CNN

После улучшений, сделанных в Fast R-CNN, самым узким местом нейросети оказался механизм генерации регионов-кандидатов. В 2015 команда из Microsoft Research смогла сделать этот этап значительно более быстрым. Они предложили вычислять регионы не по изначальному изображению, а опять же по карте признаков, полученных из CNN. Для этого был добавлен модуль под названием Region Proposal Network (RPN). Новая архитектура целиком выглядит следующим образом:

В рамках RPN по извлечённым CNN признакам скользят «мини-нейросетью» с небольшим (3х3) окном. Полученные с её помощью значения передаются в два параллельных полносвязанных слоя: box-regression layer (reg) и box-classification layer (cls). Выходы этих слоёв базируются на так называемых anchor-ах: k рамках для каждого положения скользящего окна, имеющих разные размеры и соотношения сторон. Reg-слой для каждого такого anchor-а выдаёт по 4 координаты, корректирующие положение охватывающей рамки; cls-слой выдаёт по два числа – вероятности того, что рамка содержит хоть какой-то объект или что не содержит. В документе это иллюстрируется такой схемой:

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

Те из них, которые имеют высокую вероятность содержания какого-либо объекта, передаются дальше в модуль детектирования объектов и уточнения охватывающей рамки, который по-прежнему реализован как Fast R-CNN. Оба слоя RPN выдают только предложения для регионов-кандидатов.

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

  1. Инициализируется и обучается на определение регионов-кандидатов RPN-часть.
  2. С использованием предлагаемых RPN регионов заново обучается Fast R-CNN часть.
  3. Обученная сеть детектирования используется, чтобы инициализировать веса для RPN. Общие convolution-слои, однако, фиксируются и производится донастройка только слоёв, специфичных для RPN.
  4. С зафиксированными convolution-слоями окончательно донастраивается Fast R-CNN.

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

Mask R-CNN

Mask R-CNN развивает архитектуру Faster R-CNN путём добавления ещё одной ветки, которая предсказывает положение маски, покрывающей найденный объект, и, таким образом решает уже задачу instance segmentation. Маска представляет собой просто прямоугольную матрицу, в которой 1 на некоторой позиции означает принадлежность соответствующего пикселя объекту заданного класса, 0 — что пиксель объекту не принадлежит.

Визуализация разноцветных масок на исходных изображениях может давать красочные картинки:

Loss функция для них общая и включает три компонента:
Авторы документа условно разделяют разработанную архитектуру на CNN-сеть вычисления признаков изображения, называемую ими backbone, и head — объединение частей, отвечающих за предсказание охватывающей рамки, классификацию объекта и определение его маски.

$L = L_{cls} + L_{box} + L_{mask}$

Выделение маски происходит в class-agnostic стиле: маски предсказываются отдельно для каждого класса, без предварительного знания, что изображено в регионе, и потом просто выбирается маска класса, победившего в независимом классификаторе. Утверждается, что такой подход более эффективен, чем опирающийся на априорное знание класса.

Дело в том, что карта признаков, полученная из CNN, имеет меньший размер, чем исходное изображение, и регион, охватывающий на изображении целочисленное количество пикселей, не получается отобразить в пропорциональный регион карты с целочисленным количеством признаков: Одна из основных модификаций, возникших из-за необходимости предсказывать маску — изменение процедуры RoIPool(вычисляющей матрицу признаков для региона-кандидата) на так называемую RoIAlign.

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

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

В оригинальном документе разница поясняется таким рисунком:

Здесь штрихованной сеткой обозначена карта признаков, а непрерывной — отображение на карту признаков региона-кандидата с исходной фотографии. В данный регион должно попасть 4 группы для max pooling по 4 признака, обозначенных на рисунке точками. В отличие от процедуры RoIPool, которая за счёт округления просто бы выровняла регион по целочисленным координатам, RoIAlign оставляет точки в их текущих местах, но вычисляет значения каждой из них при помощи билинейной интерполяции по четырём ближайшим признакам.

Билинейная интерполяция

Помимо выскоких результатов в задачах instance segmentation и object detection, Mask R-CNN оказалась пригодной для определения поз людей на фотографии (human pose estimation). Ключевой момент здесь — выделение опорных точек (keypoints), таких как левое плечо, правый локоть, правое колено и т.п., по которым можно нарисовать каркас позиции человека:

В то же время, сеть тренируется выдавать K таких однопиксельных масок, по одной для каждого типа опорной точки. Для определения опорных точек нейросеть обучают таким образом, чтобы она выдавала маски, в которых только один пиксель (та самая точка) имел значение 1, а остальные — 0 (one-hot mask).

Feature Pyramid Networks

В экспериментах по Mask R-CNN, наряду с обычной CNN ResNet-50/101 в качестве backbone, также проводились исследования целесообразности использования Feature Pyramid Network (FPN). Они показали, что применение FPN в backbone даёт Mask R-CNN прирост как в точности, так и в производительности. Это делает полезным описание так же и данного улучшения, несмотря на то, что ему посвящён отдельный документ и с серией рассматриваемых статей он связан мало.
Назначение Feature Pyramids, как и image pyramids, — улучшение качества детектирования объектов с учётом большого диапазона их возможных размеров.

При этом карты признаков и нижних, и верхних уровней пирамиды обладают своими преимуществами и недостатками: первые имеют высокое разрешение, но низкую семантическую, обобщающую, способность; вторые — наоборот: В Feature Pyramid Network карты признаков, извлечённые последовательными слоями CNN с уменьшающейся размерностью, рассматриваются как некая иерархическая «пирамида», называемая bottom-up pathway.

Архитектура FPN позволяет объединить достоинства верхних и нижних слоёв при помощи добавления top-down pathway и lateral connections. Для этого карта каждого вышележащего слоя увеличивается до размера нижележащего и их содержимое поэлементно складывается. В итоговых предсказаниях используются результирующие карты всех уровней.

Схематично это можно изобразить так:

Увеличение размера карты верхнего уровня (upsampling) делается самым простым методом — nearest neighbor, т. е. приблизительно так:

Полезные ссылки

Оригинальные документы с исследованиями на arXiv.org:

R-CNN: https://arxiv.org/abs/1311. 1. 2524

Fast R-CNN: https://arxiv.org/abs/1504. 2. 08083

Faster R-CNN: https://arxiv.org/abs/1506. 3. 01497

Mask R-CNN: https://arxiv.org/abs/1703. 4. 06870

Feature Pyramid Network: https://arxiv.org/abs/1612. 5. 03144

В качестве ссылок привожу только те, что довелось прочитать: На medium.com на тему Mask R-CNN достаточно много статей, они легко находятся поиском.

Simple Understanding of Mask RCNN — краткое изложение принципов результирующей архитектуры. 6.

A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN — история развития сети в таком же хронологическом порядке, как в данной статье. 7.

From R-CNN to Mask R-CNN — ещё одно рассмотрение этапов развития. 8.

Splash of Color: Instance Segmentation with Mask R-CNN and TensorFlow — реализация нейросети в Opensource-библиотеке от компании Matterport. 9.

Последняя статья помимо описания принципов Mask R-CNN предлагает возможность попробовать сеть на практике: для раскрашивания разными цветами воздушных шаров на чёрно-белых изображениях.

Помимо этого, попрактиковаться с нейросетью можно на той модели, что использовалась мной в соревновании Data Science Bowl 2018 на kaggle (но не только с одной этой моделью, разумеется; в разделах Kernels и Discussions можно найти много всего интересного):

Mask R-CNN in PyTorch by Heng CherKeng. 10. Модель требует PyTorch 0. Реализация предполагает ряд шагов по развёртыванию, инструкцию автор предоставляет. 0, поддержку GPU-вычислений, NVIDIA CUDA. 4. Если собственная система не соответствует требованиям, могу порекомендовать образы Deep Learning AMI для виртуалок Amazon (инстансы платные, с почасовой тарификацией, минимальный подходящий размер, судя по всему, — p2.xlarge).

Надеюсь, автор будет только рад дополнительному упоминанию: Мне также попадалась здесь, на хабре, статья про использование сети от Matterport в обработке изображений с блюдами (правда, без исходников).

ConvNets. 11. Создание прототипа проекта с помощью Mask R-CNN


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Зачем программисту стажировка на кухне — разговор с «Додо пиццей» про гембу, .NET и открытость

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

[Перевод] Профилирование кода с LLVM

Проклятие недетерминизма Моя первая попытка написать проход LLVM — люблю эти сегфолты Под словом «детерминированный» я подразумеваю, что один и тот же код будет выполняться за одно и то же количество единиц времени. Недавно я столкнулся с интересной задачей — ...