Ну для начала всем привет, в этой статье постараюсь рассказать вам про структуру Mesh R-CNN как он работает, что вообще из себя представляет, также будут сделаны сноски с описанием концепции по генерации 3D объектов. Буду опираться как и уже на существующие статьи, так буду и от себя писать. Возможно будут где то ошибки, потому если заметите, постараюсь исправить.
Вообще для чего нужен Mesh R-CNN, нужен он для того чтобы генерировать 3D объекты на основе изображения. Этот метод построен на фундаменте Mask R-CNN [2], но с добавлением ветви для предсказания сеток. Это создает начальное представление, которое преобразуется в сетку и уточняется с помощью графовой сверточной сети.
Современные системы успешно распознают объекты, локализуют их с помощью 2D границ или масок и предсказывают позицию ключевых точек на изображении. Метод же Mesh R-CNN использует 2D распознавание и прогнозирование 3D форм для создание системы, которая принимает RGB изображение, обнаруживает объект( с помощью детекции ) выводя его категорию, сегментационную маску и 3D треугольную сетку, представляющую полную 3D форму объекта.
Mesh R-CNN принимает на вход изображение , предсказывает экземпляры объектов и определяет их 3D форму. Чтобы учесть разнообразие геометрии и топологию объектов, с начало предсказываются грубые воксельные формы, которые уточняются для предсказание точных сеток.
Эта система динамически изменяет сложность, топологию и геометрию в зависимости от визуальных стимулов (признаков у объекта: цвет, форма, текстура ). Создавая изначально воксельное представление объектов и затем преобразуя его в меш сетку, позволяет создавать сетки произвольной топологией и точно передавать детали объекта.
Справочный материал
(В этом пункте очень быстро пройдемся по каждому этапу этой системы, для общего понимания для входа в курса дела или для дальнейшего справочного материала)
На данном изображении представляется обзор на систему Mesh R-CNN, расширенную версия Mask R-CNN с добавлением 3D инференции формы (процесс извлечения и восстановления трехмерной структуры и геометрии объекта на основе его двумерных изображений)
Входной слой: подается изображение , из которого извлекается информация.
Box/Mask Branch: Эта ветвь обрабатывает изображение и получает box(рамку), класс и 2D маску
Voxel Branch: Эта система представляет наше изображение в грубой воксельной форме, преобразуя изображение в воксели которые представляют 3D данные в виде кубиков
Cubified Mesh: На этом этапе полученные данные из воксельной ветки преобразуются в сетку, состоящую из кубиков, что упрощает последующую обработку данных.
* Mesh Refinement Branch: * (Этот этап повторяется заданное количество раз)
Vert Align: Выравнивает вершины исходя из изображения для более точной работы с 3D формой
Graph conv: Применение графовой свертки для уточнения структуры сетки, что позволяет захватывать локальные признаки и улучшает модель
Refine: Небольшая доработка сети
Final mesh: Это окончательный этап на котором мы получаем оконченную 3D форму нашего объекта
(В этом пункте мы уже разберемся не много поподробнее)
Mesh Predictor или меш-предсказатель
В основе нашей системы стоит меш-предсказатель, который получает свертки, связанные с рамкой объекта, и представляет треугольную сетку, отражающую полную форму 3D объекта. Наша цель захватить сильные признаки объекта на изображении. Где каждая предсказанная форма имеет уникальную топологию и геометрию.
Мы предсказываем различные топологии формы, используя последовательность операции изменения формы. Ветвь вокселей генерирует вокселезированные представления объекта, которые корректируются с помощью уточняющей сетки.
Результатом работы меш-предсказателя является треугольная сетка T=(V,F) для каждого объекта, где V – множество позиций вершин, а F – множество треугольных граней.
Voxel branch или ветка вокселей
Скрытый текстVoxel branch прогнозирует сетку вероятностей занятости вокселей, для каждого найденного объекта, что позволяет определить его 3D форму. Вместо предсказаний сетки MxM, мы предсказываем сетку GxGxG, что представляет полную 3D форму объекта.
Как и в Mask R-CNN мы сохраняем соответствие между входными признаками и предсказанными вокселями. Применяя небольшую полную сверточную сеть к результату RoIAlign (определяет регион интереса). Эта сеть создает карту признаков с G каналами, показывая вероятность занятости вокселей для каждой позиции.
Рассмотрим на примере
*Мировое пространство*
Имеется плоскость изображения (image plane) которая обозначается красным цветом и представляет собой плоскость, на которую проецируется объекты сцены.
Параметры Znear и Zfar указывают на расстояние от камеры до ближайших и самых дальних объектов, которая она может видеть
*Пространство предсказания*
Справа представлено пространство куда указывается вероятности заполненности вокселей
В этом пространстве используется внутреняя матрица камеры K для трансформации данных
Обозначение K-1 указывает на инверсию(обратная операция) этой матрицы, которая применяется для преобразование предсказаний обратно в мировое пространство.
* Пример процесса *
Камера делает снимок сцены, и благодаря матрицы K, данные модели обрабатываются в “пространстве предсказания”, где воксели имеют неправильные формы(что эти кубики могут иметь гладкость на гранях) . Эти предсказания преобразуются обратно в мировое пространство с помощью матрицы K-1 , что позволяет правильно сопоставить их с реальным расположением объектов в сцене. (В начале подается изображение, и на нем мы используем какой либо метод для детекции (например Faster R-CNN), после для каждой области интереса (RoI) извлекаются признаки, признаки обрабатываются с помощью сверточной сети, которая превращает их в 3D представление, присваивания вероятности каждому вокселю).
Cubufy: преобразование вокселей в меш
Воксельная ветвь создает 3D решетку вероятности занятости генерируя грубую форму объекта. Но если мы хотим чтобы наш 3D объект был более детализированным, мы должны преобразоваться наши воксельные предсказания в треугольную сетку(меш), которая будет передана в ветвь доработки меша с помощью cubify. Cubify принимает предсказания занятости вокселей и порог бинаризации занятости вокселей ( при достижение определенного порога веса вокселя он преобразуется в 1, иначе преобразуется в 0). Каждый занимаемый воксель заменяется на кубическую треугольную решетку с 8 вершинами с 18 ребрами и 12 гранями. Если соседние вершины и ребра соединяются, то грань устраняются. Это приводит к сеточной форме, чей топологический вид зависит от предсказаний вокселя.
Воксельная ветвь обучается для минимизации бинарной кросс-энтропии между предсказанными вероятностями занятости вокселей и истинными значениями занятости.
Mesh Refinement Branch или ветка уточнение сети
Кубическая сеть из воксельной ветки предоставляет лишь грубую 3D форму и не может точно моделировать мелки ее части. Ветка уточнения поэтапно ее позицию вершин. Каждый этап состоит из 3 операций: выравнивание вершин, графовая свертка, которая передает информацию вдоль ребер сетки и уточнение вершин, которая обновляет позиции вершин. Каждый слой поддерживает 3D позицию Vi и вектор признаков fi для каждой вершины сетки.
Vertex Alignment или выравнивание вершин
Скрытый текстВыравнивание вершин генерирует вектор признаков, выровненный по изображению, для каждой вершины сетки. Мы используем внутреннюю матрицу камеры для проекции вершин на плоскости изображения. Учитывая карту признаков , мы вычисляем билинейно интерполяционный признак изображения в каждой проекции вершины. (то есть у нас уже есть воксельная 3D форма и мы из этой 3D формы достаем вершины и сопоставляем их с изображением, после используется сверточная сеть для извлечения признаков и так как наше формирование из 3D формы скорее всего не будет совпадать мы воспользуемся билинейной интерполяцией. И наконец мы получаем набор признаков, которые обьединяются в вектор признаков для каждой вершины)
На первом этапе ветки уточнения выводит начальный вектор признаков для каждой вершины. На последних этапах конкатенируется с вектором признаков вершины из предыдущего этапа.
Graph convolution или графовая сеть
Скрытый текстГрафовая сеть распространяет информацию по краям сетки. Учитывая входные признаки вершин fi, она вычисляет обновленные признаки
, где N(i) это соседи i-вершины в сетки, а w0 и w1 это матрица весов которые обучаются. На каждом этапе ветви уточнения сетки используется несколько слоев графовой свертки для агрегации (объединение данных из разных мест для получение одной более обобщенной величины) над локальными регионами сетки.
Vertex Refinement или уточнение вершин
Уточнение вершин вычисляет обновленные позиции вершин
, где Wvert это обученная матрица весов. Это обновляет геометрию меша, сохраняя фиксированную топологию. На каждом этапе ветви уточнения меша происходит завершение уточнения вершин, что приводит к промежуточному результату меша, который дальше уточняется на следующем этапе.
Mesh Loss ну или функция потерь
При обучении системы (например, для улучшения 3D-моделей) необходимо определять, насколько хорошо модель справляется с задачей. Вместо того чтобы вычислять потери напрямую по сетке треугольников (что сложно), мы преобразуем сетку в облако точек.
И теперь есть два пути, по какой метрики мы можем пойти
Первая метрика это Chamfer Distance (расстояние между точками)
где P и Q это два набора точек, а p и q конкретная точка в облаке пространства. Первый член вычисляет среднее расстояние между точками из набора ( P ) и ближайшими точками из набора ( Q ), второй член аналогично первому вычисляет среднее расстояние между точками из набора ( Q ) и ближайшими точками из набора ( P ).
(Эта метрика измеряет расстояние между двумя облаками точек. Она определяет, насколько близки точки одной модели к точкам другой модели, минимизируя средние расстояния между ними)
Вторая метрика это Normal Distance (измеряется угол между векторами нормалей)
где P и Q также два набора точек, но уже up и uq это ассоциированные элементы множеств ( то есть каждому объекту в одном множестве есть собственный вектор описание в другом, вообще можно провести аналогию с кластеризацией, где векторы служат числовыми представлениями объектов, позволяя алгоритмам вычислять схожесть и оценивать, какие объекты должны быть сгруппированы вместе в кластеры(надеюсь не запутал))
Короче, Normal Distance измеряет угол между векторами нормалей (направление, перпендикулярное поверхности), что помогает оценить, насколько правильно поверхности моделей соответствуют друг другу.
Shape regularizer или регуляризация
Edge Loss
где V это набор вершин, а E набор ребер.
Если прям в крации, то эта потеря назначает штрафы за слишком длинные или короткие ребра на модели, что поддерживает качество формы.
В заключение всей статьи , объясню в самом простом виде. Есть изображение, из него мы делаем воксельную 3D форму, векторизуя её (работа с вершинами), мы сначала проецируем каждую вершину на 2D-изображение, затем обновляем информацию о ней, анализируя соседние вершины, и наконец, корректируете их положение, чтобы лучше соответствовать этой информации. В результате получается более детализированная 3D-модель с четко очерченными мелкими деталями.
Источник:
[1] - Mesh R-CNN, авторы Georgia Gkioxari, Jitendra Malik, Justin Johnson , Facebook AI Research (FAIR)
[2] - Mask R-CNN, авторы Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick, Facebook AI Research (FAIR)