醋醋百科网

Good Luck To You!

卷积神经网络(CNN)数据流转详细流程,结合YOLO的实进行说明


1. 输入预处理(Input Preprocessing)

作用:将原始数据转换为适合CNN处理的格式。

  • 图像尺寸统一化:如YOLOv5默认输入尺寸为640x640,所有输入图像会被缩放到这个尺寸。
  • 归一化:像素值从[0,255]缩放到[0,1]或[-1,1]。
  • 通道处理:BGR转RGB(OpenCV读取的图像需要转换)。
  • 批处理:多个样本打包成batch(如batch_size=16)。

Python复制

# YOLO中的典型预处理代码
img = cv2.resize(img, (640, 640))  # Resize
img = img / 255.0  # 归一化
img = np.transpose(img, (2,0,1))  # HWC → CHW

2. 卷积层(Convolutional Layer)

核心操作:局部感受野的特征提取。

  • 输入张量:形状为 [B, C, H, W](Batch, Channels, Height, Width)。
  • 卷积核:可学习的权重矩阵,形状为 [K, C, Fh, Fw]。
  • K:输出通道数(即filter数量)。
  • Fh/Fw:滤波器高度/宽度(如3x3)。
  • 计算过程:Output_{i,j,k} = ∑_{c=0}^{C-1} ∑_{m=0}^{Fh-1} ∑_{n=0}^{Fw-1} Input_{c, i+m, j+n} * Filter_{k,c,m,n} + Bias_k
  • 输出维度
  • 复制
  • H_out = (H_in + 2*pad - Fh) / stride + 1 W_out同理

YOLO应用:Darknet骨干网络中使用大量3x3卷积,配合1x1卷积调整通道数。


3. 激活函数(Activation Function)

作用:引入非线性。

  • 常见选择
  • ReLU:f(x) = max(0, x)(YOLO主要使用)。
  • LeakyReLU(解决“神经元死亡”问题)。
  • SiLU(YOLOv5/v6使用)。

数据变化:不改变张量维度,只进行逐元素运算。


4. 池化层(Pooling Layer)

作用:降维并保留主要特征。

  • 最大池化:取窗口内最大值(YOLO常用)。
  • 平均池化:取窗口内平均值。
  • 步长影响:一般stride=2,输出尺寸减半。

示例

输入尺寸:64x64 → 2x2池化 → 输出32x32


5. 特征图堆叠(Feature Hierarchy)

典型结构

Input → Conv1 → ReLU → Pool1 → Conv2 → ReLU → Pool2 → ... → Flatten

YOLO特色

  • 使用跨阶段部分连接(CSPNet)减少计算量。
  • SPP层(Spatial Pyramid Pooling)融合多尺度特征。

6. 全连接层(Fully Connected Layer)

作用:将高维特征映射到目标空间。

  • 输入:展平后的特征向量(如7x7x512 → 25088维)。
  • 输出:根据任务设计(分类任务输出类别概率,检测任务输出坐标+类别)。

YOLO变体

  • 使用1x1卷积代替全连接层(保留空间信息)。
  • 检测头输出形状:[B, anchors*(5+classes), H, W]。

7. 输出处理(Output Processing)

分类任务

  • Softmax归一化得到概率分布。

目标检测任务(YOLO)

  • 边界框解码:
  • 复制
  • # 将网络输出的偏移量转换为实际坐标 pred_x = (sigmoid(tx) * 2 - 0.5) + grid_x pred_y = (sigmoid(ty) * 2 - 0.5) + grid_y pred_w = (sigmoid(tw) * 2)^2 * anchor_w pred_h = (sigmoid(th) * 2)^2 * anchor_h
  • 非极大值抑制(NMS)去除冗余框。

8. 反向传播(Backpropagation)

虽然主要关注前向流程,但理解反向传播有助于把握数据流转:

  1. 计算损失函数(YOLO使用CIoU Loss)。
  2. 通过链式法则逐层计算梯度。
  3. 优化器(如SGD/Adam)更新权重。

YOLO数据流示例(简化版)

输入图像 → 数据增强 → Backbone(CSPDarknet) → Neck(PANet) → Head(检测输出) → 后处理(NMS)


关键参数计算技巧

  1. 感受野计算:当前层感受野 = 上一层感受野 + (kernel_size - 1) * 所有前面层的stride乘积
  2. FLOPs估算:FLOPs = H_out * W_out * C_in * C_out * K_h * K_w

通过这个流程,可以更清晰地理解CNN/YOLO内部的数据流转机制。实际应用中可以使用TensorBoard或Netron可视化网络结构辅助理解。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言