Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 214|回复: 7

yolo2系列一:总体介绍

[复制链接]

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2025-4-29 19:54:31 | 显示全部楼层 |阅读模式
什么是YOLO
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-11 12:27:39 | 显示全部楼层
YOLOv2的输入输出是什么?
1.输入:
图像尺寸:默认输入为 416×416 像素 的 RGB 图像(支持多尺度训练,如 320×320、608×608 等)。
预处理:图像需归一化(像素值缩放到 [0, 1] 或标准化为均值为 0、方差为 1)。
特点:输入尺寸为 32 的倍数(如 416 = 13×32),以确保下采样后特征图的尺寸为整数。

2.输出:
(S, S, B×(5 + C))的网格
S×S 的网格(默认 S=13,即 13×13 的网格)
B 个边界框,默认5
5是位置+置信度
C为类别的概率

3.后处理
  • 解码预测框:将偏移量 (t_x, t_y, t_w, t_h) 转换为实际坐标 (x, y, w, h)。
  • 非极大抑制(NMS):过滤重叠的预测框,保留置信度最高的检测结果。
  • 阈值过滤:根据置信度(如 conf_thresh=0.5)和类别概率筛选最终检测结果。


  1. import torch
  2. model = torch.hub.load('ultralytics/yolov5', 'yolov2')  # 示例调用(YOLOv2类似)
  3. output = model(torch.rand(1, 3, 416, 416))  # 输入: [batch, channels, height, width]
  4. print(output.shape)  # 输出维度: [1, 13, 13, 425]
复制代码



回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-12 08:45:22 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-28 17:47:28 | 显示全部楼层
OLOv2(基于PyTorch实现)的架构主要分为三部分:Backbone(特征提取网络)、Detection Head(检测头)和损失函数。以下是详细解析和PyTorch代码实现:

1. 网络架构概览
YOLOv2的核心改进包括:

Backbone:使用 Darknet-19(19层卷积网络)替代YOLOv1的GoogLeNet。

Anchor Boxes:引入锚框机制(通过聚类预定义框尺寸)。

Passthrough Layer:融合浅层特征提升小目标检测。

Multi-Scale Training:支持动态输入尺寸(如 320×320 到 608×608)。
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-28 17:58:33 | 显示全部楼层
正向传输是如何实现的?
用一个简单的单层网络实例
  1. import torch
  2. import torch.nn as nn

  3. class SingleConvNet(nn.Module):
  4.     def __init__(self):
  5.         super(SingleConvNet, self).__init__()
  6.         self.conv = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False)
  7.    
  8.     def forward(self, x):
  9.         return self.conv(x)

  10. # 实例化模型和输入
  11. model = SingleConvNet()
  12. input_tensor = torch.randn(1, 3, 4, 4)  # 形状: [batch=1, channels=3, height=4, width=4]

  13. # 前向传播
  14. output_tensor = model(input_tensor)

  15. print("输入形状:", input_tensor.shape)
  16. print("输出形状:", output_tensor.shape)
  17. print("卷积核权重形状:", model.conv.weight.shape)
复制代码
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-28 18:22:39 | 显示全部楼层
如何看到卷积核的具体值?
  1. import torch
  2. import torch.nn as nn

  3. # 定义一个单卷积层网络
  4. class SimpleCNN(nn.Module):
  5.     def __init__(self):
  6.         super(SimpleCNN, self).__init__()
  7.         self.conv = nn.Conv2d(
  8.             in_channels=3,
  9.             out_channels=32,
  10.             kernel_size=3,
  11.             stride=1,
  12.             padding=1,
  13.             bias=False
  14.         )
  15.    
  16.     def forward(self, x):
  17.         return self.conv(x)

  18. # 实例化模型
  19. model = SimpleCNN()

  20. # 查看第一个卷积核的数值(第一个输出通道对应的核)
  21. first_kernel = model.conv.weight[0]  # 形状: [3, 3, 3] (in_channels, kernel_size, kernel_size)
  22. print("第一个卷积核的数值:\n", first_kernel)
复制代码
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-29 16:53:54 | 显示全部楼层
需要注意的是,上述的值是随机的,每次卷积核的值都是不同的,也可以自己指定
  1. import torch
  2. import torch.nn as nn

  3. class SimpleCNN(nn.Module):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.conv = nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1, bias=False)
  7.         
  8.         # 手动初始化第一个卷积核(示例值)
  9.         custom_kernel = torch.tensor([
  10.             [[0.1, 0.2, 0.1],
  11.              [0.2, 0.3, 0.2],
  12.              [0.1, 0.2, 0.1]],  # 第一个输入通道的卷积核
  13.             [[0.0, -0.1, 0.0],
  14.              [-0.1, 0.4, -0.1],
  15.              [0.0, -0.1, 0.0]],  # 第二个输入通道的卷积核
  16.             [[-0.1, 0.0, -0.1],
  17.              [0.0, 0.2, 0.0],
  18.              [-0.1, 0.0, -0.1]]  # 第三个输入通道的卷积核
  19.         ], dtype=torch.float32)
  20.         
  21.         # 将第一个输出通道的卷积核赋值为自定义值
  22.         self.conv.weight.data[0] = custom_kernel

  23. model = SimpleCNN()
  24. print("自定义卷积核:\n", model.conv.weight[0])
复制代码
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2025-5-29 17:06:39 | 显示全部楼层
卷积之后一般跟着BN运算:
批归一化(Batch Normalization,简称 BN)是深度学习中用于加速训练、提升模型稳定性的重要技术,由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。它的核心思想是通过规范化每一层的输入分布(均值为 0,方差为 1),减少内部协变量偏移(Internal Covariate Shift),从而解决深度神经网络训练过程中的梯度消失/爆炸问题。
  1. import torch
  2. import torch.nn as nn

  3. # 定义 BN 层
  4. bn = nn.BatchNorm2d(num_features=3)  # 输入通道数 C=3

  5. # 模拟输入数据 [N, C, H, W]
  6. input = torch.randn(2, 3, 5, 5)     # Batch Size=2, 通道=3, 尺寸 5x5
  7. output = bn(input)

  8. # 查看 BN 的运行均值和方差(推理时使用)
  9. print("全局均值:", bn.running_mean)   # 形状 [C]
  10. print("全局方差:", bn.running_var)    # 形状 [C]
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 07:59 , Processed in 0.039685 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表