这是一个面向路面、混凝土和结构表面裂缝分割的实验仓库,当前主要包含两条模型路线:
- 全量高精度方案:DeepLabV3+ + ResNet101
- 轻量化方案:U-Net 系列
这两条路线分别服务于不同目标:
- DeepLabV3+ + ResNet101 更强调精度、感受野和复杂背景下的稳定性,适合离线评估、服务器端推理和高质量结果产出
- 轻量化 U-Net 更强调参数量、推理速度和部署友好性,适合资源受限场景与快速迭代
CrackNet/
├── dataset/ # 数据集目录
├── DeepLab_ResNet/ # 全量 DeepLabV3+ + ResNet101 方案
│ └── script/
│ ├── model.py
│ ├── train.py
│ ├── test.py
│ ├── dataset.py
│ ├── losses.py
│ ├── metrics.py
│ └── sliding_window.py
└── U2Net/ # 轻量化 U-Net 系列实验目录
├── unet_seg_v1/
├── unet_seg_v2/
├── unet_seg_v3/
└── unet_seg_u2net/
从仓库内容看,目前最值得重点介绍的是:
DeepLab_ResNet/script/:完整的高精度裂缝分割主线U2Net/unet_seg_v1/:轻量化 U-Net 基线U2Net/unet_seg_v2/、U2Net/unet_seg_v3/:在轻量化方向上的进一步增强版本
这一方案位于:
/home/fs-ai/CrackNet/DeepLab_ResNet/script/
它是当前仓库中偏“主力精度模型”的方案,核心特点包括:
- 使用
ResNet101作为主干网络 - 使用
DeepLabV3的 ASPP 进行多尺度上下文建模 - 在解码端改造成
DeepLabV3+风格的低层特征融合结构 - 在融合阶段加入
CBAM注意力 - 训练阶段输出主分支和辅助分支,支持双分支损失监督
- 推理阶段配合滑窗预测,减少大图直接缩放带来的细裂缝丢失
这类模型属于“更重但更稳”的路线,适合处理:
- 背景复杂的裂缝图像
- 细裂缝与纹理噪声混杂的场景
- 对边界质量和召回率要求更高的任务
轻量化模型主要位于:
/home/fs-ai/CrackNet/U2Net/
这一部分虽然目录名叫 U2Net,但里面不仅有 U²-Net,也包含多版轻量化 U-Net 实验。当前轻量化思路的核心是:
- 保留 U-Net 编码器-解码器结构
- 用更轻量的骨干网络替代传统重型 encoder
- 通过 skip connection 保留裂缝边缘细节
- 以较少参数实现较高分辨率的像素级分割
从已有代码来看,轻量化 U-Net 主要包含两类实现方向:
- EfficientNet-B0 编码器 U-Net 基线
- MobileNetV2 编码器 U-Net 增强版
因此,这个仓库里的“轻量化 U-Net”不是单一文件,而是一条逐步演进的轻量化路线。
该模型是一个面向高精度裂缝分割的全量网络。相比轻量级 U-Net,它更强调:
- 更强的特征表达能力
- 更大的有效感受野
- 更稳定的多尺度上下文建模
- 更适合复杂背景下的裂缝提取
对于裂缝这种“细、长、稀疏、对边界敏感”的目标,仅靠浅层局部纹理有时不够。DeepLabV3+ 通过 ASPP 聚合多尺度特征,再结合低层细节恢复,有助于兼顾:
- 细裂缝边界
- 裂缝连续性
- 复杂背景中的抗干扰能力
根据 DeepLab_ResNet/script/model.py,该模型主要由四部分组成:
- 使用
torchvision的deeplabv3_resnet101 - backbone 采用
ResNet101 - 支持 ImageNet 预训练权重初始化
ResNet101 的作用是从输入图像中逐层提取语义特征。相比浅层网络,它的深层残差结构更擅长提取稳定的高层语义信息。
- 使用 DeepLab 系列核心的 ASPP 结构
- 对高层特征进行多尺度空洞卷积建模
ASPP 的意义在于让模型同时看到:
- 很细的局部纹理
- 更大的上下文区域
对于裂缝分割来说,这很重要,因为裂缝往往既有局部边缘特征,又需要结合周边背景判断“这是不是一条真实裂缝,而不是阴影、污渍或纹理”。
你这里不是直接使用原始 DeepLabV3 的简单输出头,而是额外构建了一个更像 DeepLabV3+ 的解码器,包括:
- 从
layer1取低层特征 - 先把低层特征从 256 通道压缩到 48 通道
- 将 ASPP 输出上采样到和低层特征同尺度
- 进行拼接融合
- 再经过卷积 refinement
- 最终恢复到原图分辨率输出 1 通道 logits
这个设计非常适合裂缝任务,因为低层特征更保留边缘和几何细节,而高层特征更有语义判别能力,两者结合后对细裂缝轮廓更友好。
你的解码器里在融合阶段加入了 CBAM,包括:
- Channel Attention
- Spatial Attention
它的作用可以理解为:
- 通道注意力:决定“哪些特征通道更重要”
- 空间注意力:决定“图中哪些位置更重要”
对裂缝分割来说,CBAM 有助于:
- 抑制背景噪声
- 更聚焦细长裂缝区域
- 改善融合特征的判别性
这个模型在训练和推理阶段的输出不同:
- 训练阶段返回
(main_logits, aux_logits) - 推理阶段只返回
main_logits
这样做的意义是:
- 主输出负责最终分割结果
- 辅助输出提升深层特征学习稳定性
这类 auxiliary supervision 在深层 backbone 训练中通常能让优化更稳定。
相比轻量级网络,这条路线的优势主要体现在:
- 更强的多尺度上下文理解能力
- 更适合复杂背景和大分辨率图像
- 对裂缝连续性和整体结构更友好
- 在需要高精度边界恢复时更有上限
但代价也很明显:
- 参数量更大
- 显存占用更高
- 推理延迟更高
- 更适合 GPU 环境,不太适合极端轻量部署
从 DeepLab_ResNet/script/train.py 可以看出,这条模型线不只是“搭一个网络”,而是配了一整套偏工程化的训练策略。
目前训练脚本的关键特性包括:
- OneCycleLR 学习率调度
- EMA 指数滑动平均参数
- 差分学习率
- 自动阈值搜索
- 多损失联合优化
- 滑窗验证
- 可选多数据集联合训练
训练时把参数分成两组:
- backbone 参数:较低学习率
- decoder/head 参数:较高学习率
这样做的原因是:
- ResNet101 通常用预训练权重初始化,不需要大步更新
- decoder 和 crack-specific head 是新加模块,需要更积极地学习
训练脚本中维护了 EMA 模型副本,用于更稳定的验证。它的价值在于:
- 减少单次参数更新带来的波动
- 让验证指标更平滑
- 常常比直接使用即时权重更稳定
裂缝分割的一个实际问题是:不同 checkpoint 在 0.5 阈值下未必最优。你的训练与测试流程已经支持:
- 自动搜索最佳二值化阈值
- 按
precision、iou或dice作为选择指标 - 将最佳阈值写入 checkpoint
这很实用,因为裂缝任务通常对阈值非常敏感,特别是在:
- 正样本极少
- 细裂缝概率图偏弱
- 误检和漏检需要权衡
全量模型推理时配合 sliding_window.py 做滑窗预测,而不是简单暴力缩放整图。这对于裂缝任务非常关键:
- 裂缝本身可能只有数个像素宽
- 如果直接把大图缩放到固定小尺寸,细裂缝容易消失
- 滑窗方式能更好保留局部细节
因此,这条路线本质上是“高精度优先”的工程方案。
轻量化 U-Net 主要用于在较低算力下实现稳定的裂缝分割。相比全量 DeepLabV3+,它更强调:
- 更少参数
- 更低延迟
- 更容易训练和部署
- 仍然保留对细裂缝边缘友好的 skip connection 结构
之所以选择 U-Net 路线,是因为裂缝分割高度依赖空间细节。U-Net 的编码器-解码器结构天然适合:
- 从高层语义恢复到高分辨率掩码
- 通过跳连保留边缘信息
- 对细长目标进行像素级输出
在:
/home/fs-ai/CrackNet/U2Net/unet_seg_v1/model.py
这个版本的特点是:
- 编码器使用
EfficientNet-B0 - 解码器采用 4 级 U-Net 结构
- 最终输出单通道裂缝掩码
它的优势是:
- 参数量比重型 backbone 小得多
- 仍保留较好的特征表达能力
- 对中等算力设备比较友好
根据文件中的说明,这个模型的总参数量约为:
- 4.36M 左右
这相比 ResNet101 级别的 DeepLab 方案明显更轻。
在:
/home/fs-ai/CrackNet/U2Net/unet_seg_v3/U_Net_MobileNetV2_model.py
这个版本进一步强化“轻量化”方向,主要特点包括:
- 编码器改为
MobileNetV2 - 支持多种注意力机制
- 支持深度监督
从代码实现看,它支持:
Attention GateCBAMECA- 或不加注意力
同时训练时可开启 deep_supervision,让中间层也接受监督。
这说明你的轻量化 U-Net 不只是一个最基础的 U-Net,而是在逐步向“轻量部署 + 结构增强”的方向演进。
裂缝分割与普通大目标语义分割不同,裂缝目标通常具有这些特点:
- 非常细
- 很长
- 占图像像素比例很低
- 对边界质量敏感
- 容易被纹理、阴影、污渍干扰
U-Net 的优势就在于:
- 高分辨率解码恢复能力强
- skip connection 可以直接把浅层边缘特征传给解码器
- 对细结构比单纯下采样-上采样结构更友好
所以对于裂缝分割,轻量化 U-Net 往往是一个非常实用的工程基线。
从 unet_seg_v1/train.py 和 unet_seg_v3/train.py 可以看到,轻量化路线也做了不少工程增强。
轻量化 U-Net 的训练通常包含:
- 自动检测输入图像尺寸
- 使用 crack mask 做二值分割监督
- 输出
precision / recall / iou / dice - 使用带类不平衡适配的损失函数
- 支持 early stopping
- 支持梯度累加
在 unet_seg_v3/train.py 中,你已经把训练扩展到多数据集联合训练,包括:
- CRACK500
- DeepCrack
- CrackTree260
这很关键,因为轻量模型参数更少,更依赖数据多样性来提升泛化能力。
轻量化 v3 版本中已经使用更完整的数据增强,例如:
- 随机缩放裁剪
- 翻转
- 仿射变换
- 弹性变形
- 网格畸变
- 噪声
- 模糊
- CLAHE
- CoarseDropout
这些增强对裂缝任务很有效,因为裂缝图像在真实场景中经常存在:
- 光照变化
- 拍摄模糊
- 低对比度
- 背景噪声
- 形态变化
| 维度 | DeepLabV3+ + ResNet101 | 轻量化 U-Net |
|---|---|---|
| 目标定位 | 高精度主力模型 | 轻量化部署模型 |
| 主干网络 | ResNet101 | EfficientNet-B0 / MobileNetV2 |
| 多尺度上下文 | 强,依赖 ASPP | 相对弱一些,主要依赖 encoder + skip |
| 边界恢复 | 通过低层特征融合恢复 | 通过 U-Net 跳连恢复 |
| 参数量 | 大 | 小 |
| 推理速度 | 较慢 | 较快 |
| 显存开销 | 较高 | 较低 |
| 适用场景 | 服务器端、高精度离线分析 | 边缘设备、快速推理、资源受限部署 |
可以把它们理解成:
- DeepLabV3+ + ResNet101 是“精度优先”
- 轻量化 U-Net 是“效率优先”
- 你更关注最终分割质量
- 你希望裂缝连续性更好
- 输入图像分辨率高、背景复杂
- 推理可以放在 GPU 或服务器上
- 你愿意用更高算力换更强表现
- 设备算力有限
- 需要较快推理速度
- 希望更容易导出和部署
- 需要作为嵌入式或边缘侧方案
- 希望先用轻量模型快速验证数据和流程
如果你是从项目学习和维护角度出发,建议按下面顺序看代码:
DeepLab_ResNet/script/model.pyDeepLab_ResNet/script/train.pyDeepLab_ResNet/script/test.pyDeepLab_ResNet/script/losses.pyDeepLab_ResNet/script/metrics.py
这样可以先理解当前仓库的高精度主线。
U2Net/unet_seg_v1/model.pyU2Net/unet_seg_v1/train.pyU2Net/unet_seg_v3/U_Net_MobileNetV2_model.pyU2Net/unet_seg_v3/train.py
这样可以看到轻量化方案是如何从基础 U-Net 逐步演化到带注意力和深监督版本的。
这个仓库的价值不只是“放了两个模型”,而是形成了两条很有代表性的裂缝分割路线:
- 一条是全量、高精度、上下文建模更强的 DeepLabV3+ + ResNet101
- 一条是轻量、高分辨率、部署友好的 U-Net
对于裂缝分割这类任务,这两条路线都非常典型:
- 前者代表“精度和鲁棒性优先”
- 后者代表“效率和可部署性优先”
二者结合起来,能让你在不同场景下做更灵活的模型选型,而不是只依赖单一路线。
CrackNet 当前是一套“全量模型 + 轻量模型”并行推进的裂缝分割实验仓库:全量方向以 DeepLabV3+ + ResNet101 追求精度和多尺度建模能力,轻量方向以 U-Net 追求更低成本、更快推理和更强部署友好性,两者共同服务于高质量裂缝语义分割任务。