Краткое руководство по использованию Mask R-CNN, обученное на наборе данных MS COCO

Модели обнаружения объектов, такие как YOLO, R-CNN, помогают нам нарисовать ограничивающую рамку, окружающую объекты, а сегментация экземпляров предоставляет нам пиксельные маски для каждого объекта на изображении. Может возникнуть вопрос, зачем нам расположение пиксель за пикселем?

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

На изображении выше мы видим, что ограничивающие рамки автомобилей пересекаются, а маски с именем класса «автомобиль» не пересекаются / перекрываются.

Итак, мы рассмотрим, как выполнить сегментацию экземпляров с помощью Mask R-CNN (Mask Regional-CNN), после чего с помощью Mask R-CNN мы можем получить как пиксельные местоположения, так и координаты ограничивающей рамки каждого объекта в изображение.

Маска R-CNN

Маска R-CNN сочетает в себе более быстрый R-CNN и FCN (полностью подключенную сеть) для получения дополнительных выходных данных маски, отличных от выходов класса и блока. Таким образом, Mask R-CNN использует ту же двухэтапную процедуру с идентичным первым этапом (который называется RPN: Region Proposal Network). На втором этапе функция извлекается с помощью RoIPool из каждого блока-кандидата и выполняется классификация и регрессия ограничивающего прямоугольника. Прочтите эту статью, чтобы получить более подробное представление о Маске R-CNN

Я использовал Mask R-CNN, построенную на FPN и ResNet101 от материального порта для сегментации, например. Эта модель предварительно обучена на MS COCO, который представляет собой крупномасштабный набор данных для обнаружения, сегментации и субтитров с 80 классами объектов.

Перед тем, как пройти через код, убедитесь, что вы установили все необходимые пакеты и Mask R-CNN.

Установите Keras и другие зависимости:

$ pip install numpy scipy keras h5py tensorflow
$ pip install pillow scikit-image matplotlib imutils
$ pip install "IPython[all]"

Клонируйте репозиторий GitHub и установите реализацию Matterplot для Mask R-CNN.

$git clone https://github.com/matterport/Mask_RCNN.git
$cd Mask_RCNN
$python setup.py install

Примечание. Если вы установили или используете tensorflow v2.0, вы можете столкнуться с некоторыми ошибками Traceback при выполнении скрипта, поскольку Mask R-CNN использует tensorflow v1.3.0

Чтобы избежать этого, вы либо понижаете версию tenorflow, либо редактируете файл Mask_RCNN / rcnn / model.py, заменяя следующие функции перед установкой Mask R-CNN:

  • tf.log() -> tf.math.log()
  • tf.sets.set_intersection() -> tf.sets.intersection()
  • tf.sparse_tensor_to_dense() -> tf.sparse.to_dense()
  • tf.to_float() -> tf.cast([value], tf.float32)

Теперь мы готовы выполнить сценарий:

Шаг I. Импортируйте необходимые пакеты

from mrcnn.config import Config
from mrcnn import model as modellib
from mrcnn import visualize
import cv2
import colorsys
import argparse
import imutils
import random
import os
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

Шаг 2. Создайте случайные цвета для каждого ярлыка класса.

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

Не стесняйтесь увеличивать значение переменной IMAGES_PER_GPU, если ваш графический процессор может с этим справиться, в противном случае (в случае процессора) оставьте его 1.

class SimpleConfig(Config):
    # give the configuration a recognizable name
    NAME = "coco_inference"
    # set the number of GPUs to use along with the number of images
    # per GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1
    # number of classes on COCO dataset
    NUM_CLASSES = 81

Шаг IV. Создайте объект класса конфигурации и загрузите модель с весами.

Вы можете скачать веса здесь.

config = SimpleConfig()
config.display()
model = modellib.MaskRCNN(mode="inference", config=config, model_dir=os.getcwd())
model.load_weights("mask_rcnn_coco.h5", by_name=True)

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

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

image = cv2.imread("<image_path&name>")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = imutils.resize(image, width=512)
# perform a forward pass of the network to obtain the results
print("[INFO] making predictions with Mask R-CNN...")
result = model.detect([image], verbose=1

Шаг VI. Визуализируйте результат

r1 = result[0]
visualize.display_instances(image, r1['rois'], r1['masks'],   r1['class_ids'], CLASS_NAMES, r1['scores'])

Пример вывода:

Подводя итог этой публикации, я бы сказал, что сегментация экземпляров - это еще один шаг вперед по сравнению с обнаружением объектов, поскольку она дает пиксельные маски изображения. Faster R-CNN требует больших вычислительных ресурсов, и мы вводим сегментацию экземпляров поверх этого в Mask R-CNN. Следовательно, Mask R-CNN становится более затратной в вычислительном отношении. Это затрудняет запуск Mask R-CNN в режиме реального времени на ЦП.

Ссылки

Кайминг Хе, Джорджия Гкиоксари, Петр Доллар, Росс Гиршик, Маска R-CNN, Источник