Keras-FCN 模型架构全解析:Vgg16、ResNet50 与 DenseNet 的 6 大分割网络
【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic Segmentation(Unfinished)项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCN
想要搞懂Keras-FCN 模型架构,却面对一堆源码不知从何下手?本文用通俗的语言,为你逐一拆解 Keras-FCN 项目中基于 Keras-TensorFlow 实现的 6 个全卷积网络(FCN)语义分割模型,涵盖 Vgg16、ResNet50 与 DenseNet 三大主干网络,帮你快速建立 FCN 语义分割的完整知识地图。
Keras-FCN 是什么?全卷积网络语义分割入门
Keras-FCN 是一个基于 Keras + TensorFlow 的全卷积网络(Fully Convolutional Networks)语义分割实现。传统分类网络最后用全连接层输出类别概率,而 FCN 将全连接层替换为卷积层,让网络可以接受任意尺寸的输入,并在像素级别输出每个点的类别,从而实现"端到端"的语义分割。
该项目最大的价值在于:它把 Vgg16、ResNet50、DenseNet 三种经典主干网络,通过"普通 FCN"与"空洞卷积(Atrous)FCN"两种形态组合成了 6 个可直接使用的分割模型,全部定义在 models.py 中,是学习分割网络架构演进的绝佳教材。
语义分割能做什么?一张图看懂效果
下面这张图直观展示了语义分割的输入与输出:左边是原始图像,中间是人工标注的真实分割标签(Ground Truth),右边是 AtrousFCN_Resnet50_16s 模型的预测结果,可以看到运动员与自行车被逐像素地划分出来。
6 大分割网络逐一拆解:Vgg16、ResNet50 与 DenseNet
1. Vgg16 系列:经典 FCN 的开山之作
FCN_Vgg16_32s是最经典的 FCN-32s 结构:以 Vgg16 为特征提取主干,将最后的全连接层fc1、fc2改写为 4096 通道的卷积层,再接 1x1 卷积输出 21 类(Pascal VOC 的 20 类 + 背景),最后通过BilinearUpSampling2D做 32 倍双线性上采样恢复到原图尺寸。它的实现要点是把fc6的 7x7 卷积改为 padding='same',从而兼容任意输入尺寸。
AtrousFCN_Vgg16_16s则在 Vgg16 的fc1卷积上引入了dilation_rate=(2, 2)的空洞卷积,在不损失分辨率的前提下扩大感受野,最后直接上采样到输入图像的原始尺寸(16s 表示 stride 16)。它位于 models.py,可以看到与 32s 版本几乎相同,区别仅在空洞率与上采样方式。
2. ResNet50 系列:残差结构提升分割精度
FCN_Resnet50_32s把主干换成 ResNet50,沿用 conv_block / identity_block 的标准残差结构,在网络末端用 1x1 卷积输出类别图并做 32 倍上采样。得益于残差连接,深层特征得以顺畅传递,分割效果优于 Vgg16 版本。
AtrousFCN_Resnet50_16s是项目当前表现最好的模型:它在 ResNet50 的 stage5 中把普通卷积块替换为atrous_conv_block与atrous_identity_block(空洞率为 2),配合 16s 的上采样策略,在 Pascal VOC2012 增强数据集上取得了mIoU 0.661076、像素准确率约 0.9 的成绩。模型结构图与权重都保存在 Models/AtrousFCN_Resnet50_16s/ 目录下(含 model.json 与 model.png)。
3. DenseNet 系列:密集连接的进阶探索
Atrous_DenseNet基于 keras-contrib 的 DenseNet 扩展,采用 3 个 dense block、growth_rate=32、transition_dilation_rate=2 的空洞过渡层配置,输出端使用 sigmoid 激活并重塑为逐像素类别。DenseNet_FCN则采用 6 段密集连接(nb_layers_per_block=[4,5,7,10,12,15])的纯 FCN 变体。这两个模型(models.py)依赖作者 fork 的 keras-contrib(densenet-atrous 分支),属于对"更强特征复用"的实验性探索。
Keras-FCN 模型架构中的 4 个关键组件
除了 6 个模型本身,整个架构还依赖几个核心模块,理解它们才能完整掌握 Keras-FCN:
- 双线性上采样层:位于 utils/BilinearUpSampling.py,支持按倍数上采样或直接指定目标尺寸,是 FCN 恢复分辨率的关键。
- 分割专用损失函数:utils/loss_function.py 提供
softmax_sparse_crossentropy_ignoring_last_label(VOC 单标签)与binary_crossentropy_with_logits(COCO 多标签)两种损失。 - 分割数据增强:utils/SegDataGenerator.py 实现了随机裁剪、缩放、水平翻转等"图像+标签"同步增强,是提升精度的利器。
- 指标与迁移权重:utils/metrics.py 提供忽略标签的稀疏准确率与 mIoU 计算;utils/transfer_FCN.py 负责把 ImageNet 预训练权重迁移为 FCN 结构。
如何用 Keras-FCN 训练自己的分割模型?
训练入口在 train.py,默认配置为AtrousFCN_Resnet50_16s模型。如果你想切换模型,只需修改 main 函数中的model_name(支持上文 6 个模型名),并设置好数据集路径、target_size、epochs等参数即可。完整流程为:
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/ker/Keras-FCN - 用 utils/transfer_FCN.py 生成预训练权重
- 运行 train.py 开始训练
- 用 inference.py 对单张图片做语义分割推理
- 用 evaluate.py 评估性能并保存分割结果图(权重与结构图默认存放在 Models 目录)
总结:如何选择适合自己的分割网络?
看完这份 Keras-FCN 模型架构解析,你可以按需选择:
- 🏃追求最佳精度:选
AtrousFCN_Resnet50_16s,空洞卷积 + ResNet 残差的组合表现最强; - 📦经典入门学习:选
FCN_Vgg16_32s,结构最简单,最适合理解 FCN 原理; - 🔬尝鲜前沿结构:试试
Atrous_DenseNet与DenseNet_FCN,体验密集连接在分割任务上的表现。
无论选择哪个模型,Keras-FCN 的模块化设计都让"改模型、换数据、调参数"变得异常轻松,是学习 FCN 语义分割不可多得的完整参考实现。
【免费下载链接】Keras-FCNKeras-tensorflow implementation of Fully Convolutional Networks for Semantic Segmentation(Unfinished)项目地址: https://gitcode.com/gh_mirrors/ker/Keras-FCN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考