Обнаружение объектов с помощью R-CNN

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

Michal Oleszak

Machine Learning Engineer

Семейство сетей на основе регионов: R-CNN

Семейство R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Модуль 1: генерация кандидатов на регионы
1 Источник: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Глубокое обучение для работы с изображениями на PyTorch

Семейство сетей на основе регионов: R-CNN

Семейство R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Модуль 1: генерация кандидатов на регионы
  • Модуль 2: извлечение признаков (сверточные слои)
1 Источник: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Глубокое обучение для работы с изображениями на PyTorch

Семейство сетей на основе регионов: R-CNN

Семейство R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Модуль 1: генерация кандидатов на регионы
  • Модуль 2: извлечение признаков (сверточные слои)
  • Модуль 3: предсказание класса и ограничивающего прямоугольника
1 Источник: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: backbone

  • Сверточные слои: предобученные модели
    • Backbone: основная архитектура CNN, отвечающая за извлечение признаков

  backbone

  • Сверточные слои и слои пулинга
  • Извлекают признаки для кандидатов на регионы и обнаружения объектов
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: backbone с PyTorch

import torch.nn as nn
from torchvision.models import vgg16,
    VGG16_Weights


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

модель vgg

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

R-CNN: backbone с PyTorch

import torch.nn as nn
from torchvision.models import vgg16,
    VGG16_Weights


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

признаки модели vgg

  • .features: только сверточные слои
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: backbone с PyTorch

import torch.nn as nn
from torchvision.models import vgg16,
    VGG16_Weights


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

модель vgg

  • .features: только сверточные слои
  • .children(): все слои блока
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: backbone с PyTorch

import torch.nn as nn
from torchvision.models import vgg16,
    VGG16_Weights


vgg = vgg16(weights=VGG16_Weights.DEFAULT)
backbone = nn.Sequential( *list(vgg.features.children()) )
  • nn.Sequential(*list()): все подслои помещаются в последовательный блок в виде списка
    • *: распаковывает элементы списка

модель vgg

  • .features: только сверточные слои
  • .children(): все слои блока
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: слой классификатора

  • Извлечение размера выходных данных backbone
input_dimension = nn.Sequential(*list(
    vgg_backbone.classifier.children())
)[0].in_features
  • Создание нового классификатора
classifier = nn.Sequential(
    nn.Linear(input_dimension, 512),
    nn.ReLU(),
    nn.Linear(512, num_classes),
)
Глубокое обучение для работы с изображениями на PyTorch

R-CNN: слой регрессора ограничивающих прямоугольников

  • Располагается поверх backbone
  • 4 выхода для 4 координат ограничивающего прямоугольника
box_regressor = nn.Sequential(
    nn.Linear(input_dimension, 32),
    nn.ReLU(),
    nn.Linear(32, 4),
)
Глубокое обучение для работы с изображениями на PyTorch

Собираем всё вместе: модель обнаружения объектов

class ObjectDetectorCNN(nn.Module):
    def __init__(self):
        super(ObjectDetectorCNN, self).__init__()

vgg = vgg16(weights=VGG16_Weights.DEFAULT) self.backbone = nn.Sequential(*list(vgg.features.children()))
input_features = nn.Sequential(*list(vgg.classifier.children()))[0].in_features
self.classifier = nn.Sequential( nn.Linear(input_features, 512), nn.ReLU(), nn.Linear(512, 2), )
self.box_regressor = nn.Sequential( nn.Linear(input_features, 32), nn.ReLU(), nn.Linear(32, 4), )
Глубокое обучение для работы с изображениями на PyTorch

Собираем всё вместе: модель обнаружения объектов

class ObjectDetector(nn.Module):
    (...)

    def forward(self, x):

features = self.backbone(x)
bboxes = self.regressor(features) classes = self.classifier(features) return bboxes, classes
Глубокое обучение для работы с изображениями на PyTorch

Запуск распознавания объектов

  1. Загрузите и преобразуйте изображение
  2. Примените unsqueeze() к изображению для добавления размерности батча
  3. Передайте тензор изображения в модель
  4. Запустите подавление немаксимумов (nms()) над выходными данными модели
  5. Нарисуйте ограничивающие прямоугольники с помощью draw_bounding_boxes()
Глубокое обучение для работы с изображениями на PyTorch

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

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

Preparing Video For Download...