一、经典卷积神经网络结构
1. LeNet-5网络
LeNet-5是Yann LeCun于1998年提出的第一个成功应用于手写数字识别的卷积神经网络,其结构特点包括:
网络结构:
输入层(32×32) → C1卷积层(6@28×28) → S2池化层(6@14×14) → C3卷积层(16@10×10) → S4池化层(16@5×5) → C5全连接层(120) → F6全连接层(84) → 输出层(10)
创新点:
-
首次将卷积、池化和全连接层结合;
-
使用平均池化而非最大池化;
-
采用Sigmoid/tanh而非ReLU激活函数。
局限性:
-
网络较浅(约6万参数),无法处理复杂视觉任务。
2. AlexNet网络
AlexNet在2012年ImageNet竞赛中取得突破,主要特点包括:
-
网络结构: 5个卷积层 + 3个全连接层,约6000万参数。
-
关键改进:
-
使用ReLU激活函数解决梯度消失问题;
-
引入Dropout防止过拟合;
-
采用最大池化代替平均池化;
-
使用双GPU并行训练策略;
-
数据增强:随机裁剪、水平翻转、光照变化等。
-
3. VGG-16网络
VGG-16通过使用小卷积核(3×3)和增加网络深度获得更好性能:
-
网络结构: 13个卷积层 + 3个全连接层,约1.38亿参数。
-
特点:
-
所有卷积层使用相同超参数,结构规整;
-
随网络深入,特征图尺寸减小而通道数增加;
-
证明了深度对网络性能的重要性。
-
4. 残差网络(ResNet)
ResNet通过残差连接解决了深层网络训练难题:
-
核心思想: 引入跳跃连接(shortcut connection),使网络能够学习残差 F(x)=H(x)−xF(x) = H(x) - xF(x)=H(x)−x。
-
优势:
-
有效缓解梯度消失问题;
-
可训练极深层网络(如ResNet-152);
-
训练误差随深度增加而降低。
-
二、深度学习视觉应用
1. 常用数据集
-
MNIST: 手写数字识别,包含60000个训练样本和10000个测试样本,28×28灰度图。
-
CIFAR-10: 10类物体识别,包含60000个32×32彩色图像,分为50000个训练图像和10000个测试图像。
-
PASCAL VOC: 20类物体检测与分割,含边界框和像素级标注。
-
MS COCO: 包含80类物体,33万图像,150万个实例,支持检测、分割等任务。
-
ImageNet: 1400万图像,2万类别,ILSVRC竞赛基准数据集。
2. 评价指标
-
精确率(Precision): Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP
-
召回率(Recall): Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP
-
P-R曲线: 展示不同阈值下Precision与Recall的变化关系。
-
AP(Average Precision): P-R曲线下面积,衡量单类别检测性能。
-
mAP(mean AP): 多类别AP的平均值,综合评估指标。
3. 目标检测与YOLO算法
YOLO基本思想
YOLO(You Only Look Once)算法将目标检测任务转化为回归问题,通过一次前向传播完成目标的位置预测和类别分类。
网络结构:
输入448×448图像,划分为7×7网格。每个网格预测2个边界框以及20类目标的概率,最终输出7×7×30的张量。
损失函数:
包含位置误差、置信度误差和分类误差三部分。
非极大值抑制(NMS):
去除冗余检测框,保留最佳预测。
YOLO v3改进
-
骨干网络: DarkNet-53,结合残差连接,提升性能。
-
多尺度预测: 在13×13、26×26、52×52三个尺度上进行预测。
-
Anchor Boxes: 使用K-means聚类得到的9个先验框,改进检测精度。
-
损失函数: 引入CIoU损失,考虑位置、长宽比和中心点距离。
4. 语义分割与全卷积网络(FCN)
FCN通过将传统CNN的全连接层替换为卷积层,实现了像素级别的图像分割。常用的结构包括编码器-解码器架构,结合下采样和上采样。
-
DeepLab系列: 利用空洞卷积(Dilated Convolution)和条件随机场(CRF)后处理,提升了分割精度。
三、代码示例
import torch
from torch import nn
class YOLOv1(nn.Module):
def __init__(self, S=7, B=2, C=20):
super(YOLOv1, self).__init__()
# 卷积层部分
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
nn.LeakyReLU(0.1),
nn.MaxPool2d(2, 2),
nn.Conv2d(64, 192, kernel_size=3, padding=1),
nn.LeakyReLU(0.1),
nn.MaxPool2d(2, 2),
nn.Conv2d(192, 128, kernel_size=1),
nn.LeakyReLU(0.1),
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.LeakyReLU(0.1),
nn.MaxPool2d(2, 2),
nn.Conv2d(256, 512, kernel_size=3, padding=1),
nn.LeakyReLU(0.1),
nn.Conv2d(512, 1024, kernel_size=3, padding=1),
nn.LeakyReLU(0.1),
nn.MaxPool2d(2, 2)
)
# 全连接层部分
self.fc_layers = nn.Sequential(
nn.Flatten(),
nn.Linear(1024 * S * S, 4096),
nn.LeakyReLU(0.1),
nn.Linear(4096, S * S * (B * 5 + C)) # S * S * (B * 5 + C) 是网络的输出尺寸
)
def forward(self, x):
# 通过卷积层
x = self.conv_layers(x)
# 通过全连接层
x = self.fc_layers(x)
# 输出为7x7的网格,每个网格预测2个边界框和20类物体
return x.reshape(-1, 7, 7, 30) # 7x7的网格,每个网格有2个边界框,每个框有5个参数 + 20个类别
# 创建YOLO模型实例
model = YOLOv1(S=7, B=2, C=20)
print(model)
四、总结
通过对卷积神经网络(CNN)及目标检测算法YOLO的学习,我对神经网络的演变及其在视觉任务中的应用有了更加深刻的理解。YOLO的“一步法”检测与传统的两步法相比,在检测速度和效率上具有显著优势,尤其适用于实时目标检测任务。通过实践中的代码实现,进一步加深了对理论内容的理解。