【目标检测】目标检测中全连接层(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)。

代码实例

通过一个简单的目标检测中全连接网络的实现来讲解。

python 复制代码
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个边界框坐标)
  1. 卷积层

    conv1 和 conv2 是用于提取图像特征的卷积层。我们使用池化层(pool)来降低特征图的空间分辨率(即降低图像的高度和宽度),同时保留重要特征。

  2. 展平

    x.view(x.size(0), -1) 是将卷积层输出的四维张量(batch_size, channels, height, width)展平为一维向量(batch_size, flattened_size),以便输入到全连接层中。

  3. 全连接层
    fc_class: 用于分类的全连接层,将卷积层提取的特征映射到类别空间(即每个目标框的类别预测)。
    fc_bbox:用于回归的全连接层,将卷积层提取的特征映射到边界框坐标空间(即目标框的位置预测,通常是4个值:左上角和右下角的坐标)。

  4. 输出

    最终,我们得到两个输出:
    class_pred :每个候选框的类别预测。
    bbox_pred:每个候选框的边界框坐标回归预测。

相关推荐
AI日报派送佬4 小时前
2026年10月14日AI行业日报|Gemini 4 Argon正式发布;小模型跨设备传播风险引发安全热议
网络·人工智能·openai·谷歌·deepseek·anthropic·ai日报
VidDown5 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
镜象科技5 小时前
职业院校AI心理健康解决方案怎么选?三个特殊场景与三类路线
人工智能
Leo.yuan5 小时前
企业Data Agent架构选型:帆软Dora基于NL2BI的现有BI体系复用方案
大数据·人工智能
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
米小虾6 小时前
上下文:Agent 的眼睛里到底装着什么
人工智能·agent
米小虾6 小时前
Agent = 大脑 + 眼睛 + 手脚:一篇看懂现代 AI Agent 的骨架
人工智能
小小测试开发6 小时前
安全评测得分 0.9556 掉到 0.3257,只改了 top_k 和 prompt_style 之外的题面比例
人工智能·安全·prompt
slacker-kian7 小时前
[实践]-用LLM对文本结构化:把多段文本描述变成规范的 JSON 知识库
人工智能·llm·prompt·结构化·pydantic·one-shot 提示