Введение в сегментацию изображений

Глубокое обучение для работы с изображениями на PyTorch

Michal Oleszak

Machine Learning Engineer

Сегментация изображений

  • Сегментация изображений разбивает изображение на сегменты на уровне пикселей
  • Каждый пиксель относится к определённому сегменту
  • Три вида сегментации:
    • Семантическая сегментация
    • Сегментация по экземплярам
    • Паноптическая сегментация
Глубокое обучение для работы с изображениями на PyTorch

Семантическая сегментация

семантическая сегментация

  • Каждый пиксель относится к определённому классу
  • Все пиксели одного класса обрабатываются одинаково
Глубокое обучение для работы с изображениями на PyTorch

Сегментация по экземплярам

сегментация по экземплярам

  • Различает отдельные экземпляры одного класса
  • Фон, как правило, не сегментируется
Глубокое обучение для работы с изображениями на PyTorch

Паноптическая сегментация

паноптическая сегментация

  • Объединяет семантическую сегментацию и сегментацию по экземплярам
  • Присваивает уникальную метку каждому экземпляру объекта
  • Классифицирует фон на уровне пикселей
Глубокое обучение для работы с изображениями на PyTorch

Аннотации данных

image = Image.open("images/British_Shorthair_36.jpg")
mask = Image.open("annots/British_Shorthair_36.png")


transform = transforms.Compose([ transforms.ToTensor() ]) image_tensor = transform(image) mask_tensor = transform(mask)
print(f"""Image shape: {image_tensor.shape} Mask shape: {mask_tensor.shape}""")
    Image shape: torch.Size([3, 333, 500])
    Mask shape: torch.Size([1, 333, 500])

фотография кошки британской короткошёрстной породы

Глубокое обучение для работы с изображениями на PyTorch

Анализ маски

  • Документация к набору данных:

    Пиксельные аннотации: 1 — передний план, 2 — фон, 3 — не классифицировано

  • Уникальные значения маски:

    mask_tensor.unique()
    
    tensor([0.0039, 0.0078, 0.0118])
    
  • Значения пикселей делятся на 255:

    • 1 / 255 = 0.0039 — объект
    • 2 / 255 = 0.0.0078 — фон
    • 3 / 255 = 0.0118 — не классифицировано
Глубокое обучение для работы с изображениями на PyTorch

Создание бинарной маски

binary_mask = torch.where(
    mask_tensor == 1/255, 
    torch.tensor(1.0),
    torch.tensor(0.0),
)


to_pil_image = transforms.ToPILImage() mask = to_pil_image(binary_mask)
plt.imshow(mask)

маска сегментации

  • torch.where():
    • Условие
    • Значение, если условие выполнено
    • Значение в противном случае
  • Преобразование маски в изображение PIL
  • Отображение маски
Глубокое обучение для работы с изображениями на PyTorch

Сегментация объекта

object_tensor = image_tensor * binary_mask


to_pil_image = transforms.ToPILImage() object_image = to_pil_image(object_tensor)
plt.imshow(object_image)

сегментированное изображение

  • Умножение изображения на бинарную маску
  • Преобразование объекта в изображение PIL
  • Отображение объекта
Глубокое обучение для работы с изображениями на PyTorch

Давайте потренируемся!

Глубокое обучение для работы с изображениями на PyTorch

Preparing Video For Download...