Mask R-CNN: архитектура современной нейронной сети для сегментации объектов на изображениях
Друзья, с момента основания проекта прошло уже 20 лет и мы рады сообщать вам, что сайт, наконец, переехали на новую платформу.
Какое-то время продолжим трудится на общее благо по адресу
На новой платформе мы уделили особое внимание удобству поиска материалов.
Особенно рекомендуем познакомиться с работой рубрикатора.
Спасибо, ждём вас на N-N-N.ru
Времена, когда одной из самых актуальных задач компьютерного зрения была способность отличать фотографии собак от фотографий кошек, уже остались в прошлом. На данный момент нейронные сети способны выполнять куда более сложные и интересные задания по обработке изображений. В частности, сеть с архитектурой Mask R-CNN позволяет выделять на фотографиях контуры («маски») экземпляров разных объектов, даже если таких экземпляров несколько, они имеют различный размер и частично перекрываются. Сеть так же способна к распознаванию поз людей на изображении.
В начале этого года мне довелось в учебных целях поучаствовать в соревновании Data Science Bowl 2018 на Kaggle. В учебных же целях мною была использована одна из тех моделей, которые великодушно выкладывают некоторые участники, занимающие высокие позиции. Это была нейросеть с архитектурой Mask R-CNN, разработанная недавно Facebook Research. (Стоит отметить, что победившая команда использовала всё-таки другую архитектуру — U-Net. Судя по всему, более подходящую для биомедицинских задач, к которым и относилось Data Science Bowl 2018).
Поскольку цель состояла в ознакомлении с задачами Deep Learning, а не занятии высокого места, после завершения соревнования осталось стойкое желание разобраться, как устроена использованная нейросеть «под капотом». Данная статья представляет обобщение сведений, полученных из оригинальных документов с 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, хотя они указывают, что особых причин для предпочтения именно его нет.
В качестве CNN-сети использовалась так же готовая архитектура — CaffeNet (AlexNet). Такие нейросети, как и другие для набора изображений ImageNet, проводят классификацию на 1000 классов. R-CNN разрабатывалась для детектирования объектов меньшего количества классов (N= 20 или 200), поэтому последний классификационный слой CaffeNet был заменён на слой с N+1 выходами (с дополнительным классом для фона).
Selective Search выдавал около 2000 регионов разного размера и соотношений сторон, однако CaffeNet принимает на вход изображения фиксированного размера 227х227 пикселей, поэтому перед подачей регионов на вход сети их приходилось модифицировать. Для этого изображение из региона заключалось в наименьший охватывающий квадрат. Вдоль той (меньшей) стороны, по которой образовывались поля, добавлялось несколько «контекстных» (окружающих регион) пикселей изображения, оставшаяся часть поля ничем не заполнялась. Полученный квадрат масштабировался под размер 227×227 и подавался на вход CaffeNet.
Несмотря на то, что CNN тренировалась на распознавание N+1 классов, в итоге она использовалась только для извлечения фиксированного 4096-размерного вектора признаков. Непосредственным определением объекта на изображении занимались N линейных SVM, каждый из которых проводил бинарную классификацию по своему типу объектов, определяя есть ли такой в переданном регионе или нет. В оригинальном документе вся процедура иллюстрируется такой схемой:
Авторы утверждают, что процесс классификации в SVM происходит весьма производительно, представляя собой по сути просто матричные операции. Полученные из CNN векторы признаков объединяются по всем регионам в матрицу 2000х4096, которая затем умножается на матрицу 4096×N с весами SVM.
Надо отметить, что полученные при помощи Selective Search регионы только могут содержать какие-то объекты, и не факт, что содержат их целиком. Считать ли регион содержащим объект или нет, определялось по метрике Intersection over Union (IoU). Эта метрика представляет собой отношение площади пересечения прямоугольного региона-кандидата с прямоугольником, на самом деле обхватывающим объект, к площади объединения этих прямоугольников. Если отношение превосходит заданную пороговую величину, регион-кандидат считается содержащим нужный объект.
IoU так же использовался для отсеивания избыточного количества регионов, содержащих определённый объект (non-maximum suppression). Если IoU некоторого региона с регионом, получившим для того же объекта максимальный результат, был выше некоторого порога, первый регион просто отбрасывался.
В ходе процедуры error analysis авторы так же разработали метод, позволяющий уменьшить ошибку выделения охватывающей рамки объекта — bounding-box regression. После классификации содержимого региона-кандидата, при помощи линейной регрессии на основе признаков из CNN определялись четыре параметра — (dx, dy, dw, dh). Они описывали, насколько надо сдвинуть центр рамки региона по х и у, а также на сколько изменить её ширину и высоту, чтобы точнее охватывать распознанный объект. Таким образом, процедуру детектирования объектов сетью R-CNN можно разделить на следующие шаги:
- Выделение регионов-кандидатов при помощи Selective Search.
- Преобразование региона в размер, принимаемый CNN CaffeNet.
- Получение при помощи CNN 4096-размерного вектора признаков.
- Проведение N бинарных классификаций каждого вектора признаков при помощи N линейных SVM.
- Линейная регрессия параметров рамки региона для более точного охвата объекта
Авторы отмечали, что разработанная ими архитектура так же неплохо показывала себя в задаче semantic segmentation.
Fast R-CNN
Несмотря на высокие результаты, производительность R-CNN была всё же невысока, особенно для более глубоких, чем CaffeNet сетей (таких как VGG16). Кроме того, обучение bounding box regressor и 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,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)
Здесь: u — класс объекта, реально изображённого в регионе-кандидате;
Lcls(p,u)=−log(pu) – log loss для класса u;
v=(vx,vy,vw,vh) – реальные изменения рамки региона для более точного охватывания объекта; tu=(txu,tyu,twu,thu) – предсказанные изменения рамки региона; Lloc – loss-функция между предсказанными и реальными изменениями рамки; [u≥1] – индикаторная функция, равная 1, когда u≥1, и 0, когда наоборот. Классом u=0 обозначается фон (т.е. отсутствие объектов в регионе).
λ – коэффициент, предназначенный для балансирования вклада обоих 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-функций каждого из них, с балансирующим коэффициентом.
Оба слоя RPN выдают только предложения для регионов-кандидатов. Те из них, которые имеют высокую вероятность содержания какого-либо объекта, передаются дальше в модуль детектирования объектов и уточнения охватывающей рамки, который по-прежнему реализован как Fast R-CNN.
Для того, чтобы разделять признаки, получаемые в CNN, между RPN и модулем детектирования, процесс обучения всей сети построен итерационно, с использованием нескольких шагов:
- Инициализируется и обучается на определение регионов-кандидатов RPN-часть.
- С использованием предлагаемых RPN регионов заново обучается Fast R-CNN часть.
- Обученная сеть детектирования используется, чтобы инициализировать веса для RPN. Общие convolution-слои, однако, фиксируются и производится донастройка только слоёв, специфичных для RPN.
- С зафиксированными convolution-слоями окончательно донастраивается Fast R-CNN.
Предложенная схема не является единственной, и даже в текущем виде она может быть продолжена дальнейшими итерационными шагами, но авторы оригинального исследования проводили эксперименты именно после такого обучения.
Mask R-CNN
Mask R-CNN развивает архитектуру Faster R-CNN путём добавления ещё одной ветки, которая предсказывает положение маски, покрывающей найденный объект, и, таким образом решает уже задачу instance segmentation. Маска представляет собой просто прямоугольную матрицу, в которой 1 на некоторой позиции означает принадлежность соответствующего пикселя объекту заданного класса, 0 — что пиксель объекту не принадлежит.
Визуализация разноцветных масок на исходных изображениях может давать красочные картинки:
Авторы документа условно разделяют разработанную архитектуру на CNN-сеть вычисления признаков изображения, называемую ими backbone, и head — объединение частей, отвечающих за предсказание охватывающей рамки, классификацию объекта и определение его маски. Loss функция для них общая и включает три компонента:
L=Lcls+Lbox+Lmask
Выделение маски происходит в class-agnostic стиле: маски предсказываются отдельно для каждого класса, без предварительного знания, что изображено в регионе, и потом просто выбирается маска класса, победившего в независимом классификаторе. Утверждается, что такой подход более эффективен, чем опирающийся на априорное знание класса.
Одна из основных модификаций, возникших из-за необходимости предсказывать маску — изменение процедуры RoIPool(вычисляющей матрицу признаков для региона-кандидата) на так называемую RoIAlign. Дело в том, что карта признаков, полученная из CNN, имеет меньший размер, чем исходное изображение, и регион, охватывающий на изображении целочисленное количество пикселей, не получается отобразить в пропорциональный регион карты с целочисленным количеством признаков:
В RoIPool проблема решалась просто округлением дробных значений до целых. Такой подход нормально работает при выделении охватывающей рамки, но вычисленная на основе таких данных маска получается слишком неточной. В противоположность этому, в RoIAlign не используется округление, все числа остаются действительными, а для вычисления значений признаков используется билинейная интерполяция по четырём ближайшим целочисленным точкам.
В оригинальном документе разница поясняется таким рисунком:
Здесь штрихованной сеткой обозначена карта признаков, а непрерывной — отображение на карту признаков региона-кандидата с исходной фотографии. В данный регион должно попасть 4 группы для max pooling по 4 признака, обозначенных на рисунке точками. В отличие от процедуры RoIPool, которая за счёт округления просто бы выровняла регион по целочисленным координатам, RoIAlign оставляет точки в их текущих местах, но вычисляет значения каждой из них при помощи билинейной интерполяции по четырём ближайшим признакам.
Билинейная интерполяция
Билинейная интерполяция функции двух переменных производится за счёт применения линейной интерполяции сначала в направлении одной из координат, затем — в другой.
Пусть нужно интерполировать значение функции f(x,y) в точке P при известных значениях функции в окружающих точках Q11=(x1,y1), Q12=(x1,y2), Q21=(x2,y1), Q22=(x2,y2)
(см. рисунок ниже). Для этого вначале интерполируются значения вспомогательных точек R1 и R2, а затем на их основе интерполируется значение в точке P.
R1 = (x,y1) R2 = (x,y2)
f(R1) ≈ ((x2−x) / (x2−x1)) * f(Q11) + ((x−x1) / (x2−x1)) * f(Q21)
f(R1) ≈ ((x2−x) / (x2−x1)) * f(Q12) + ((x−x1) / (x2−x1)) * f(Q22)
f(P) ≈ ((y2−y) / (y2−y1)) * f(R1) + ((y−y1) / (y2−y1)) * f(R2)
(подробнее — например, на википедии )
Помимо выскоких результатов в задачах instance segmentation и object detection, Mask R-CNN оказалась пригодной для определения поз людей на фотографии (human pose estimation). Ключевой момент здесь — выделение опорных точек (keypoints), таких как левое плечо, правый локоть, правое колено и т.п., по которым можно нарисовать каркас позиции человека:
Для определения опорных точек нейросеть обучают таким образом, чтобы она выдавала маски, в которых только один пиксель (та самая точка) имел значение 1, а остальные — 0 (one-hot mask). В то же время, сеть тренируется выдавать K таких однопиксельных масок, по одной для каждого типа опорной точки.
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.2524
- Fast R-CNN: https://arxiv.org/abs/1504.08083
- Faster R-CNN: https://arxiv.org/abs/1506.01497
- Mask R-CNN: https://arxiv.org/abs/1703.06870
- Feature Pyramid Network: https://arxiv.org/abs/1612.03144
На medium.com на тему Mask R-CNN достаточно много статей, они легко находятся поиском. В качестве ссылок привожу только те, что довелось прочитать:
6. Simple Understanding of Mask RCNN — краткое изложение принципов результирующей архитектуры. 7. A Brief History of CNNs in Image Segmentation: From R-CNN to Mask R-CNN — история развития сети в таком же хронологическом порядке, как в данной статье. 8. From R-CNN to Mask R-CNN — ещё одно рассмотрение этапов развития. 9. Splash of Color: Instance Segmentation with Mask R-CNN and TensorFlow — реализация нейросети в Opensource-библиотеке от компании Matterport.
Последняя статья помимо описания принципов Mask R-CNN предлагает возможность попробовать сеть на практике: для раскрашивания разными цветами воздушных шаров на чёрно-белых изображениях.
Помимо этого, попрактиковаться с нейросетью можно на той модели, что использовалась мной в соревновании Data Science Bowl 2018 на kaggle (но не только с одной этой моделью, разумеется; в разделах Kernels и Discussions можно найти много всего интересного):
10. Mask R-CNN in PyTorch by Heng CherKeng. Реализация предполагает ряд шагов по развёртыванию, инструкцию автор предоставляет. Модель требует PyTorch 0.4.0, поддержку GPU-вычислений, NVIDIA CUDA. Если собственная система не соответствует требованиям, могу порекомендовать образы Deep Learning AMI для виртуалок Amazon (инстансы платные, с почасовой тарификацией, минимальный подходящий размер, судя по всему, — p2.xlarge).
Мне также попадалась статья про использование сети от Matterport в обработке изображений с блюдами (правда, без исходников).
Надеюсь, автор будет только рад дополнительному упоминанию:
11. ConvNets. Создание прототипа проекта с помощью Mask R-CNN
- Источник(и):
- Войдите на сайт для отправки комментариев