Свёрточные слои для изображений

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

Michal Oleszak

Machine Learning Engineer

Свёрточные слои для изображений

  • Применение свёрточных слоёв к изображениям
  • Доступ к свёрточным слоям и их добавление
  • Создание свёрточных блоков

 

  • Используются для адаптации модели к конкретной задаче

Рамка вокруг кошки

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

Conv2d: входные каналы

Каналы RGB

  • Оттенки серого: in_channels=1
  • RGB-изображение (красный, зелёный, синий): in_channels=3
  • Прозрачность включает альфа-канал: in_channels=4
from torchvision.transforms import functional
image = PIL.Image.open("dog.png")
num_channels = functional.get_image_num_channels(image)
print("Number of channels: ", num_channels)
Number of channels: 3
Глубокое обучение для работы с изображениями на PyTorch

Conv2d: ядро

фильтры

                                        Входной тензор               Ядро       Выходной тензор (карта признаков)

  • Ядро (выделено зелёным) движется слева направо и сверху вниз по изображению$^1$
1 Thevenot, Axel. 2020. A visual and mathematical explanation of the 2D convolution layer.
Глубокое обучение для работы с изображениями на PyTorch

Размеры ядра

матричное вычисление

  • Наиболее распространённые размеры ядра: 3×3 (Conv2d) и 2×2 (MaxPool2d)
  • Свёртка — это скалярное произведение ядра (зелёного) и области изображения (розовой)
  • Сумма скалярных произведений формирует карту признаков (синюю)
Глубокое обучение для работы с изображениями на PyTorch

Ядро как фильтр

  • Выделяют паттерны в изображении

фильтр областей

фильтр линий

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

Conv2d: выходные каналы

выходные каналы                                             Входной канал      Фильтры ядра     Выходные каналы

  • Число выходных каналов определяет количество применяемых фильтров
  • Каждый выходной канал соответствует отдельному фильтру
  • Больше выходных каналов — слой способен извлекать более сложные признаки
  • Число выходных каналов обычно выбирают как степень 2 (16, 32, 64, 128)
    • Это упрощает объединение и разделение каналов в последующих слоях
Глубокое обучение для работы с изображениями на PyTorch

Добавление свёрточных слоёв

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
model = Net()

model.add_module('conv2', conv2)
Глубокое обучение для работы с изображениями на PyTorch

Доступ к свёрточным слоям

print(model)
Net(
  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
model.conv2
Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
Глубокое обучение для работы с изображениями на PyTorch

Создание свёрточных блоков

  • Объединение свёрточных слоёв в блок с помощью nn.Sequential()
class BinaryImageClassification(nn.Module):
    def __init__(self):
        super(BinaryImageClassification, self).__init__()

self.conv_block = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) )
def forward(self, x): x = self.conv_block(x)
Глубокое обучение для работы с изображениями на PyTorch

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

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

Preparing Video For Download...