尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Keras-FCN 双线性上采样实现剖析:如何将特征图恢复至原图分辨率

Keras-FCN 双线性上采样实现剖析:如何将特征图恢复至原图分辨率 Keras-FCN 双线性上采样实现剖析如何将特征图恢复至原图分辨率【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic SegmentationUnfinished项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCNKeras-FCN 是一个基于 Keras 与 TensorFlow 的全卷积网络FCN语义分割开源实现它让深度学习模型能够对图片中的每一个像素预测类别。在 FCN 架构中连续的卷积与池化操作会把特征图缩小到原图的 1/32 甚至 1/16而语义分割的输出必须与原图分辨率完全一致这就离不开双线性上采样。本文将带你剖析 Keras-FCN 中双线性上采样层的完整实现一步步看懂特征图是如何从低分辨率恢复至原图分辨率的并给出快速上手阅读源码的建议。什么是语义分割与全卷积网络FCN语义分割是计算机视觉的核心任务之一不仅要认出图片里有什么还要在像素级别画清楚每个物体在哪。下图是 Keras-FCN 文档中的经典示例左侧是原始照片右侧是逐像素标注的结果传统分类网络最后用全连接层输出类别会丢掉空间位置信息而全卷积网络FCN把全连接层替换为卷积层保留了空间结构从而能输出与输入同尺寸的像素级预测图。Keras-FCN 正是这一思路的 Keras 实现其模型定义集中在 models.py。为什么要上采样特征图为何比原图小很多 FCN 的主干网络如 VGG16、ResNet50为了提取高层语义特征会反复进行卷积与最大池化。每经过一次 2×2 池化特征图的宽高就减半32s 模型下采样 5 次特征图缩小到原图的 1/3216s 模型配合空洞卷积Atrous Convolution减少下采样特征图缩小到原图的 1/16例如输入一张 320×320 的图片经过 32 倍下采样后特征图只剩 10×10。这么小的特征图显然无法直接作为分割结果输出必须通过上采样把分辨率放大回去这正是 Keras-FCN 双线性上采样层要解决的难题。Keras-FCN 双线性上采样核心实现剖析 Keras-FCN 将上采样封装成了自定义 Keras 层BilinearUpSampling2D实现位于 utils/BilinearUpSampling.py。它的核心是resize_images_bilinear()函数内部直接调用 TensorFlow 的tf.image.resize_bilinear完成双线性插值。双线性插值的原理很简单目标像素的灰度值由它在原图中邻近的 4 个像素加权平均得到距离越近权重越大。相比最近邻插值会形成锯齿双线性插值过渡平滑且不需要训练参数是 FCN 上采样性价比最高的选择。该实现还细致处理了两种数据格式数据格式处理方式channels_lastTF 默认H×W×C直接调用tf.image.resize_bilinear缩放channels_firstTheano 风格C×H×W先转置为channels_last缩放完成后再转置回来同时层内部通过set_shape显式声明输出张量尺寸保证 Keras 在构建模型阶段就能推导出正确的输出形状。两种调用方式按倍数放大与按目标尺寸恢复 ⚙️BilinearUpSampling2D提供了两种上采样策略这也是理解 Keras-FCN 各模型差异的关键方式一按倍数放大size指定size(32, 32)表示宽高各放大 32 倍x BilinearUpSampling2D(size(32, 32))(x)方式二按目标尺寸恢复target_size直接指定目标分辨率一般传回原始输入尺寸image_sizex BilinearUpSampling2D(target_sizetuple(image_size))(x)两种方式的输出形状计算逻辑都在compute_output_shape()中实现读者可对照 utils/BilinearUpSampling.py 查看。在真实模型中的应用32s 与 16s 架构对比 ️在 models.py 中四种模型恰好展示了上述两种用法的差异FCN_Vgg16_32s与FCN_Resnet50_32s最后使用BilinearUpSampling2D(size(32, 32))将 1/32 的特征图一次性放大 32 倍AtrousFCN_Vgg16_16s与AtrousFCN_Resnet50_16s使用空洞卷积保持 1/16 分辨率再用target_sizeimage_size精准恢复到原图尺寸下图是 FCN_Vgg16_32s 的完整网络结构可以看到双线性上采样层位于网络末端负责把 1×1 卷积输出的 21 类得分图放大回原图大小在 Pascal VOC 2012 增强数据集上AtrousFCN_Resnet50_16s表现最佳像素平均交并比mIoU达到 0.661像素准确率约 0.9其完整架构图同样保存在 Models/AtrousFCN_Resnet50_16s/model.png 中。从分割结果到评估上采样输出如何被使用 ✅上采样之后得到的是一张与原图同分辨率的得分图每个像素有 21 个类别的得分。在 inference.py 中通过np.argmax取得分最高的类别即可得到最终的分割图再套用标注图的调色板就能可视化出与 ground truth 风格一致的预测结果而 evaluate.py 则通过混淆矩阵计算每个类别的 IoU 与平均 mIoU量化评估上采样后分割结果的质量。可见双线性上采样虽然只是整个 FCN 流水线的一小步却直接决定了输出能否与原图对齐、边界是否平滑。总结3 步快速上手阅读建议 如果你想深入学习 Keras-FCN 的双线性上采样实现建议按以下顺序阅读源码先读层实现utils/BilinearUpSampling.py掌握resize_images_bilinear与BilinearUpSampling2D的完整逻辑再看模型调用models.py 中FCN_Vgg16_32s与AtrousFCN_Resnet50_16s两个函数的末尾对比size与target_size两种用法最后跑通推理clone 仓库git clone https://gitcode.com/gh_mirrors/ker/Keras-FCN后参照 README.md 配置数据集用 inference.py 亲眼看一张低分辨率特征图被平滑地恢复至原图分辨率掌握了双线性上采样你就抓住了 FCN 从特征提取到像素级输出的关键一环再去看转置卷积、反池化等其它上采样方案也会事半功倍。祝学习愉快【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic SegmentationUnfinished项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表