《------往期经典推荐------》
一、AI应用软件开发实战专栏【链接】
项目名称 | 项目名称 |
---|---|
1.【人脸识别与管理系统开发】 | 2.【车牌识别与自动收费管理系统开发】 |
3.【手势识别系统开发】 | 4.【人脸面部活体检测系统开发】 |
5.【图片风格快速迁移软件开发】 | 6.【人脸表表情识别系统】 |
7.【YOLOv8多目标识别与自动标注软件开发】 | 8.【基于深度学习的行人跌倒检测系统】 |
9.【基于深度学习的PCB板缺陷检测系统】 | 10.【基于深度学习的生活垃圾分类目标检测系统】 |
11.【基于深度学习的安全帽目标检测系统】 | 12.【基于深度学习的120种犬类检测与识别系统】 |
13.【基于深度学习的路面坑洞检测系统】 | 14.【基于深度学习的火焰烟雾检测系统】 |
15.【基于深度学习的钢材表面缺陷检测系统】 | 16.【基于深度学习的舰船目标分类检测系统】 |
17.【基于深度学习的西红柿成熟度检测系统】 | 18.【基于深度学习的血细胞检测与计数系统】 |
19.【基于深度学习的吸烟/抽烟行为检测系统】 | 20.【基于深度学习的水稻害虫检测与识别系统】 |
21.【基于深度学习的高精度车辆行人检测与计数系统】 | 22.【基于深度学习的路面标志线检测与识别系统】 |
23.【基于深度学习的智能小麦害虫检测识别系统】 | 24.【基于深度学习的智能玉米害虫检测识别系统】 |
25.【基于深度学习的200种鸟类智能检测与识别系统】 | 26.【基于深度学习的45种交通标志智能检测与识别系统】 |
27.【基于深度学习的人脸面部表情识别系统】 | 28.【基于深度学习的苹果叶片病害智能诊断系统】 |
29.【基于深度学习的智能肺炎诊断系统】 | 30.【基于深度学习的葡萄簇目标检测系统】 |
31.【基于深度学习的100种中草药智能识别系统】 | 32.【基于深度学习的102种花卉智能识别系统】 |
33.【基于深度学习的100种蝴蝶智能识别系统】 | 34.【基于深度学习的水稻叶片病害智能诊断系统】 |
35.【基于与ByteTrack的车辆行人多目标检测与追踪系统】 | 36.【基于深度学习的智能草莓病害检测与分割系统】 |
37.【基于深度学习的复杂场景下船舶目标检测系统】 | 38.【基于深度学习的农作物幼苗与杂草检测系统】 |
39.【基于深度学习的智能道路裂缝检测与分析系统】 | 40.【基于深度学习的葡萄病害智能诊断与防治系统】 |
41.【基于深度学习的遥感地理空间物体检测系统】 | 42.【基于深度学习的无人机视角地面物体检测系统】 |
43.【基于深度学习的木薯病害智能诊断与防治系统】 | 44.【基于深度学习的野外火焰烟雾检测系统】 |
45.【基于深度学习的脑肿瘤智能检测系统】 | 46.【基于深度学习的玉米叶片病害智能诊断与防治系统】 |
47.【基于深度学习的橙子病害智能诊断与防治系统】 | 48.【基于深度学习的车辆检测追踪与流量计数系统】 |
49.【基于深度学习的行人检测追踪与双向流量计数系统】 | 50.【基于深度学习的反光衣检测与预警系统】 |
51.【基于深度学习的危险区域人员闯入检测与报警系统】 | 52.【基于深度学习的高密度人脸智能检测与统计系统】 |
53.【基于深度学习的CT扫描图像肾结石智能检测系统】 | 54.【基于深度学习的水果智能检测系统】 |
55.【基于深度学习的水果质量好坏智能检测系统】 | 56.【基于深度学习的蔬菜目标检测与识别系统】 |
57.【基于深度学习的非机动车驾驶员头盔检测系统】 | 58.【太基于深度学习的阳能电池板检测与分析系统】 |
59.【基于深度学习的工业螺栓螺母检测】 | 60.【基于深度学习的金属焊缝缺陷检测系统】 |
61.【基于深度学习的链条缺陷检测与识别系统】 | 62.【基于深度学习的交通信号灯检测识别】 |
63.【基于深度学习的草莓成熟度检测与识别系统】 | 64.【基于深度学习的水下海生物检测识别系统】 |
65.【基于深度学习的道路交通事故检测识别系统】 | 66.【基于深度学习的安检X光危险品检测与识别系统】 |
67.【基于深度学习的农作物类别检测与识别系统】 | 68.【基于深度学习的危险驾驶行为检测识别系统】 |
69.【基于深度学习的维修工具检测识别系统】 | 70.【基于深度学习的维修工具检测识别系统】 |
71.【基于深度学习的建筑墙面损伤检测系统】 | 72.【基于深度学习的煤矿传送带异物检测系统】 |
73.【基于深度学习的老鼠智能检测系统】 | 74.【基于深度学习的水面垃圾智能检测识别系统】 |
75.【基于深度学习的遥感视角船只智能检测系统】 | 76.【基于深度学习的胃肠道息肉智能检测分割与诊断系统】 |
77.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】 | 78.【基于深度学习的心脏超声图像间隔壁检测分割与分析系统】 |
79.【基于深度学习的果园苹果检测与计数系统】 | 80.【基于深度学习的半导体芯片缺陷检测系统】 |
81.【基于深度学习的糖尿病视网膜病变检测与诊断系统】 | 82.【基于深度学习的运动鞋品牌检测与识别系统】 |
83.【基于深度学习的苹果叶片病害检测识别系统】 | 84.【基于深度学习的医学X光骨折检测与语音提示系统】 |
85.【基于深度学习的遥感视角农田检测与分割系统】 | 86.【基于深度学习的运动品牌LOGO检测与识别系统】 |
87.【基于深度学习的电瓶车进电梯检测与语音提示系统】 | 88.【基于深度学习的遥感视角地面房屋建筑检测分割与分析系统】 |
89.【基于深度学习的医学CT图像肺结节智能检测与语音提示系统】 | 90.【基于深度学习的舌苔舌象检测识别与诊断系统】 |
91.【基于深度学习的蛀牙智能检测与语音提示系统】 | 92.【基于深度学习的皮肤癌智能检测与语音提示系统】 |
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
- 摘要
- 方法详解
- 1. SPD-Conv结构
- 2. 实现细节
- 创新点
- SPD-Conv的作用机制
- 在目标检测中的应用(YOLOv5-SPD)
- 在图像分类中的应用(ResNet-SPD)
- 总结与启示
- SPDConv模块源码与注释
摘要
- 核心问题:现有CNN架构在低分辨率图像和小物体检测任务中性能显著下降,根源在于普遍使用的跨步卷积(strided convolution)和池化层会导致细粒度信息丢失。
- 解决方案:提出新型CNN构建模块SPD-Conv,完全替代跨步卷积和池化层,由空间到深度(SPD)层+非跨步卷积层组成。
- 效果:
- 在目标检测(YOLOv5改造)和图像分类(ResNet改造)任务中验证
- 在COCO、Tiny ImageNet等数据集上显著提升AP和top-1准确率
- 对小物体检测(APs提升最高达19%)和低分辨率图像效果尤为突出
方法详解
1. SPD-Conv结构
组件 | 功能 | 数学表达 | 特点 |
---|---|---|---|
SPD层 | 特征图下采样 | 输入: X ( S , S , C 1 ) X(S,S,C_1) X(S,S,C1) → 输出: X ′ ( S s c a l e , S s c a l e , s c a l e 2 C 1 ) X'(\frac{S}{scale}, \frac{S}{scale}, scale^2C_1) X′(scaleS,scaleS,scale2C1) | 无信息丢失的下采样 |
非跨步卷积 | 通道数调整 | 使用stride=1的卷积核,输出 X ′ ′ ( S s c a l e , S s c a l e , C 2 ) X''(\frac{S}{scale}, \frac{S}{scale}, C_2) X′′(scaleS,scaleS,C2) | 保留全部判别性特征 |
2. 实现细节
-
SPD层工作流程:
- 按scale因子切片特征图(如scale=2时得到4个子图)
- 沿通道维度拼接子图
- 示例:640x640输入 → SPD(scale=2) → 320x320输出(通道数×4)
-
与传统方法对比:
方法 信息保留 适用场景 计算效率 跨步卷积 丢失高频信息 高分辨率场景 高 最大池化 丢失空间细节 大物体检测 高 SPD-Conv 完全保留 小物体/低分辨率 中等
创新点
-
架构革新:
- 首次完全消除CNN中的跨步操作
- 统一处理下采样(替代池化和跨步卷积)
-
理论突破:
- 证明传统下采样是性能瓶颈的理论依据
- 提出信息无损下采样范式
-
工程价值:
- 即插即用:兼容主流CNN架构(YOLO/ResNet等)
- 开源实现:提供PyTorch/TensorFlow支持
-
性能优势:
- COCO数据集小物体AP提升最高达19%
- Tiny ImageNet分类准确率提升2.84%
SPD-Conv的作用机制
在目标检测中的应用(YOLOv5-SPD)
-
改造点:
- 替换7个stride=2卷积层(Backbone 5层 + Neck 2层)
- 保持原网络宽度/深度缩放策略
-
效果增强原理:
- 多尺度特征保留:SPD层将空间信息转化为通道信息
- 小物体检测:1/4分辨率下仍保持有效特征
-
可视化对比:
- 传统YOLOv5:漏检被遮挡物体(长颈鹿)
- YOLOv5-SPD:成功检测微小物体(人脸+长椅)
在图像分类中的应用(ResNet-SPD)
-
改造策略:
- 移除原始max pooling层(因输入分辨率已较低)
- 替换4个stride=2卷积
-
分类优势:
- 低分辨率图像(64x64)纹理特征保留更完整
- 错误案例分析:ResNet18误分类样本被SPD版本正确识别
总结与启示
-
核心结论:
- 传统下采样方法是小物体检测的性能瓶颈
- SPD-Conv在同等参数量下实现显著性能提升
-
应用指导:
- 推荐场景:监控摄像头、医学影像、卫星图像等小物体/低分辨率任务
- 慎用场景:高分辨率大物体检测(可能增加不必要计算量)
SPDConv模块源码与注释
#论文地址:https://arxiv.org/pdf/2208.03641.pdf
#代码地址:https://github.com/LabSAINT/SPD-Conv
import torch
import torch.nn as nn
# 自动填充函数,用于确保卷积操作后输出的特征图尺寸与输入相同
def autopad(k, p=None, d=1): # kernel, padding, dilation
"""计算填充大小,使得卷积操作后输出尺寸与输入相同。
参数:
k (int or list): 卷积核大小
p (int or list, optional): 填充大小,默认为None
d (int or list, optional): 膨胀因子,默认为1
返回:
p (int or list): 计算后的填充大小
"""
if d > 1:
k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # 计算实际卷积核大小
if p is None:
p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # 自动计算填充大小
return p
# 定义SPDConv类,继承自nn.Module
class SPDConv(nn.Module):
"""标准卷积层,支持多种参数配置,包括输入通道数、输出通道数、卷积核大小、步幅、填充、分组、膨胀因子和激活函数。
参数:
c1 (int): 输入通道数
c2 (int): 输出通道数
k (int, optional): 卷积核大小,默认为1
s (int, optional): 步幅,默认为1
p (int or list, optional): 填充大小,默认为None
g (int, optional): 分组数,默认为1
d (int or list, optional): 膨胀因子,默认为1
act (bool or nn.Module, optional): 是否使用激活函数,默认为True
"""
default_act = nn.SiLU() # 默认激活函数为SiLU
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
"""初始化卷积层。
参数:
c1 (int): 输入通道数
c2 (int): 输出通道数
k (int, optional): 卷积核大小,默认为1
s (int, optional): 步幅,默认为1
p (int or list, optional): 填充大小,默认为None
g (int, optional): 分组数,默认为1
d (int or list, optional): 膨胀因子,默认为1
act (bool or nn.Module, optional): 是否使用激活函数,默认为True
"""
super().__init__()
c1 = c1 * 4 # 将输入通道数乘以4
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False) # 定义卷积层
self.bn = nn.BatchNorm2d(c2) # 定义批量归一化层
self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity() # 定义激活函数
def forward(self, x):
"""前向传播函数,对输入进行卷积、批量归一化和激活操作。
参数:
x (torch.Tensor): 输入张量
返回:
torch.Tensor: 处理后的张量
"""
# 将输入张量按通道维度进行切片并拼接,增加通道数
x = torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)
# 应用卷积、批量归一化和激活函数
return self.act(self.bn(self.conv(x)))
def forward_fuse(self, x):
"""前向传播函数(融合版本),对输入进行卷积和激活操作,不包含批量归一化。
参数:
x (torch.Tensor): 输入张量
返回:
torch.Tensor: 处理后的张量
"""
# 将输入张量按通道维度进行切片并拼接,增加通道数
x = torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1)
# 应用卷积和激活函数
return self.act(self.conv(x))
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!