1. 为什么传统CNN会丢失小目标信息?
当你用手机拍远处的飞鸟时,照片放大后鸟的轮廓可能变得模糊不清——这与卷积神经网络(CNN)处理小目标时的困境如出一辙。传统CNN通过**步长卷积(Strided Convolution)和池化层(Pooling)**进行下采样,就像用筛子过滤咖啡粉时,细小的颗粒会从筛孔中漏掉一样。以YOLOv5为例,其骨干网络中的Focus模块会通过跨步卷积将640x640输入快速降维到320x320,这个过程中:
- 每个2x2网格只保留1个像素(相当于丢弃75%原始信息)
- 边缘特征和小目标特征可能被完全忽略
- 后续层接收到的已是"残缺"的特征图
我在处理卫星图像中的车辆检测时深有体会:原始图像中4x4像素的汽车,经过3次下采样后,在特征图上可能仅剩1个像素点,这时模型根本无从判断这是汽车还是噪点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SPD-Conv的颠覆性设计思路
SPD-Conv的解决方案堪称"暴力美学"——既然下采样会丢失信息,那就彻底抛弃传统下采样方式。其核心由两个部分组成:
2.1 空间到深度(Space-to-Depth)层
这个操作类似魔方拆解重组:
- 将特征图按2x2网格切分(缩放因子=2时)
- 每个网格的4个像素平铺到通道维度
- 输出特征图尺寸减半,但通道数变为4倍
python复制# PyTorch实现示例
def space_to_depth(x, block_size=2):
b, c, h, w = x.size()
unfolded = x.unfold(2, block_size, block_size).unfold(3, block_size, block_size)
return unfolded.contiguous().view(b, c*(block_size**2), h//block_size, w//block_size)
2.2 非步长卷积层
紧随其后的常规卷积层负责"消化"激增的通道数:
- 使用1x1卷积压缩通道
- 保持特征图尺寸不变
- 所有计算都在原始空间位置进行
实测在ResNet-50改造中,用SPD-Conv替换第一个7x7卷积+池化层后,小目标检测AP提升达6.2%。
