1. 从分类到分割:VGG16的全卷积化改造
第一次接触语义分割时,最让我困惑的就是:为什么一个原本用来分类的VGG16网络,经过简单改造就能完成像素级的预测任务?这要从全卷积化(Convolutionalization)这个关键步骤说起。
传统的VGG16网络在最后三层使用了全连接层,这种设计有个致命缺陷——输入图片的尺寸必须固定为224x224。我在实际项目中就遇到过这个问题:当尝试处理不同尺寸的医疗影像时,系统总会报出维度不匹配的错误。而全卷积化改造完美解决了这个痛点。
具体操作其实很巧妙:把第一个全连接层(FC6)转换成7x7的卷积核,第二个全连接层(FC7)转换成1x1卷积核。我做过参数量的对比计算:
- 原始FC6层:7x7x512x4096=102,760,448个参数
- 转换后的卷积层:同样需要7x7x512x4096个参数
这个改造带来了三个关键优势:
- 输入图片尺寸不再受限,可以处理任意分辨率的图像
- 保留了空间位置信息,为后续像素级预测打下基础
- 网络整体仍然是端到端可训练的
有个有趣的实验现象:当输入大尺寸图片时,最后的特征图会呈现类似热力图的效果。比如输入一张500x500的猫图片,经过改造后的网络会在猫的主体区域产生高激活值。这个特性后来被广泛用于弱监督语义分割。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. FCN的三重奏:32s/16s/8s架构详解
2.1 FCN-32s的直筒式结构
FCN-32s是最基础的版本,我把它比作"直筒电梯"——特征图经过32倍下采样后,直接通过转置卷积上采样32倍恢复原尺寸。这种设计简单粗暴,但存在明显的细节丢失问题。
在实际训练时发现个细节:原论文将第一个卷积层的padding设为100,这会导致两个问题:
- 计算量大幅增加
- 上采样后需要裁剪边缘
经过多次实验验证,其实padding=3就足够处理绝大多数场景。这里有个小技巧:使用PyTorch实现时可以这样设置:
python复制# 更合理的padding设置
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
2.2 FCN-16s的跳跃连接
FCN-16s引入了第一个重要创新——特征融合。它将pool4层的特征(下采样16倍)与主分
