【目标检测】目标检测中全连接层(Fully Connected Layer)
在目标检测任务中,全连接层(Fully Connected Layers,简称FC层)通常用于最后的输出阶段,尤其是处理每个候选框(或者说是检测框)相关的信息,如类别class、边界框的位置(坐标),以及可能的其他附加信息。
通常,在目标检测任务中,特征图(由卷积神经网络提取的特征)经过一系列的卷积、池化、特征提取后,会被展平(flatten)成一个一维的向量,然后传递到全连接层。
全连接层的作用是将这些特征映射到最终的输出,例如预测目标框的坐标和类别。
全连接层在目标检测中的关键作用是将卷积层提取的高维特征映射到目标检测所需的输出空间,例如:
-
边界框回归(Bounding box regression):用于预测目标边界框的位置。
-
分类(Classification):用于预测每个框内物体的类别。
实现流程
1. 特征提取(通常是卷积层)
首先,我们通过卷积神经网络(CNN)提取图像的特征。假设经过卷积、池化等操作后,得到一个形状为 [B,C,H,W]
的特征图(其中 𝐵是批大小,𝐶是通道数,𝐻和 𝑊是特征图的高和宽)。
2. 展平(Flatten)
在将特征图传递到全连接层之前,我们需要将其展平为一维向量。这个过程通常称为"flatten",是将所有空间维度(高度和宽度)以及通道数压缩为一个长向量。
假设特征图的形状是[B,C,H,W]
,展平后的形状将是 [B,C×H×W]
。
3. 全连接层(FC层)
展平后的特征被输入到全连接层。每个全连接层将对输入进行线性变换,并应用激活函数,最终输出目标检测任务所需要的结果。输出通常包括:
- 每个候选框的类别预测(例如分类为背景、猫、狗等)。
- 每个候选框的位置预测(通常是边界框的坐标:左上角和右下角的 𝑥,𝑦坐标,或者中心点的坐标和宽高)。
全连接层的输出形状将依据任务的需要进行设置。例如,若是进行目标分类,输出可能为类别数量的向量(num=class的个数);若是进行边界框回归,输出将包含框的位置参数(num=4)。
代码实例
通过一个简单的目标检测中全连接网络的实现来讲解。
import torch
import torch.nn as nn
class SimpleObjectDetectionModel(nn.Module):
def __init__(self, num_classes=80): # 例如,80类物体(如COCO数据集)
super(SimpleObjectDetectionModel, self).__init__()
# 卷积层(用于提取特征)
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
# 全连接层,用于分类和边界框回归
# 假设我们输入图像尺寸为256x256,经过两次池化后尺寸变为64x64
# 输出的全连接层将输出边界框回归和类别预测(分类任务+回归任务)
self.fc_class = nn.Linear(128 * 64 * 64, num_classes) # 类别预测
self.fc_bbox = nn.Linear(128 * 64 * 64, 4) # 边界框回归(4个坐标:x1, y1, x2, y2)
def forward(self, x):
# 卷积和池化
x = self.pool(torch.relu(self.conv1(x)))
# 输出为[4,128,64,64]
x = self.pool(torch.relu(self.conv2(x)))
# 展平
x = x.view(x.size(0), -1) # [batch_size, 128*64*64]
# 分类预测
class_pred = self.fc_class(x) # 类别预测
# 边界框回归预测
bbox_pred = self.fc_bbox(x) # 边界框回归(4个坐标)
return class_pred, bbox_pred
# 假设我们有一个批大小为4,输入尺寸为256x256的图像
input_data = torch.randn(4, 3, 256, 256) # 批量4个RGB图像,尺寸256x256
# 创建模型,假设有80个类别
model = SimpleObjectDetectionModel(num_classes=80)
# 传递输入数据
class_pred, bbox_pred = model(input_data)
# 输出结果的形状
print("分类预测的形状:", class_pred.shape) # 这里输出的是 [batch_size, num_classes]
print("边界框回归的形状:", bbox_pred.shape) # 这里输出的是 [batch_size, 4] (4个边界框坐标)
-
卷积层
conv1 和 conv2 是用于提取图像特征的卷积层。我们使用池化层(pool)来降低特征图的空间分辨率(即降低图像的高度和宽度),同时保留重要特征。 -
展平
x.view(x.size(0), -1) 是将卷积层输出的四维张量([batch_size, channels, height, width])展平为一维向量([batch_size, flattened_size]),以便输入到全连接层中。 -
全连接层
fc_class: 用于分类的全连接层,将卷积层提取的特征映射到类别空间(即每个目标框的类别预测)。
fc_bbox:用于回归的全连接层,将卷积层提取的特征映射到边界框坐标空间(即目标框的位置预测,通常是4个值:左上角和右下角的坐标)。 -
输出
最终,我们得到两个输出:
class_pred:每个候选框的类别预测。
bbox_pred:每个候选框的边界框坐标回归预测。