动手学深度学习——FCN
1. 前言前面我们已经学习了语义分割相关的几个基础内容什么是语义分割语义分割数据集如何组织什么是转置卷积为什么说转置卷积仍然是一种卷积这些知识其实都在为一个经典模型做铺垫那就是FCNFully Convolutional Network全卷积网络FCN 是语义分割发展中的一个里程碑模型。它的重要意义在于把传统卷积神经网络从“整图分类”改造成“像素级预测”模型。也就是说FCN 让卷积网络不再只输出一个类别而是能够输出一张与空间位置对应的预测图从而实现语义分割。2. 什么是 FCNFCN 的全称是Fully Convolutional Network中文通常翻译为全卷积网络这里“全卷积”三个字非常关键意思是整个网络只使用卷积相关操作而不再使用传统全连接层。为什么要这样做因为如果网络最后用了全连接层那么空间结构会被压扁模型只能输出一个固定长度向量更适合做图像分类。而语义分割要求输出一张空间分布图所以必须尽量保留空间结构。因此FCN 的核心思想就是把原来用于分类的 CNN 改造成一个能够输出二维预测图的网络。3. 为什么语义分割需要 FCN在普通图像分类网络中整体流程通常是输入图像多层卷积和池化提取特征最后通过全连接层输出类别这种结构适合做“整张图是什么”的判断。但语义分割要求的是图像中每个像素属于什么类别所以模型不能只输出一个类别向量而必须输出一张标签预测图。这就要求网络满足两个条件3.1 能提取深层语义特征因为模型仍然要理解图像中的高级语义信息。3.2 能恢复空间分辨率因为最终要给每个像素做预测不能把空间信息彻底丢掉。FCN 正是在解决这两个问题。4. FCN 的核心思想FCN 的核心思想可以概括成三步第一步去掉全连接层把传统分类网络最后的全连接层换成卷积层使网络变成“全卷积”的。第二步保留空间结构这样一来网络输出就不再是单个类别而仍然是具有空间布局的特征图。第三步使用转置卷积上采样由于经过多次卷积和池化后特征图分辨率会变小所以需要用转置卷积把它恢复到更大的尺寸得到接近原图大小的预测结果。所以 FCN 的本质是卷积提取语义特征 转置卷积恢复分辨率 像素级分类输出5. FCN 和普通 CNN 的根本区别这是这篇里最关键的一点。5.1 普通 CNN普通 CNN 主要用于分类最后输出通常是一个类别或一个类别概率向量它更关心整张图的整体语义。5.2 FCNFCN 输出的是一张空间预测图图中每个位置都对应一个类别预测它更关心每个位置的语义归属。所以可以简单概括成普通 CNN 输出“一个答案”FCN 输出“一张答案图”。6. FCN 为什么叫“全卷积”很多初学者会以为“全卷积”只是说卷积层很多其实不是。它真正的意思是网络中不再使用传统全连接层而是全部由卷积操作构成。包括最后原本做分类的位置也改用卷积层来完成。这样做的好处是6.1 输入尺寸更灵活全连接层通常要求固定输入尺寸而全卷积结构对输入尺寸更灵活。6.2 保留空间对应关系卷积输出仍然有二维结构这对语义分割非常重要。6.3 更适合做密集预测语义分割本质上就是密集预测任务而全卷积结构天然适合在空间位置上做密集输出。7. FCN 的整体结构怎么理解FCN 的结构可以分成两个阶段来看。7.1 编码阶段前半部分和普通卷积网络很像主要负责提取特征逐步扩大感受野获取更强的语义信息但与此同时特征图尺寸会越来越小。7.2 解码/恢复阶段后半部分则通过转置卷积把较小的特征图逐步放大恢复出更高分辨率的输出图。这个输出图中的每个位置都会对应一个类别预测。所以 FCN 是一种典型的先压缩提特征再恢复做预测的结构。8. FCN 中转置卷积起什么作用这一点必须讲透因为前面几节都在为它服务。卷积网络经过多层下采样后特征图通常变得很小。例如输入是一张较大的图片经过若干层后可能只剩下1/21/41/8甚至更小如果直接用这个小特征图做输出那么语义分割结果会很粗糙。所以需要转置卷积来完成上采样把低分辨率特征图恢复成高分辨率预测图。因此在 FCN 中转置卷积是连接“深层语义特征”和“像素级输出结果”的关键桥梁。9. FCN 怎样把分类网络改造成分割网络李沐这里讲 FCN一个非常典型的思路就是用预训练分类网络作为骨干再把最后部分改造成分割结构。例如一个原本用于图像分类的网络最后可能是卷积层提特征全局池化或全连接输出类别而改造成 FCN 后通常会变成前面保留卷积提特征部分去掉全连接分类头增加1×1卷积做类别映射再通过转置卷积恢复尺寸这样原来的分类模型就变成了分割模型。10. 1×1 卷积在 FCN 中的作用这一点很重要也很适合写进博客。在 FCN 中经常会使用1×1 卷积来做类别预测。它的作用可以理解为对每个空间位置上的通道特征做线性变换输出该位置属于各类别的分数。例如假设某层特征图有 512 个通道分割任务有 21 个类别那么可以用一个1×1卷积把512 通道 - 21 通道这样输出的 21 个通道就可以理解为每个空间位置在 21 个类别上的打分所以1×1卷积其实承担了“逐像素分类器”的角色。11. FCN 的输出是什么FCN 的输出通常可以理解为一个类别通道维度上的预测张量假设输入图像大小为H × W类别数为C那么最终模型输出往往可以表示成C × H × W或者在 batch 维度下写成N × C × H × W其中N批量大小C类别数H × W空间位置这意味着对于图像中的每个像素位置模型都会给出一个长度为C的类别打分向量。再对类别维做argmax就能得到最终分割类别图。12. FCN 为什么是语义分割里的经典模型FCN 之所以经典是因为它第一次比较系统地说明了卷积网络不只是能做整图分类也能做像素级预测。它的重要贡献主要体现在12.1 把分类网络推广到分割任务让已有 CNN 结构能够迁移到更细粒度的视觉任务中。12.2 提出了端到端分割思路输入整张图输出整张标签图中间不需要手工设计复杂特征。12.3 推动了后续大量分割模型发展后来的很多语义分割网络本质上都可以看作是在 FCN 基础上的改进。所以 FCN 在语义分割中的地位类似于早期 R-CNN 在检测中的地位。13. FCN 的局限性当然FCN 并不是完美的。13.1 输出边界可能比较粗糙因为下采样会损失细节即使后面上采样也不一定能完全恢复精细边缘。13.2 小目标和细粒度结构处理不够理想对于很细小的物体或边界复杂区域FCN 可能分得不够精确。13.3 上采样结果依赖特征质量如果编码阶段已经丢掉太多空间细节单靠转置卷积也很难补回来。这也是为什么后来出现了很多改进结构比如跳跃连接U-NetDeepLab 等不过作为入门模型FCN 非常重要。14. FCN 和前面内容是怎么串起来的回头看一下你会发现这部分知识其实是一步步铺过来的。先学语义分割明白任务目标是像素级分类。再学语义分割数据集知道标签是逐像素标注图。再学转置卷积明白如何把小特征图恢复成大输出图。最后学 FCN把这些知识真正组装成一个完整分割模型。所以 FCN 这一节本质上就是前面分割基础知识的集中落地。15. 李沐这里讲 FCN 的重点是什么这一节并不是让你立刻掌握最复杂的分割模型而是让你建立一个核心认识分类网络经过“去全连接 1×1卷积 转置卷积上采样”后就可以变成分割网络。只要把这个主线抓住后面看代码时就会清楚很多。也就是说这节最重要的不是细枝末节而是把这三个关键词记住全卷积逐像素分类转置卷积恢复分辨率16. 本节总结这一节我们学习了 FCN核心内容可以总结为以下几点。16.1 FCN 是全卷积网络它去掉了传统分类网络中的全连接层整个网络由卷积相关操作构成。16.2 FCN 用于语义分割它能够输出具有空间结构的预测图实现像素级分类。16.3 FCN 的核心是“提特征 恢复分辨率”前面用卷积提取深层语义信息后面用转置卷积进行上采样。16.4 1×1 卷积负责类别映射把每个空间位置的特征变成各类别的预测分数。16.5 FCN 是语义分割中的经典起点模型后续很多分割方法都建立在它的思想之上。17. 学习感悟FCN 这一节特别有意思因为它让人看到一个很重要的深度学习思想一个模型并不是只能做一种任务关键在于你如何改造它的输出方式。原本的 CNN 只能做分类但通过改造网络尾部结构、保留空间信息、加入上采样机制它就能完成语义分割。这也说明很多经典模型的创新不一定来自完全推翻旧结构而可能来自对已有结构进行任务导向的重新组织。FCN 就是这种思想的典型代表。