当前位置: 首页 > article >正文

【目标检测】目标检测中全连接层(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个边界框坐标)
  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:每个候选框的边界框坐标回归预测。


http://www.kler.cn/a/385703.html

相关文章:

  • Sam Altman:年底将有重磅更新,但不是GPT-5!
  • Rust 中的 match 基本用法
  • Android中Activity启动的模式
  • 自定义包和第三方包
  • 权限管理练习2
  • 第26天 安全开发-PHP应用模板引用Smarty渲染MVC模型数据联动RCE安全
  • 听说你想要快速搭建 Web 应用?轻量应用服务器绝对适合你
  • 【Python有哪些优点和缺点】
  • 【工具类】JAVA开发从SFTP服务器下载文件
  • Python函数和对象
  • 【Rust.Crate之tracing 诊断系统】
  • 星空天文 2.0.1| 完全免费的观星软件,无注册登录,天文爱好者必备。
  • 如何让3dsMax渲染效果更逼真好看?
  • HarmonyOS 移
  • Unity网络通信(part7.分包和黏包)
  • 3.2cpu
  • 初级数据结构——顺序表
  • Pr 视频过渡:沉浸式视频 - VR 球形模糊
  • 音视频入门基础:FLV专题(23)——FFmpeg源码中,获取FLV文件音频信息的实现(下)
  • MySQL 和 PostgreSQL 常见区别和联系
  • 信息收集(CISP-PTE笔记)
  • qt5将程序打包并使用
  • 区间数位和
  • 抗辐照MCU芯片工艺解析:如何保障芯片的可靠性
  • 用户登录密码存储加密策略(附Python 和 bcrypt 库进行安全密码验证)
  • 【NLP】使用 SpaCy 通过 LLM 合成数据微调 NER 模型