AI助力隧道等洞体类场景下水泥基建缺陷检测,基于DeeplabV3Plus开发构建洞体场景下壁体建筑缺陷分割系统

随着智能化硬件的加持,越来越多的场景开始有AI的助力,诸如:道路自动巡检养护、隧道巡检、铁路质检等等,引入AI技术可以大幅降低人工工作量,提升质检的工作效率,在前面的文章中我们已经落地实践开发洞体类场景下的缺陷检测识别系统,后续如果想要进一步分析评估受损程度,对受损区域进一步地细化那就要引入分割模型了,本文的核心思想也就是想要在前文工作的基础上开发构建洞体场景下壁体类建筑缺陷分割系统,首先看下效果图:

本文中使用到的是DeeplabV3Plus模型,下面我们来简单回顾学习下DeeplabV3Plus算法的相关内容:

DeeplabV3Plus是一种用于语义分割任务的深度学习模型,它是DeepLab系列模型的一个改进版本。DeeplabV3Plus结合了空洞卷积(dilated convolution)、全局平均池化(global average pooling)和编码器-解码器结构(encoder-decoder architecture),在图像语义分割任务中取得了优秀的性能。

下面是DeeplabV3Plus模型的算法原理的详细介绍:

  1. 编码器(Encoder):

    • DeeplabV3Plus使用骨干网络(backbone network)作为编码器,如ResNet、Xception等。骨干网络负责从输入图像中提取高级特征表示。
    • 为了增加感受野(receptive field),DeeplabV3Plus采用了空洞卷积(dilated convolution),通过在卷积层中引入空洞(或称为扩张率),有效地扩大了卷积核在输入特征图上的感受野。
    • 空洞卷积提供了多个并行的空洞采样率,从而捕捉不同尺度的上下文信息。
  2. 解码器(Decoder):

    • 为了恢复分辨率并细化分割结果,DeeplabV3Plus引入了解码器。解码器包括一个全局平均池化层(global average pooling)和一系列上采样层。
    • 全局平均池化层用于对编码器输出的特征图进行全局信息的汇聚,将全局上下文信息引入模型。
    • 上采样层通过反卷积(deconvolution)或双线性插值(bilinear interpolation)将特征图的分辨率恢复到原始尺寸,并将细化的特征与编码器的特征进行融合。
  3. Atrous Spatial Pyramid Pooling(ASPP):

    • ASPP模块用于在不同尺度上捕捉上下文信息,它由多个并行的空洞卷积组成,每个空洞卷积具有不同的空洞采样率。
    • ASPP模块可以捕获不同尺度下的物体上下文信息,从而更好地理解图像中的语义信息。
  4. Skip Connections:

    • 为了更好地融合浅层和深层特征,DeeplabV3Plus引入了跳跃连接(skip connections)。
    • 跳跃连接将编码器中的低级特征与解码器中的高级特征进行融合,以提供更丰富的语义信息和细节。
  5. 分类器(Classifier):

    • DeeplabV3Plus使用一个分类器对每个像素进行分类,输出每个像素属于不同类别的概率。
    • 分类器通常是由卷积层和全连接层组成的。

DeeplabV3Plus通过使用空洞卷积、全局平均池化、编码器-解码器结构和ASPP模块等方法,能够在语义分割任务中获得准确的分割结果,并能处理图像中的对象边界和细节。

在前面系列的文章中已经有DeeplabV3Plus模型详细的开发实践应用说明,这里感兴趣的话可以自行移步阅读相关的文章即可,本文就不再对这块详细介绍了,因为主体内容是想要基于DeeplabV3Plus来应用开发构建我们自己的图像分割系统。

简单看下采集构建的数据集:

实例标注效果如下所示:

随机划分数据集,核心代码实现如下所示:

txtDir = "datasets/ImageSets/Segmentation/"
if not os.path.exists(txtDir):
    os.makedirs(txtDir)
train_txt = "datasets/ImageSets/Segmentation/train.txt"
test_txt = "datasets/ImageSets/Segmentation/test.txt"
train_ratio = 0.90


ids_list = [
    one.split(".")[0].strip() for one in os.listdir("datasets/SegmentationClass/")
]
print("ids_list_length: ", len(ids_list))


train_num = int(len(ids_list) * train_ratio)
print("train_num: ", train_num)
train_ids_list = random.sample(ids_list, train_num)
test_ids_list = list(set(ids_list) - set(train_ids_list))
print("test_num: ", len(test_ids_list))


with open(train_txt, "w") as f:
    for one_id in train_ids_list:
        f.write(one_id.strip() + "\n")
with open(test_txt, "w") as f:
    for one_id in test_ids_list:
        f.write(one_id.strip() + "\n")

这是为了能够便捷自动随机划分训练集-测试集编写的脚本,可以很方便地对自己的数据集进行随机划分处理,可以根据自己的实际需要选择使用接口。

其余的操作可以参考官方项目的训练流程即可,这里我就不再赘述了,在前面的博文里面也有提到的。

实例推理效果如下所示:

最后我们对模型的整体性能进行了评估分析,如下所示:

background: mIou-98.99; mPA-99.48
TL: mIou-92.85; mPA-96.62
crack:      mIou-92.61; mPA-95.6
XB: mIou-80.87; mPA-84.8
LH: mIou-91.66; mPA-94.97
REXB:       mIou-88.55; mPA-90.81
SS: mIou-84.17; mPA-91.14
mIoU: 89.96; mPA: 93.35

我们的数据中包含的目标类别共六种,加上背景就是7种。

从上面的mIoUI结果来看效果还是不错的。

感兴趣的话都可以自行尝试实践下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值