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)
虽然主要关注前向流程,但理解反向传播有助于把握数据流转:
- 计算损失函数(YOLO使用CIoU Loss)。
- 通过链式法则逐层计算梯度。
- 优化器(如SGD/Adam)更新权重。
YOLO数据流示例(简化版)
输入图像 → 数据增强 → Backbone(CSPDarknet) → Neck(PANet) → Head(检测输出) → 后处理(NMS)
关键参数计算技巧
- 感受野计算:当前层感受野 = 上一层感受野 + (kernel_size - 1) * 所有前面层的stride乘积
- FLOPs估算:FLOPs = H_out * W_out * C_in * C_out * K_h * K_w
通过这个流程,可以更清晰地理解CNN/YOLO内部的数据流转机制。实际应用中可以使用TensorBoard或Netron可视化网络结构辅助理解。