Виявлення об'єктів за допомогою R-CNN

Глибоке навчання для зображень із PyTorch

Michal Oleszak

Machine Learning Engineer

Region-based CNN family: R-CNN

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

R-CNN

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

Region-based CNN family: R-CNN

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

R-CNN

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

Region-based CNN family: 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 model

Глибоке навчання для зображень із PyTorch

R-CNN: backbone з PyTorch

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

vgg model features

  • .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 model

  • .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 model

  • .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. Запустіть Non-Max Suppression (nms()) на виході моделі
  5. Викличте draw_bounding_boxes() поверх зображення
Глибоке навчання для зображень із PyTorch

Давайте потренуємось!

Глибоке навчання для зображень із PyTorch

Preparing Video For Download...