目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
目标检测与R-CNN——pytorch与paddle实现目标检测与R-CNN
本文将深入探讨目标检测与R-CNN的理论基础,并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现R-CNN模型。我们将首先介绍目标检测与R-CNN的基本概念,这些理论基础是理解和实现目标检测与R-CNN的基础。通过PyTorch和PaddlePaddle的代码示例,我们将展示如何设计、训练和评估一个R-CNN模型,从而让读者能够直观地理解并掌握这两种框架在计算机视觉问题中的应用。
本文部分为torch框架以及部分理论分析,paddle框架对应代码可见目标检测与R-CNN-paddle
import torch
print("pytorch version:",torch.__version__)
pytorch version: 2.3.0+cu118
目标检测
目标检测(Object Detection)是计算机视觉领域的一个重要任务,其目标是在图像中定位并识别出多个目标对象。通常包括两个主要步骤:目标分类和目标定位。目标分类解决“是什么?”的问题,即识别出图像中的物体类别;目标定位解决“在哪里?”的问题,即确定物体的具体位置。
图片来源: TARGET DETECTION IN UAV USING IMAGE PROCESSING
目标检测是计算机视觉领域中的一个核心任务,旨在从图像或视频中自动识别出感兴趣的目标物体,并确定它们的位置和类别。以下是对目标检测的详细介绍:
目标检测的基本原理
目标检测的基本原理基于图像处理和机器学习技术,主要包括以下几个步骤:
-
候选区域生成:通过一些技术(如滑动窗口、区域提案方法等)生成一系列可能包含目标物体的候选区域。这些候选区域是后续处理的基础。
-
特征提取:对于每个候选区域,利用图像处理技术提取其特征表示。常用的特征提取方法包括边缘检测、颜色直方图、纹理分析等。随着深度学习的发展,卷积神经网络(CNN)等深度学习方法已成为特征提取的主流技术。
-
物体分类:将每个候选区域的特征输入到机器学习算法中进行分类,确定每个候选区域是目标物体还是背景。常用的分类算法包括支持向量机(SVM)、卷积神经网络(CNN)等。
-
边界框回归:对于被分类为目标的候选区域,通过边界框回归技术精确地确定其位置,得到最终的目标检测结果。边界框回归通常用于调整候选框的大小和位置,使其更准确地包围目标物体。
目标检测的主要方法
目标检测方法可以分为两大类:两阶段(two stage)目标检测和单阶段(one stage)目标检测。
-
两阶段目标检测:
- 这类检测算法将检测问题划分为两个阶段。第一个阶段首先产生候选区域(Region Proposals),包含目标大概的位置信息;然后第二个阶段对候选区域进行分类和位置精修。
- 典型的算法包括R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN)等。这些算法在检测精度上表现优秀,但速度相对较慢。
-
单阶段目标检测:
- 这类检测算法不需要先找出候选区域,而是直接生成物体的类别概率和位置坐标值。
- 典型的算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5)、SSD(Single Shot MultiBox Detector)等。这些算法在保持较高精度的同时,大幅提升了检测速度,适用于需要实时性的应用场景。
目标检测的性能评估指标
目标检测的性能评估通常使用以下指标:
- 精确率(Precision):正确预测为正样本的数量占所有预测为正样本数量的比例。
- 召回率(Recall):正确预测为正样本的数量占所有实际为正样本数量的比例。
- F1分数(F1 Score):精确率和召回率的调和平均值,综合考虑了模型的查准率和查全率。
- 平均精度(AP, Average Precision):对于某个类别,PR曲线下的面积,综合考量了recall和precision的影响。
- 平均精度均值(mAP, mean Average Precision):各类别AP的平均值,衡量的是在所有类别上的平均好坏程度。
- 交并比(IoU, Intersection over Union):用于衡量模型预测的边界框与真实标注之间的重叠程度,是评估目标检测和图像分割模型性能的重要指标。
边界框
在目标检测任务中,边界框(bounding box)是用来描述目标对象在图像中空间位置的一种常见方式。边界框通常是一个矩形,可以有两种主要的表示方法:
-
两角表示法:边界框由矩形左上角的坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1) 以及右下角的坐标 ( x 2 , y 2 ) (x_2, y_2) (x2,y2) 决定。
-
中心宽度表示法:边界框由中心的 x x x 轴坐标 x c x_c xc、 y y y 轴坐标 y c y_c yc、框的宽度 w w w 和高度 h h h 决定。
这两种表示方法之间可以相互转换,下面定义两个函数 box_corner_to_center
和 box_center_to_corner
来实现这两种表示法之间的转换。
从两角表示法转换为中心宽度表示法:box_corner_to_center
输入参数 boxes
可以是一个长度为 4 的张量
[
x
1
,
y
1
,
x
2
,
y
2
]
[x_1, y_1, x_2, y_2]
[x1,y1,x2,y2],也可以是一个形状为
(
N
,
4
)
(N, 4)
(N,4) 的二维张量,其中
N
N
N 是边界框的数量。
转换公式为:
x
c
=
x
1
+
x
2
2
,
y
c
=
y
1
+
y
2
2
x_c = \frac{x_1 + x_2}{2}, \quad y_c = \frac{y_1 + y_2}{2}
xc=2x1+x2,yc=2y1+y2
w
=
x
2
−
x
1
,
h
=
y
2
−
y
1
w = x_2 - x_1, \quad h = y_2 - y_1
w=x2−x1,h=y2−y1
从中心宽度表示法转换为两角表示法:box_center_to_corner
输入参数 boxes
同样可以是一个长度为 4 的张量
[
x
c
,
y
c
,
w
,
h
]
[x_c, y_c, w, h]
[xc,yc,w,h],或者是一个形状为
(
N
,
4
)
(N, 4)
(N,4) 的二维张量。
转换公式为:
x
1
=
x
c
−
w
2
,
y
1
=
y
c
−
h
2
x_1 = x_c - \frac{w}{2}, \quad y_1 = y_c - \frac{h}{2}
x1=xc−2w,y1=yc−2h
x
2
=
x
c
+
w
2
,
y
2
=
y
c
+
h
2
x_2 = x_c + \frac{w}{2}, \quad y_2 = y_c + \frac{h}{2}
x2=xc+2w,y2=yc+2h
这两个函数允许我们在不同的边界框表示方法之间进行转换,便于目标检测任务中的数据处理和模型训练。
def box_corner_to_center(boxes):
"""
Convert boxes from corner representation to center-width representation.
Args:
boxes (Tensor): Tensor of shape (N, 4) or (4,), where N is the number of boxes.
Each box is represented as [x1, y1, x2, y2].
Returns:
Tensor: Converted boxes of shape (N, 4) or (4,), where each box is represented
as [xc, yc, w, h].
"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
xc = (x1 + x2) / 2
yc = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
return torch.stack((xc, yc, w, h), dim=-1)
def box_center_to_corner(boxes):
"""
Convert boxes from center-width representation to corner representation.
Args:
boxes (Tensor): Tensor of shape (N, 4) or (4,), where N is the number of boxes.
Each box is represented as [xc, yc, w, h].
Returns:
Tensor: Converted boxes of shape (N, 4) or (4,), where each box is represented
as [x1, y1, x2, y2].
"""
xc, yc, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
x1 = xc - w / 2
y1 = yc - h / 2
x2 = xc + w / 2
y2 = yc + h / 2
return torch.stack((x1, y1, x2, y2), dim=-1)
# Example usage
boxes_corner = torch.tensor([[10, 20, 50, 60], [15, 25, 45, 55]])
boxes_center = box_corner_to_center(boxes_corner)
print("Boxes in center-width representation:", boxes_center)
boxes_corner_again = box_center_to_corner(boxes_center)
print("Boxes converted back to corner representation:", boxes_corner_again)
Boxes in center-width representation: tensor([[30., 40., 40., 40.],
[30., 40., 30., 30.]])
Boxes converted back to corner representation: tensor([[10., 20., 50., 60.],
[15., 25., 45., 55.]])
锚框
在计算机视觉领域,“锚”(anchors)是一种重要的技术手段,尤其在目标检测和物体识别任务中扮演着关键角色。锚可以理解为预定义的框或区域,这些框或区域具有不同的大小和宽高比,用于表示在图像中可能存在的目标的位置和大小范围。锚的目的是为模型提供一个参照点,通过与实际目标进行比较,筛选出包含目标的候选框,进而帮助模型更准确地定位和识别图像中的目标。
锚框(Anchor Box),也被称为先验框(Prior Box),是目标检测算法中的核心构建块。锚框是一组预定义的矩形框,用于在特征图上快速预测目标的位置和尺寸。这些框覆盖了目标可能出现的各种形状和大小,为模型提供了多尺度的感受野,使其能够适应不同大小的目标。
锚框的作用
- 提供参照点:锚框作为模型预测目标框的基准,使得模型能够输出一个较为粗糙的框,并通过与相应的锚框进行比较和调整,最终得到精确的目标边界框。
- 提高检测效率:锚框减少了模型需要预测的边界框数量,从而降低了计算复杂度。相较于在图像的每个位置都预测一个框,使用锚框可以更有效地处理目标检测任务。
- 适应多尺度目标:通过预设不同大小和宽高比的锚框,模型能够更好地适应不同大小和形状的目标,提高检测的多样性和准确性。
锚框的生成与匹配
- 生成锚框:在训练之前,根据先验知识(如目标的大小和形状分布)生成一组锚框。这些锚框通常覆盖图像中可能出现目标的多种尺寸和宽高比。
- 匹配锚框与真实目标:通过计算锚框与真实边界框的交并比(IoU),将锚框与真实目标进行匹配。如果IoU高于某个阈值(如0.5或0.75),则将该锚框标记为正样本;如果IoU低于另一个阈值,则标记为负样本。
- 训练模型:使用带有标号的锚框进行训练。正样本用于训练模型识别目标和调整边界框的位置,负样本用于训练模型辨别图像中不包含目标的区域。
假设输入图像的高度为 H H H,宽度为 W W W。
锚框的生成
-
缩放比(Scales):设缩放比的集合为 s = { s 1 , s 2 , … , s n } s = \{s_1, s_2, \ldots, s_n\} s={s1,s2,…,sn},其中 s i s_i si 表示相对于原始图像尺寸的缩放比例。
-
宽高比(Aspect Ratios):设宽高比的集合为 r = { r 1 , r 2 , … , r m } r = \{r_1, r_2, \ldots, r_m\} r={r1,r2,…,rm},其中 r i r_i ri 表示锚框的宽度与高度的比例。
-
锚框的尺寸:对于给定的中心位置 ( x , y ) (x, y) (x,y),锚框的宽度和高度可以通过以下公式计算:
width = s i ⋅ r j ⋅ W \text{width} = s_i \cdot \sqrt{r_j} \cdot W width=si⋅rj⋅W
height = s i ⋅ 1 r j ⋅ H \text{height} = s_i \cdot \frac{1}{\sqrt{r_j}} \cdot H height=si⋅rj1⋅H
其中 s i s_i si 是缩放比, r j r_j rj 是宽高比, W W W 和 H H H 分别是图像的宽度和高度。
锚框的数量
-
以单个像素为中心的锚框数量:对于图像中的每个像素,以其为中心可以生成 n × m n \times m n×m 个锚框,其中 n n n 是缩放比的数量, m m m 是宽高比的数量。
-
整个图像的锚框数量:因此,对于整个输入图像,总共将生成 n × m × W × H n \times m \times W \times H n×m×W×H 个锚框。
-
实际使用的锚框数量:在实践中,为了减少计算复杂性,通常只考虑包含有效缩放比和宽高比的组合。设这些有效组合的数量为 k k k,则整个图像上实际使用的锚框数量为 k × W × H k \times W \times H k×W×H。
参考:https://zh-v2.d2l.ai/chapter_computer-vision/anchor.html 中对于候选锚框的设计,我们有函数:
def multibox_prior(data, sizes, ratios):
"""生成以每个像素为中心具有不同形状的锚框"""
in_height, in_width = data.shape[-2:]
device = data.device
num_sizes = len(sizes)
num_ratios = len(ratios)
boxes_per_pixel = (num_sizes + num_ratios - 1)
size_tensor = torch.tensor(sizes, device=device)
ratio_tensor = torch.tensor(ratios, device=device)
# 计算偏移和步长
offset_h, offset_w = 0.5, 0.5
steps_h = 1.0 / in_height
steps_w = 1.0 / in_width
# 生成所有中心点的网格
center_h = (torch.arange(in_height, device=device) + offset_h) * steps_h
center_w = (torch.arange(in_width, device=device) + offset_w) * steps_w
shift_y, shift_x = torch.meshgrid(center_h, center_w, indexing='ij')
shift_y, shift_x = shift_y.reshape(-1), shift_x.reshape(-1)
# 生成锚框的宽和高
sqrt_ratios = torch.sqrt(ratio_tensor)
w = torch.cat((size_tensor * sqrt_ratios[0:1], sizes[0] * sqrt_ratios[1:])) * in_height / in_width
h = torch.cat((size_tensor / sqrt_ratios[0:1], sizes[0] / sqrt_ratios[1:]))
# 创建锚框的坐标
anchor_manipulations = torch.stack((-w, -h, w, h)).T.repeat(in_height * in_width, 1) / 2
# 创建包含所有锚框中心的网格
out_grid = torch.stack([shift_x, shift_y, shift_x, shift_y], dim=1).repeat_interleave(boxes_per_pixel, dim=0)
# 输出锚框坐标
output = out_grid + anchor_manipulations
return output.unsqueeze(0)
X = torch.rand(size=(1, 3, 224, 224))
Y = multibox_prior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])
Y.shape
torch.Size([1, 250880, 4])
R-CNN
论文原文:Rich feature hierarchies for accurate object detection and semantic segmentation
R-CNN(Region-based Convolutional Neural Networks),全称区域卷积神经网络,是第一个成功将深度学习应用到目标检测上的算法。该算法由Ross Girshick在2014年提出,其出现极大地推动了目标检测领域的发展。
R-CNN基于卷积神经网络(CNN)、线性回归和支持向量机(SVM)等算法,通过以下步骤实现目标检测:
- 生成候选区:利用选择性搜索(Selective Search)等方法从图像中生成一系列可能包含物体的候选区域(Region Proposal)。
- 特征提取:对每个候选区域使用预训练的卷积神经网络(如AlexNet)提取特征。
- 分类:将提取的特征输入到SVM分类器中,判断候选区域是否包含特定类别的物体,并输出每个区域的类别置信度。
- 位置精修:使用回归器对候选框的位置进行精细调整,使其更准确地包围目标物体。
- 非极大值抑制:为了消除重叠的候选区域,采用非极大值抑制(NMS)算法,保留置信度最高且重叠度低的区域作为最终检测结果。
随着技术的发展,R-CNN逐渐衍生出多个改进版本,如Fast R-CNN、Faster R-CNN和Mask R-CNN等,这些改进版本在保持高精度的同时,大幅提升了检测速度和效率。
- Fast R-CNN:通过共享卷积计算、引入RoI Pooling层和多任务损失函数等改进,显著提高了检测速度和训练效率。
- Faster R-CNN:进一步引入了区域提议网络(RPN),实现了候选区域的快速生成,并且RPN与目标检测网络共享卷积特征,进一步提升了检测速度和精度。
- Mask R-CNN:在Faster R-CNN的基础上增加了实例分割的功能,能够在检测物体的同时输出物体的精确分割掩码。
选择性搜索生成候选区域
在R-CNN(Region with CNN features)中,使用选择性搜索(Selective Search)来生成候选区域的具体过程是一个多步骤、基于图像分割和区域合并的策略。这个过程旨在快速且有效地生成可能包含目标的候选区域,从而避免传统滑动窗口方法带来的高计算复杂度和冗余候选区域问题。主要包括以下具体步骤:
1. 图像分割
- 初始分割:首先,使用一种过分割手段(如Felzenszwalb图像分割算法)将图像分割成多个小区域。这些区域的数量通常在1K到2K之间,具体数量取决于图像的复杂度和分割算法的参数。
- 生成候选区域集合:每个分割后的小区域被视为候选区域集合中的一个元素。
2. 区域合并
- 计算相似度:对于候选区域集合中的每个相邻区域对,计算它们之间的相似度。相似度通常基于颜色、纹理、大小和形状交叠等多个因素。
- 颜色相似度:通过比较区域的颜色直方图来计算。
- 纹理相似度:使用纹理特征(如梯度直方图)来衡量。
- 大小相似度:确保合并操作尺度均匀,避免大区域逐渐吞并小区域。
- 形状交叠:考虑合并后区域的形状规则性。
- 合并区域:根据相似度,将可能性最高的相邻两个区域合并成一个新的区域,并将其添加到候选区域集合中。同时,更新相似度集合,移除与已合并区域相关的相似度,并计算新区域与其他区域的相似度。
- 迭代合并:重复上述合并过程,直到整张图像合并成一个区域或达到预设的迭代次数。
3. 输出候选区域
- 候选区域列表:在迭代合并过程中,输出所有曾经存在过的区域作为候选区域。这些候选区域按照合并顺序或包含物体的可能性进行排序。
4. 候选区域调整
- 尺寸标准化:由于CNN需要固定大小的输入,因此需要对每个候选区域进行尺寸调整。常用的方法包括各向异性缩放和各向同性缩放,以确保候选区域符合CNN的输入要求。
我们可以使用GitHub中,Selective Search Implementation for Python进行图像的选择性搜索过程。
%pip install selectivesearch
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting selectivesearch
Successfully installed lazy-loader-0.4 scikit-image-0.24.0 selectivesearch-0.4 tifffile-2024.7.2
Note: you may need to restart the kernel to use updated packages.
我们结合作者的示例看一下选择性搜索的过程:
import skimage.data
import selectivesearch
img = skimage.data.astronaut()
img.shape
(512, 512, 3)
img_lbl, regions = selectivesearch.selective_search(img, scale=500, sigma=0.9, min_size=10)
regions[:10]
[{'rect': (0, 0, 15, 26), 'size': 313, 'labels': [0.0]},
{'rect': (0, 0, 61, 144), 'size': 4794, 'labels': [1.0]},
{'rect': (10, 0, 103, 227), 'size': 2071, 'labels': [2.0]},
{'rect': (46, 0, 353, 326), 'size': 43655, 'labels': [3.0]},
{'rect': (396, 0, 12, 74), 'size': 193, 'labels': [4.0]},
{'rect': (393, 0, 42, 184), 'size': 4752, 'labels': [5.0]},
{'rect': (423, 0, 22, 62), 'size': 322, 'labels': [6.0]},
{'rect': (430, 0, 81, 269), 'size': 15441, 'labels': [7.0]},
{'rect': (22, 11, 18, 20), 'size': 68, 'labels': [8.0]},
{'rect': (183, 14, 122, 219), 'size': 1147, 'labels': [9.0]}]
让我们将图片及部分候选区域绘制出来:
# 将图片与候选区域绘制出来
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(img)
for r in regions[:20]:
# 只绘制前景区域
if r['rect'] is not None:
# 绘制长方形的四条边
x1, y1, x2, y2 = r['rect']
x2 = x1 + x2
y2 = y1 + y2 # 这是因为r['rect']返回的分别是左下角坐标和长宽
ax.plot([x1, x2], [y1, y1], 'k-') # 底部
ax.plot([x2, x2], [y1, y2], 'k-') # 右侧
ax.plot([x1, x2], [y2, y2], 'k-') # 顶部
ax.plot([x1, x1], [y1, y2], 'k-') # 左侧
plt.show()
特征提取
在R-CNN中,使用卷积神经网络(CNN)来提取候选区域的特征。通常使用AlexNet、VGGNet或ResNet等模型。
import torch
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
# 定义数据预处理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Resize((224, 224)),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 我们使用AlexNet模型进行特征提取
model = torchvision.models.alexnet(pretrained=True)
# 进行候选区域提取及数据处理
img_regions = []
for r in regions:
if r['rect'] is not None:
# 提取候选区域
x1, y1, x2, y2 = r['rect']
x2 = x1 + x2
y2 = y1 + y2
if r['size'] > 500: # 过滤掉过小的候选区域
region = img[y1:y2, x1:x2]
region = transform(region)
img_regions.append(region)
# 将候选区域转换为张量
img_regions = torch.stack(img_regions) # (N, 3, 224, 224)
img_regions.shape
torch.Size([303, 3, 224, 224])
# 我们去掉AlexNet最后的softmax输出层,获得最后全连接层的输出,作为每一个候选区域的特征向量
model = torch.nn.Sequential(*list(model.children())[:-1]) # 去掉最后一层
# 添加一层展平层
model.add_module('flatten', torch.nn.Flatten())
features = model(img_regions)
features.shape
torch.Size([303, 9216])
类别预测
这样,我们便获得了每一个候选区域的特征向量。接下来,我们需要将这些特征向量输入一个分类器,以判断每个候选区域是否包含目标物体。我们可以使用SVM(支持向量机)作为分类器,或者使用更复杂的模型如全连接神经网络(FCN)。
# 使用 SVM 作为分类器
from sklearn import svm
import numpy as np
classifier = svm.SVC() # 使用默认参数的 SVM
# 假设类别数量n=10,我们先不训练SVM,让我们观察SVM输出
classifier.fit(features.detach().numpy(), np.random.randint(0, 10, features.shape[0])) # 随机生成类别标签
out = classifier.predict(features.detach().numpy())
out.shape
(303,)
这样我们最终得到了每个候选区域的类别标签。如果过程中所有模型都训练好的话,我们就可以根据这些类别标签和置信度分数,选择出包含目标物体的候选区域,并绘制出它们在图像上的位置。
Faster R-CNN
Faster R-CNN 是 R-CNN 的一个改进版本,它通过引入区域提议网络(RPN)来加速候选区域的提取过程。RPN 是一个全卷积网络,可以在整张图像上并行地生成候选区域,从而大大提高了候选区域的提取速度。
Faster R-CNN可参阅网站文章:Understanding and Implementing Faster R-CNN: A Step-By-Step Guide及原论文,对Faster R-CNN 进行介绍和实现。
原论文地址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
代码地址:https://github.com/wingedrasengan927/pytorch-tutorials/tree/master/Object%20Detection
网页文章地址:https://towardsdatascience.com/understanding-and-implementing-faster-r-cnn-a-step-by-step-guide-11acfff216b0
Faster R-CNN是一种多任务学习的网络,能够在单个神经网络中同时学习目标检测和特征提取。其核心思想是将目标检测任务分为两个阶段:首先,使用RPN生成一系列候选区域(Region Proposals),这些区域可能包含目标物体;然后,对这些候选区域进行精细的分类和边界框回归,以确定目标物体的确切位置和类别。
Faster R-CNN的网络架构主要由以下几个部分组成:
-
特征提取器:通常是一个预训练的卷积神经网络(CNN),如VGG、ResNet等,用于从输入图像中提取特征。这些特征图将作为后续RPN和Fast R-CNN网络的输入。
-
区域提议网络(RPN):RPN是Faster R-CNN的核心组件,用于生成高质量的候选框。它通过在特征图上滑动一个小窗口,为每个位置预测多个不同尺度和长宽比的候选框,并计算每个候选框的物体得分。这些候选框和得分将作为Fast R-CNN网络的输入,用于进一步的分类和回归。
-
分类器和回归器:Fast R-CNN网络负责对RPN生成的候选框进行进一步的分类和回归。分类任务用于判断候选框内是否包含物体以及物体的类别,回归任务则用于调整候选框的位置以更精确地定位物体。
Faster R-CNN的工作流程大致可以分为以下几个步骤:
-
特征提取:将输入图像送入特征提取器,得到特征图。
-
候选区域生成:利用RPN在特征图上生成一系列候选框,并计算每个候选框的物体得分。
-
候选区域筛选与特征提取:根据候选框的得分筛选出高质量的候选区域,并从特征图中提取这些区域的特征。
-
分类与回归:将提取到的特征送入分类器和回归器,进行分类和边界框回归,得到最终的目标检测结果。
Faster R-CNN
Faster R-CNN 是 R-CNN 的一个改进版本,它通过引入区域提议网络(RPN)来加速候选区域的提取过程。RPN 是一个全卷积网络,可以在整张图像上并行地生成候选区域,从而大大提高了候选区域的提取速度。
Faster R-CNN可参阅网站文章:Understanding and Implementing Faster R-CNN: A Step-By-Step Guide及原论文,对Faster R-CNN 进行介绍和实现。
原论文地址:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
代码地址:https://github.com/wingedrasengan927/pytorch-tutorials/tree/master/Object%20Detection
网页文章地址:https://towardsdatascience.com/understanding-and-implementing-faster-r-cnn-a-step-by-step-guide-11acfff216b0
Faster R-CNN是一种多任务学习的网络,能够在单个神经网络中同时学习目标检测和特征提取。其核心思想是将目标检测任务分为两个阶段:首先,使用RPN生成一系列候选区域(Region Proposals),这些区域可能包含目标物体;然后,对这些候选区域进行精细的分类和边界框回归,以确定目标物体的确切位置和类别。
Faster R-CNN的网络架构主要由以下几个部分组成:
-
特征提取器:通常是一个预训练的卷积神经网络(CNN),如VGG、ResNet等,用于从输入图像中提取特征。这些特征图将作为后续RPN和Fast R-CNN网络的输入。
-
区域提议网络(RPN):RPN是Faster R-CNN的核心组件,用于生成高质量的候选框。它通过在特征图上滑动一个小窗口,为每个位置预测多个不同尺度和长宽比的候选框,并计算每个候选框的物体得分。这些候选框和得分将作为Fast R-CNN网络的输入,用于进一步的分类和回归。
-
分类器和回归器:Fast R-CNN网络负责对RPN生成的候选框进行进一步的分类和回归。分类任务用于判断候选框内是否包含物体以及物体的类别,回归任务则用于调整候选框的位置以更精确地定位物体。
Faster R-CNN的工作流程大致可以分为以下几个步骤:
-
特征提取:将输入图像送入特征提取器,得到特征图。
-
候选区域生成:利用RPN在特征图上生成一系列候选框,并计算每个候选框的物体得分。
-
候选区域筛选与特征提取:根据候选框的得分筛选出高质量的候选区域,并从特征图中提取这些区域的特征。
-
分类与回归:将提取到的特征送入分类器和回归器,进行分类和边界框回归,得到最终的目标检测结果。