Skip to content

SolitudeZY/CrackNet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CrackNet

这是一个面向路面、混凝土和结构表面裂缝分割的实验仓库,当前主要包含两条模型路线:

  • 全量高精度方案:DeepLabV3+ + ResNet101
  • 轻量化方案:U-Net 系列

这两条路线分别服务于不同目标:

  • DeepLabV3+ + ResNet101 更强调精度、感受野和复杂背景下的稳定性,适合离线评估、服务器端推理和高质量结果产出
  • 轻量化 U-Net 更强调参数量、推理速度和部署友好性,适合资源受限场景与快速迭代

1. 项目结构

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/:在轻量化方向上的进一步增强版本

2. 模型路线概览

2.1 全量模型:DeepLabV3+ + ResNet101

这一方案位于:

/home/fs-ai/CrackNet/DeepLab_ResNet/script/

它是当前仓库中偏“主力精度模型”的方案,核心特点包括:

  • 使用 ResNet101 作为主干网络
  • 使用 DeepLabV3 的 ASPP 进行多尺度上下文建模
  • 在解码端改造成 DeepLabV3+ 风格的低层特征融合结构
  • 在融合阶段加入 CBAM 注意力
  • 训练阶段输出主分支和辅助分支,支持双分支损失监督
  • 推理阶段配合滑窗预测,减少大图直接缩放带来的细裂缝丢失

这类模型属于“更重但更稳”的路线,适合处理:

  • 背景复杂的裂缝图像
  • 细裂缝与纹理噪声混杂的场景
  • 对边界质量和召回率要求更高的任务

2.2 轻量化模型:U-Net 系列

轻量化模型主要位于:

/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”不是单一文件,而是一条逐步演进的轻量化路线。


3. 全量模型:DeepLabV3+ + ResNet101

3.1 模型定位

该模型是一个面向高精度裂缝分割的全量网络。相比轻量级 U-Net,它更强调:

  • 更强的特征表达能力
  • 更大的有效感受野
  • 更稳定的多尺度上下文建模
  • 更适合复杂背景下的裂缝提取

对于裂缝这种“细、长、稀疏、对边界敏感”的目标,仅靠浅层局部纹理有时不够。DeepLabV3+ 通过 ASPP 聚合多尺度特征,再结合低层细节恢复,有助于兼顾:

  • 细裂缝边界
  • 裂缝连续性
  • 复杂背景中的抗干扰能力

3.2 结构组成

根据 DeepLab_ResNet/script/model.py,该模型主要由四部分组成:

1)ResNet101 主干网络

  • 使用 torchvisiondeeplabv3_resnet101
  • backbone 采用 ResNet101
  • 支持 ImageNet 预训练权重初始化

ResNet101 的作用是从输入图像中逐层提取语义特征。相比浅层网络,它的深层残差结构更擅长提取稳定的高层语义信息。

2)ASPP 多尺度上下文模块

  • 使用 DeepLab 系列核心的 ASPP 结构
  • 对高层特征进行多尺度空洞卷积建模

ASPP 的意义在于让模型同时看到:

  • 很细的局部纹理
  • 更大的上下文区域

对于裂缝分割来说,这很重要,因为裂缝往往既有局部边缘特征,又需要结合周边背景判断“这是不是一条真实裂缝,而不是阴影、污渍或纹理”。

3)DeepLabV3+ 风格解码器

你这里不是直接使用原始 DeepLabV3 的简单输出头,而是额外构建了一个更像 DeepLabV3+ 的解码器,包括:

  • layer1 取低层特征
  • 先把低层特征从 256 通道压缩到 48 通道
  • 将 ASPP 输出上采样到和低层特征同尺度
  • 进行拼接融合
  • 再经过卷积 refinement
  • 最终恢复到原图分辨率输出 1 通道 logits

这个设计非常适合裂缝任务,因为低层特征更保留边缘和几何细节,而高层特征更有语义判别能力,两者结合后对细裂缝轮廓更友好。

4)CBAM 注意力模块

你的解码器里在融合阶段加入了 CBAM,包括:

  • Channel Attention
  • Spatial Attention

它的作用可以理解为:

  • 通道注意力:决定“哪些特征通道更重要”
  • 空间注意力:决定“图中哪些位置更重要”

对裂缝分割来说,CBAM 有助于:

  • 抑制背景噪声
  • 更聚焦细长裂缝区域
  • 改善融合特征的判别性

3.3 训练与推理模式

这个模型在训练和推理阶段的输出不同:

  • 训练阶段返回 (main_logits, aux_logits)
  • 推理阶段只返回 main_logits

这样做的意义是:

  • 主输出负责最终分割结果
  • 辅助输出提升深层特征学习稳定性

这类 auxiliary supervision 在深层 backbone 训练中通常能让优化更稳定。

3.4 全量模型的典型优势

相比轻量级网络,这条路线的优势主要体现在:

  • 更强的多尺度上下文理解能力
  • 更适合复杂背景和大分辨率图像
  • 对裂缝连续性和整体结构更友好
  • 在需要高精度边界恢复时更有上限

但代价也很明显:

  • 参数量更大
  • 显存占用更高
  • 推理延迟更高
  • 更适合 GPU 环境,不太适合极端轻量部署

4. 全量模型训练策略

DeepLab_ResNet/script/train.py 可以看出,这条模型线不只是“搭一个网络”,而是配了一整套偏工程化的训练策略。

4.1 训练特性

目前训练脚本的关键特性包括:

  • OneCycleLR 学习率调度
  • EMA 指数滑动平均参数
  • 差分学习率
  • 自动阈值搜索
  • 多损失联合优化
  • 滑窗验证
  • 可选多数据集联合训练

4.2 差分学习率

训练时把参数分成两组:

  • backbone 参数:较低学习率
  • decoder/head 参数:较高学习率

这样做的原因是:

  • ResNet101 通常用预训练权重初始化,不需要大步更新
  • decoder 和 crack-specific head 是新加模块,需要更积极地学习

4.3 EMA

训练脚本中维护了 EMA 模型副本,用于更稳定的验证。它的价值在于:

  • 减少单次参数更新带来的波动
  • 让验证指标更平滑
  • 常常比直接使用即时权重更稳定

4.4 自动阈值搜索

裂缝分割的一个实际问题是:不同 checkpoint 在 0.5 阈值下未必最优。你的训练与测试流程已经支持:

  • 自动搜索最佳二值化阈值
  • precisionioudice 作为选择指标
  • 将最佳阈值写入 checkpoint

这很实用,因为裂缝任务通常对阈值非常敏感,特别是在:

  • 正样本极少
  • 细裂缝概率图偏弱
  • 误检和漏检需要权衡

4.5 滑窗预测

全量模型推理时配合 sliding_window.py 做滑窗预测,而不是简单暴力缩放整图。这对于裂缝任务非常关键:

  • 裂缝本身可能只有数个像素宽
  • 如果直接把大图缩放到固定小尺寸,细裂缝容易消失
  • 滑窗方式能更好保留局部细节

因此,这条路线本质上是“高精度优先”的工程方案。


5. 轻量化模型:U-Net

5.1 模型定位

轻量化 U-Net 主要用于在较低算力下实现稳定的裂缝分割。相比全量 DeepLabV3+,它更强调:

  • 更少参数
  • 更低延迟
  • 更容易训练和部署
  • 仍然保留对细裂缝边缘友好的 skip connection 结构

之所以选择 U-Net 路线,是因为裂缝分割高度依赖空间细节。U-Net 的编码器-解码器结构天然适合:

  • 从高层语义恢复到高分辨率掩码
  • 通过跳连保留边缘信息
  • 对细长目标进行像素级输出

5.2 轻量化 U-Net 的两个层次

基线版本:EfficientNet-B0 U-Net

在:

/home/fs-ai/CrackNet/U2Net/unet_seg_v1/model.py

这个版本的特点是:

  • 编码器使用 EfficientNet-B0
  • 解码器采用 4 级 U-Net 结构
  • 最终输出单通道裂缝掩码

它的优势是:

  • 参数量比重型 backbone 小得多
  • 仍保留较好的特征表达能力
  • 对中等算力设备比较友好

根据文件中的说明,这个模型的总参数量约为:

  • 4.36M 左右

这相比 ResNet101 级别的 DeepLab 方案明显更轻。

增强版本:MobileNetV2 U-Net

在:

/home/fs-ai/CrackNet/U2Net/unet_seg_v3/U_Net_MobileNetV2_model.py

这个版本进一步强化“轻量化”方向,主要特点包括:

  • 编码器改为 MobileNetV2
  • 支持多种注意力机制
  • 支持深度监督

从代码实现看,它支持:

  • Attention Gate
  • CBAM
  • ECA
  • 或不加注意力

同时训练时可开启 deep_supervision,让中间层也接受监督。

这说明你的轻量化 U-Net 不只是一个最基础的 U-Net,而是在逐步向“轻量部署 + 结构增强”的方向演进。

5.3 为什么 U-Net 适合裂缝分割

裂缝分割与普通大目标语义分割不同,裂缝目标通常具有这些特点:

  • 非常细
  • 很长
  • 占图像像素比例很低
  • 对边界质量敏感
  • 容易被纹理、阴影、污渍干扰

U-Net 的优势就在于:

  • 高分辨率解码恢复能力强
  • skip connection 可以直接把浅层边缘特征传给解码器
  • 对细结构比单纯下采样-上采样结构更友好

所以对于裂缝分割,轻量化 U-Net 往往是一个非常实用的工程基线。


6. 轻量化 U-Net 训练思路

unet_seg_v1/train.pyunet_seg_v3/train.py 可以看到,轻量化路线也做了不少工程增强。

6.1 基础训练思路

轻量化 U-Net 的训练通常包含:

  • 自动检测输入图像尺寸
  • 使用 crack mask 做二值分割监督
  • 输出 precision / recall / iou / dice
  • 使用带类不平衡适配的损失函数
  • 支持 early stopping
  • 支持梯度累加

6.2 多数据集训练

unet_seg_v3/train.py 中,你已经把训练扩展到多数据集联合训练,包括:

  • CRACK500
  • DeepCrack
  • CrackTree260

这很关键,因为轻量模型参数更少,更依赖数据多样性来提升泛化能力。

6.3 增强策略

轻量化 v3 版本中已经使用更完整的数据增强,例如:

  • 随机缩放裁剪
  • 翻转
  • 仿射变换
  • 弹性变形
  • 网格畸变
  • 噪声
  • 模糊
  • CLAHE
  • CoarseDropout

这些增强对裂缝任务很有效,因为裂缝图像在真实场景中经常存在:

  • 光照变化
  • 拍摄模糊
  • 低对比度
  • 背景噪声
  • 形态变化

7. 两类模型的核心区别

维度 DeepLabV3+ + ResNet101 轻量化 U-Net
目标定位 高精度主力模型 轻量化部署模型
主干网络 ResNet101 EfficientNet-B0 / MobileNetV2
多尺度上下文 强,依赖 ASPP 相对弱一些,主要依赖 encoder + skip
边界恢复 通过低层特征融合恢复 通过 U-Net 跳连恢复
参数量
推理速度 较慢 较快
显存开销 较高 较低
适用场景 服务器端、高精度离线分析 边缘设备、快速推理、资源受限部署

可以把它们理解成:

  • DeepLabV3+ + ResNet101 是“精度优先”
  • 轻量化 U-Net 是“效率优先”

8. 什么时候选哪一个

优先选 DeepLabV3+ + ResNet101 的情况

  • 你更关注最终分割质量
  • 你希望裂缝连续性更好
  • 输入图像分辨率高、背景复杂
  • 推理可以放在 GPU 或服务器上
  • 你愿意用更高算力换更强表现

优先选轻量化 U-Net 的情况

  • 设备算力有限
  • 需要较快推理速度
  • 希望更容易导出和部署
  • 需要作为嵌入式或边缘侧方案
  • 希望先用轻量模型快速验证数据和流程

9. 推荐理解顺序

如果你是从项目学习和维护角度出发,建议按下面顺序看代码:

先看全量模型

  1. DeepLab_ResNet/script/model.py
  2. DeepLab_ResNet/script/train.py
  3. DeepLab_ResNet/script/test.py
  4. DeepLab_ResNet/script/losses.py
  5. DeepLab_ResNet/script/metrics.py

这样可以先理解当前仓库的高精度主线。

再看轻量化模型

  1. U2Net/unet_seg_v1/model.py
  2. U2Net/unet_seg_v1/train.py
  3. U2Net/unet_seg_v3/U_Net_MobileNetV2_model.py
  4. U2Net/unet_seg_v3/train.py

这样可以看到轻量化方案是如何从基础 U-Net 逐步演化到带注意力和深监督版本的。


10. 这个仓库的价值

这个仓库的价值不只是“放了两个模型”,而是形成了两条很有代表性的裂缝分割路线:

  • 一条是全量、高精度、上下文建模更强的 DeepLabV3+ + ResNet101
  • 一条是轻量、高分辨率、部署友好的 U-Net

对于裂缝分割这类任务,这两条路线都非常典型:

  • 前者代表“精度和鲁棒性优先”
  • 后者代表“效率和可部署性优先”

二者结合起来,能让你在不同场景下做更灵活的模型选型,而不是只依赖单一路线。


11. 一句话总结

CrackNet 当前是一套“全量模型 + 轻量模型”并行推进的裂缝分割实验仓库:全量方向以 DeepLabV3+ + ResNet101 追求精度和多尺度建模能力,轻量方向以 U-Net 追求更低成本、更快推理和更强部署友好性,两者共同服务于高质量裂缝语义分割任务。

About

Use such as DeepLab+ + ResNet101, U2Net for semantic segmentation of cracks

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors