Технический блог 丨 Серия практических занятий: семантическая сегментация резюме!

искусственный интеллект компьютерное зрение
Технический блог 丨 Серия практических занятий: семантическая сегментация резюме!

Автор: Ю Луин, Университет Фучжоу, член Datawhale

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

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

image.pngСегментацию изображения можно разделить на следующие три подполя: семантическая сегментация, сегментация экземпляров и панорамная сегментация.

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

01 Ключевые этапы семантической сегментации

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

Во-первых, на примере задачи семантической сегментации мы вводим различные представления меток.

1.1 График семантической метки

Набор данных семантической сегментации включает в себя исходное изображение и изображение семантической метки, оба из которых имеют одинаковый размер и оба являются изображениями RGB.

На изображении этикетки белый и черный представляют собой границу и фон соответственно, а другие цвета представляют разные категории:

image.png

1.2 Маска одного канала

Значение RGB каждой метки соответствует соответствующему классу метки, тогда индекс класса каждого пикселя в метке можно легко найти для создания одноканальной маски.

Как показано на рисунке ниже, категории аннотаций включают: «Человек», «Кошелек», «Растения», «Тротуар» и «Здание». Карта семантических меток преобразуется в одноканальную маску, как показано справа Размер остается неизменным, но количество каналов изменяется с 3 на 1.

image.pngПоложение каждого пикселя соответствует друг другу.

image.png

1.3 Горячее кодирование

Onehot, как метод кодирования, может кодировать каждую одноканальную маску.

Например, для вышеупомянутой карты маски размер изображения равен 5, а типов меток 5. Нам нужно превратить эту маску в 5-канальный выход Onehot с размером 1, который должен извлекать пиксели. медианное значение которого в маске равно 1. Генерируется график, соответствующая позиция устанавливается в 1, а остальные равны 0. Затем извлеките все двойки, чтобы создать новый график, установите соответствующую позицию в 1, остальные в 0 и так далее.

image.png

02 Практика семантической сегментации

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

Практика используетPascal VOC 2012语义分割数据集, который является очень важным набором данных для задач семантической сегментации.Существует 20 типов целей, включая людей, автомобили и другие категории, которые можно использовать для целевой категории или фоновой сегментации.

Адрес открытого источника набора данных:

gas.GR AVI упоминает Can/DataSet/ до конца…

2.1 Чтение набора данных

Это использованиеПлатформа данных Gridwu TitaniumСервис для завершения онлайн-чтения наборов данных, платформа поддерживает различные типы наборов данных и предоставляет множество общедоступных наборов данных для удобства использования. Сделайте некоторые необходимые приготовления перед использованием:

  • Разветвить набор данных: если вам нужно использовать общедоступный набор данных, вам нужно сначала разветвить его на свою учетную запись.
  • Get AccessKey: получите ключ, необходимый для использования SDK для взаимодействия с платформой данных Gridwu Titanium, ссылкаgas.GR AVI упоминает. Для /tensor bay/'s…
  • Сегмент понимания: дальнейшее разделение набора данных, например, набора данных VOC, делится на две части: «поезд» и «тест».
import os\
from tensorbay import GAS\
from tensorbay.dataset import Data, Dataset\
from tensorbay.label import InstanceMask, SemanticMask\
from PIL import Image\
import numpy as np\
import torchvision\
import matplotlib.pyplot as plt\
\
ACCESS_KEY = "<YOUR_ACCESSKEY>"\
gas = GAS(ACCESS_KEY)\
\
\
def read_voc_images(is_train=True, index=0):\
    """\
    read voc image using tensorbay\
    """\
    dataset = Dataset("VOC2012Segmentation", gas)\
    if is_train:\
        segment = dataset["train"]\
    else:\
        segment = dataset["test"]\
\
    data = segment[index]\
    feature = Image.open(data.open()).convert("RGB")\
    label = Image.open(data.label.semantic_mask.open()).convert("RGB")\
    visualize(feature, label)\
\
    return feature, label  # PIL Image\
\
\
def visualize(feature, label):\
    """\
    visualize feature and label\
    """\
    fig = plt.figure()\
    ax = fig.add_subplot(121)  # 第一个子图\
    ax.imshow(feature)\
    ax2 = fig.add_subplot(122)  # 第二个子图\
    ax2.imshow(label)\
    plt.show()\
\
train_feature, train_label = read_voc_images(is_train=True, index=10)\
train_label = np.array(train_label) # (375, 500, 3)

image.png

2.2 Цветовая карта

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

def colormap_voc():\
    """\
    create a colormap\
    """\
    colormap = [[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],\
                    [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],\
                    [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],\
                    [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],\
                    [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],\
                    [0, 64, 128]]
    classes = ['background', 'aeroplane', 'bicycle', 'bird', 'boat',\
                   'bottle', 'bus', 'car', 'cat', 'chair', 'cow',\
                   'diningtable', 'dog', 'horse', 'motorbike', 'person',\
                   'potted plant', 'sheep', 'sofa', 'train', 'tv/monitor']\
\
    return colormap, classes

2.3 Метка и Onehot конвертация

В соответствии с таблицей сопоставления реализуйте взаимное преобразование между картой семантической метки и кодировкой Onehot:

def label_to_onehot(label, colormap):\
    """\
    Converts a segmentation label (H, W, C) to (H, W, K) where the last dim is a one\
    hot encoding vector, C is usually 1 or 3, and K is the number of class.\
    """\
    semantic_map = []\
    for colour in colormap:\
        equality = np.equal(label, colour)\
        class_map = np.all(equality, axis=-1)\
        semantic_map.append(class_map)\
    semantic_map = np.stack(semantic_map, axis=-1).astype(np.float32)\
    return semantic_map\
\
def onehot_to_label(semantic_map, colormap):\
    """\
    Converts a mask (H, W, K) to (H, W, C)\
    """\
    x = np.argmax(semantic_map, axis=-1)\
    colour_codes = np.array(colormap)\
    label = np.uint8(colour_codes[x.astype(np.uint8)])\
    return label\
\
colormap, classes = colormap_voc()\
semantic_map = mask_to_onehot(train_label, colormap)\
print(semantic_map.shape)  # [H, W, K] = [375, 500, 21] 包括背景共21个类别\
\
label = onehot_to_label(semantic_map, colormap)\
print(label.shape) # [H, W, K] = [375, 500, 3]

2.4 Преобразование Onehot и Mask

Аналогично, с помощью таблицы отображения реализовано преобразование между одноканальной маской Mask и кодировкой Onehot:

def onehot2mask(semantic_map):\
    """\
    Converts a mask (K, H, W) to (H,W)\
    """\
    _mask = np.argmax(semantic_map, axis=0).astype(np.uint8)\
    return _mask\
\
\
def mask2onehot(mask, num_classes):\
    """\
    Converts a segmentation mask (H,W) to (K,H,W) where the last dim is a one\
    hot encoding vector\
\
    """\
    semantic_map = [mask == i for i in range(num_classes)]\
    return np.array(semantic_map).astype(np.uint8)\
\
mask = onehot2mask(semantic_map.transpose(2,0,1))\
print(np.unique(mask)) # [ 0  1 15] 索引相对应的是背景、飞机、人\
print(mask.shape) # (375, 500)\
\
semantic_map = mask2onehot(mask, len(colormap))\
print(semantic_map.shape) # (21, 375, 500)

Для получения дополнительной информации посетитеОфициальный сайт Gewu Titanium