Wykrywanie obiektów z R-CNN

Głębokie uczenie dla obrazów z PyTorch

Michal Oleszak

Machine Learning Engineer

Rodzina CNN oparta na regionach: R-CNN

Rodzina R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Moduł 1: generowanie propozycji regionów
1 Citation: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Głębokie uczenie dla obrazów z PyTorch

Rodzina CNN oparta na regionach: R-CNN

Rodzina R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Moduł 1: generowanie propozycji regionów
  • Moduł 2: ekstrakcja cech (warstwy konwolucyjne)
1 Citation: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Głębokie uczenie dla obrazów z PyTorch

Rodzina CNN oparta na regionach: R-CNN

Rodzina R-CNN: R-CNN, Fast-CNN, Faster CNN

R-CNN

  • Moduł 1: generowanie propozycji regionów
  • Moduł 2: ekstrakcja cech (warstwy konwolucyjne)
  • Moduł 3: predykcja klas i ramek ograniczających
1 Citation: Jason Brownlee. 2019. Deep Learning for Computer Vision.
Głębokie uczenie dla obrazów z PyTorch

R-CNN: backbone

  • Warstwy konwolucyjne: wstępnie wytrenowane modele
    • Backbone: główna architektura CNN odpowiedzialna za ekstrakcję cech

  backbone

  • Warstwy konwolucyjne i poolingowe
  • Ekstrakcja cech dla propozycji regionów i wykrywania obiektów
Głębokie uczenie dla obrazów z PyTorch

R-CNN: backbone z PyTorch

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

model vgg

Głębokie uczenie dla obrazów z PyTorch

R-CNN: backbone z PyTorch

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

cechy modelu vgg

  • .features: tylko warstwy konwolucyjne
Głębokie uczenie dla obrazów z PyTorch

R-CNN: backbone z PyTorch

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

model vgg

  • .features: tylko warstwy konwolucyjne
  • .children(): wszystkie warstwy bloku
Głębokie uczenie dla obrazów z PyTorch

R-CNN: backbone z 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()): wszystkie podwarstwy umieszczone są w bloku sekwencyjnym jako lista
    • *: rozpakowuje elementy listy

model vgg

  • .features: tylko warstwy konwolucyjne
  • .children(): wszystkie warstwy bloku
Głębokie uczenie dla obrazów z PyTorch

R-CNN: warstwa klasyfikatora

  • Ekstrakcja rozmiaru wyjścia backbone'u
input_dimension = nn.Sequential(*list(
    vgg_backbone.classifier.children())
)[0].in_features
  • Tworzenie nowego klasyfikatora
classifier = nn.Sequential(
    nn.Linear(input_dimension, 512),
    nn.ReLU(),
    nn.Linear(512, num_classes),
)
Głębokie uczenie dla obrazów z PyTorch

R-CNN: warstwa regresji ramek

  • Umieszczony na szczycie backbone'u
  • 4 wyjścia dla 4 współrzędnych ramki
box_regressor = nn.Sequential(
    nn.Linear(input_dimension, 32),
    nn.ReLU(),
    nn.Linear(32, 4),
)
Głębokie uczenie dla obrazów z PyTorch

Składanie całości: model wykrywania obiektów

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), )
Głębokie uczenie dla obrazów z PyTorch

Składanie całości: model wykrywania obiektów

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

    def forward(self, x):

features = self.backbone(x)
bboxes = self.regressor(features) classes = self.classifier(features) return bboxes, classes
Głębokie uczenie dla obrazów z PyTorch

Uruchamianie rozpoznawania obiektów

  1. Wczytanie i transformacja obrazu
  2. unsqueeze() obrazu w celu dodania wymiaru wsadowego
  3. Przekazanie tensora obrazu do modelu
  4. Zastosowanie Non-Max Suppression (nms()) na wyjściu modelu
  5. draw_bounding_boxes() na obrazie
Głębokie uczenie dla obrazów z PyTorch

Lass uns üben!

Głębokie uczenie dla obrazów z PyTorch

Preparing Video For Download...