使用 R-CNN 进行目标检测

使用 PyTorch 进行图像深度学习

Michal Oleszak

Machine Learning Engineer

基于区域的 CNN 系列:R-CNN

R-CNN 系列:R-CNN、Fast R-CNN、Faster R-CNN

R-CNN

  • 模块 1:候选区域生成
1 引用:Jason Brownlee. 2019. Deep Learning for Computer Vision.
使用 PyTorch 进行图像深度学习

基于区域的 CNN 系列:R-CNN

R-CNN 系列:R-CNN、Fast R-CNN、Faster R-CNN

R-CNN

  • 模块 1:候选区域生成
  • 模块 2:特征提取(卷积层)
1 引用:Jason Brownlee. 2019. Deep Learning for Computer Vision.
使用 PyTorch 进行图像深度学习

基于区域的 CNN 系列:R-CNN

R-CNN 系列:R-CNN、Fast R-CNN、Faster R-CNN

R-CNN

  • 模块 1:候选区域生成
  • 模块 2:特征提取(卷积层)
  • 模块 3:类别与边框预测
1 引用:Jason Brownlee. 2019. Deep Learning for Computer Vision.
使用 PyTorch 进行图像深度学习

R-CNN:骨干网络

  • 卷积层:预训练模型
    • 骨干网络(Backbone):负责特征提取的核心 CNN 架构

  骨干网络

  • 卷积与池化层
  • 为候选区域与目标检测提取特征
使用 PyTorch 进行图像深度学习

R-CNN:使用 PyTorch 的骨干网络

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

vgg 模型

使用 PyTorch 进行图像深度学习

R-CNN:使用 PyTorch 的骨干网络

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


vgg = vgg16(weights=VGG16_Weights.DEFAULT)

vgg 模型特征

  • .features:仅包含卷积层
使用 PyTorch 进行图像深度学习

R-CNN:使用 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:使用 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:分类器层

  • 提取骨干网络的输出尺寸
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:边框回归层

  • 置于骨干网络之上
  • 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 进行图像深度学习

Passons à la pratique !

使用 PyTorch 进行图像深度学习

Preparing Video For Download...