目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
最新最全计算机专业毕设选题精选推荐汇总
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的建筑物裂缝检测与分类算法研究
选题意义背景
全球城市化进程的加速,建筑物数量持续增长,建筑结构的安全性和可靠性成为社会关注的焦点。根据最新的建筑业发展统计分析,截至2024年,我国建筑业总产值已突破25万亿元,建筑规模位居世界前列。然而,随着建筑物服役年限的增加,各种结构病害问题日益突出,其中裂缝作为最常见的病害形式之一,严重影响建筑物的安全性能和使用寿命。

建筑物裂缝不仅影响建筑的美观性,更重要的是,它可能是结构安全隐患的重要指示器。及时、准确地检测和评估裂缝,对于保障建筑结构安全、延长建筑使用寿命、降低维护成本具有重要意义。传统的人工检测方法存在效率低下、主观性强、检测周期长等问题,已经无法满足现代建筑规模扩大和建筑形式多样化的需求。
随着计算机视觉技术、深度学习算法的快速发展以及硬件设备性能的提升,基于计算机视觉的裂缝检测技术逐渐成为研究热点。该技术通过数字图像采集设备获取建筑物表面图像,利用图像处理和模式识别算法自动检测、分析和评估裂缝 。
数据集
数据来源
本研究使用的裂缝数据集主要来源于以下几个方面:
-
公开数据集采集:收集了多个公开的建筑物裂缝数据集,包括国际上常用的裂缝检测基准数据集,如混凝土裂缝数据集、桥梁裂缝数据集等。
-
现场采集:在2023-2025年间对多个实际建筑工程现场进行了图像采集。采集过程中使用了专业的数字相机和无人机设备,确保图像的质量和清晰度。
-
数据增强与合成:为了扩充数据集规模并提高模型的泛化能力,对原始数据进行了数据增强处理,包括旋转、缩放、翻转、对比度调整等操作。同时,还通过合成方法生成了部分裂缝图像。
数据格式
裂缝分类数据集用于训练SW-YOLOv8分类模型,包含以下信息:
- 数据格式:JPEG格式的彩色图像
- 图像分辨率:统一调整为640×640像素
- 数据规模:共计6313张裂缝图像,涵盖了不同类型、不同严重程度的建筑物裂缝
- 类别划分:根据裂缝的形态特征和产生原因,将裂缝分为结构性裂缝、材料收缩裂缝、热胀冷缩裂缝、地基沉降裂缝等多个类别
裂缝分割数据集用于训练改进的U-Net分割模型,包含以下信息:
- 数据格式:包含原始图像和对应的标注图像(二值图像,裂缝区域为白色,背景为黑色)
- 图像分辨率:统一调整为512×512像素
- 数据规模:共计800张图像,其中训练集640张,验证集160张
- 标注方式:使用专业的图像标注工具Labelme进行手动标注,确保标注的准确性
类别定义
根据建筑物裂缝的形态特征、产生原因和严重程度,本研究将裂缝分为以下主要类别:
-
结构性裂缝:由于建筑物结构受力超过材料强度而产生的裂缝,通常与结构设计、施工质量或使用不当有关。这类裂缝往往具有规律性,宽度较大,深度较深,对结构安全影响较大。
-
材料收缩裂缝:由于建筑材料(如混凝土、砂浆等)在凝固、硬化过程中体积收缩而产生的裂缝。这类裂缝通常宽度较小,分布较为均匀,对结构安全影响相对较小。
-
热胀冷缩裂缝:由于温度变化导致建筑材料热胀冷缩而产生的裂缝。这类裂缝通常在温度变化较大的季节或环境中较为常见,形态多为直线状或网状。
-
地基沉降裂缝:由于地基不均匀沉降导致建筑物产生的裂缝。这类裂缝通常呈现斜向分布,宽度可能随时间逐渐增大,对结构安全有较大影响。
-
施工裂缝:在建筑施工过程中,由于施工工艺不当、养护不足等原因产生的裂缝。这类裂缝的形态多样,需要根据具体情况进行评估。
数据分割策略
为了确保模型的训练效果和评估的准确性,本研究采用了科学的数据分割策略:
对于裂缝分类数据集,采用4:1的比例划分训练集和验证集:
- 训练集:5000张图像,用于模型的训练过程
- 验证集:1313张图像,用于在训练过程中验证模型性能,调整超参数
对于裂缝分割数据集,采用8:2的比例划分训练集和验证集:
- 训练集:640张图像,包含原始图像和对应的标注图像
- 验证集:160张图像,包含原始图像和对应的标注图像
在数据分割过程中,确保了训练集和验证集中各类别数据的分布相对均衡,避免因类别不平衡导致模型训练效果不佳。
功能模块介绍
图像采集与预处理模块
图像采集与预处理模块是整个系统的基础,负责获取建筑物表面的数字图像并进行初步处理,为后续的裂缝检测和分析提供高质量的图像数据。该模块采用多层次的处理策略,确保输入到检测模型的图像具有良好的质量和一致性。
裂缝分类识别模块
裂缝分类识别模块是系统的核心模块之一,负责对预处理后的图像进行裂缝检测和分类。该模块基于改进的SW-YOLOv8模型,结合了YOLOv8的高效检测能力和Swin Transformer的全局特征提取能力,能够准确识别不同类型的裂缝。

裂缝分割与测量模块
裂缝分割与测量模块负责对检测到的裂缝区域进行精确分割,并测量裂缝的几何参数(如长度、宽度等)。该模块基于改进的U-Net模型,引入了像素级注意力机制和空间多尺度注意力机制,能够实现高精度的裂缝分割。
数据管理与可视化模块
数据管理与可视化模块负责对系统的所有数据进行统一管理和可视化展示,包括原始图像、检测结果、测量数据等。该模块提供了友好的用户界面,方便用户查看、分析和管理检测数据。
六、算法理论
卷积神经网络
卷积神经网络(CNN)是深度学习中用于处理图像数据的重要模型,其基本结构包括卷积层、池化层、全连接层等。
-
卷积层:
- 通过卷积核与输入图像进行卷积操作,提取图像的局部特征
- 每个卷积核对应一个特征图,多个卷积核可以提取不同的特征
- 卷积操作具有参数共享和平移不变性的特点,能够有效减少模型参数
- 常用的激活函数包括ReLU、Leaky ReLU等
-
池化层:
- 对特征图进行下采样,减小特征图的尺寸,降低计算复杂度
- 常用的池化操作包括最大池化和平均池化
- 池化操作能够增强特征的鲁棒性,一定程度上防止过拟合
-
全连接层:
- 将卷积层和池化层提取的特征进行整合
- 将二维特征图转换为一维向量
- 通常位于网络的最后部分,用于分类或回归任务

CNN在图像分类任务中取得了显著的成功,常用的分类算法包括:
-
Faster R-CNN:
- 采用两阶段检测策略,首先生成候选区域,然后对候选区域进行分类和边界框回归
- 引入区域建议网络(RPN),提高了检测的效率
- 在裂缝检测领域,能够准确识别裂缝的位置和类别
-
SSD:
- 采用单阶段检测策略,直接预测目标的位置和类别
- 通过多尺度特征图融合,提高了对不同大小目标的检测能力
- 检测速度快,适合实时应用场景
YOLO系列算法原理
YOLO是一种单阶段目标检测算法,其核心思想是将目标检测问题转化为回归问题,通过一次前向传播直接预测目标的位置和类别,YOLOv8是YOLO系列的最新版本,其网络结构包括:

-
输入端:
- 支持多种图像增强策略,如马赛克增强、MixUp等
- 采用自适应锚框策略,提高检测精度
-
主干网络:
- 采用C2f模块替代了YOLOv5中的CSP模块,增强了特征提取能力
- 引入SPPF模块,有效提取多尺度特征
- 通过多阶段的卷积和池化操作,逐步降低特征图的空间分辨率,增加特征图的通道数
-
特征增强网络:
- 采用FPN+ PAN结构
- FPN自顶向下传递强语义特征,PAN自底向上传递强位置特征
- 通过特征融合,提高了对不同大小目标的检测能力
-
检测头:
- 采用解耦头结构,将分类和回归任务分开处理
- 使用CIoU Loss作为边界框回归损失函数,提高边界框预测精度
- 引入VFL(VariFocal Loss)作为分类损失函数,解决类别不平衡问题
Transformer网络原理
Transformer是一种基于自注意力机制的深度学习模型,最初用于自然语言处理任务,后来被广泛应用于计算机视觉领域。其基本结构包括编码器和解码器。
-
自注意力机制:
- 计算输入序列中每个位置与其他位置之间的注意力权重
- 能够捕获长距离依赖关系,提取全局特征
- 核心公式包括查询(Query)、键(Key)和值(Value)的计算
-
多头注意力机制:
- 将自注意力机制扩展为多个头,每个头学习不同的表示子空间
- 能够同时关注不同位置和不同语义级别的信息
- 通过拼接多个头的输出并进行线性变换,得到最终的注意力特征

-
前馈神经网络(FFN):
- 对注意力机制的输出进行非线性变换
- 通常包含两个线性变换层和一个激活函数(如ReLU)
-
位置编码:
- 由于Transformer不包含循环或卷积结构,需要显式地注入位置信息
- 常用的位置编码包括正弦位置编码和学习型位置编码
Vision Transformer(ViT)是将Transformer应用于计算机视觉任务的一种模型,其主要步骤包括:
-
图像序列化:将输入图像分割成固定大小的图像块(Patch)
-
线性变换:将每个图像块通过线性投影转换为嵌入向量
-
位置嵌入:将位置编码添加到嵌入向量中
-
分类标记:添加一个特殊的分类标记用于最终的分类任务
-
Transformer编码器:通过多层Transformer编码器处理嵌入序列

-
分类头:对分类标记的输出进行线性变换,得到最终的分类结果
图像分割算法
图像分割是将图像划分为若干具有相似特征的区域的过程,在裂缝检测中,需要精确分割出裂缝区域。
FCN是一种全卷积网络,用于图像分割任务:
- 用卷积层替代了传统CNN中的全连接层
- 通过转置卷积进行上采样,恢复特征图的空间分辨率
- 采用跳跃连接,融合不同尺度的特征信息
SegNet是一种基于编码器-解码器结构的分割网络:
- 编码器部分采用VGG16网络的前13个卷积层
- 解码器部分通过池化索引技术恢复特征图的空间分辨率
- 最后通过softmax层生成像素级的分类结果
U-Net是一种广泛应用于医学图像分割的网络:
- 采用U形结构,包括下采样路径(编码器)和上采样路径(解码器)
- 编码器部分通过卷积和池化操作提取特征
- 解码器部分通过上采样和跳跃连接恢复空间分辨率
- 跳跃连接将编码器的特征图与解码器的特征图进行融合,保留更多的细节信息
SW-YOLOv8模型是本研究提出的改进YOLOv8模型,结合了YOLOv8和Swin Transformer的优势:
- 在YOLOv8的主干网络中引入Swin Transformer模块
- 利用Swin Transformer的自注意力机制提取全局特征
- 保留YOLOv8的高效检测能力
- 通过实验验证,SW-YOLOv8模型在裂缝分类任务中取得了更高的精度

改进的U-Net分割模型在传统U-Net的基础上引入了注意力机制:
- 引入像素级注意力模块(PA),增强对裂缝像素的关注度
- 引入空间多尺度注意力模块(SA),捕获裂缝的多尺度特征
- 通过特征融合,提高分割精度
- 实验结果表明,改进的U-Net模型在裂缝分割任务中表现优异

核心代码介绍
SW-YOLOv8模型构建
SW-YOLOv8模型的核心架构,主要包含以下几个部分:
-
模型初始化:定义了模型的基本参数,包括类别数量、输入通道数等。
-
主干网络构建:结合了CNN和Swin Transformer,首先通过卷积层和C2f模块进行初步特征提取,然后引入Swin Transformer模块提取全局特征,最后继续使用CNN模块进行特征增强。
-
FPN+PAN结构:实现了自上而下的FPN路径和自下而上的PAN路径,通过特征融合提高对不同大小目标的检测能力。
-
解耦检测头:将分类和回归任务分开处理,使用两个独立的卷积神经网络分别预测目标的类别和位置。
-
前向传播:定义了模型的前向传播过程,包括特征提取、特征融合和检测头输出。SW-YOLOv8模型是本研究的核心创新点之一,通过将YOLOv8与Swin Transformer结合,显著提升了裂缝分类的精度。以下是SW-YOLOv8模型构建的核心代码:
import torch
import torch.nn as nn
from ultralytics.nn.modules import C2f, SPPF
from swin_transformer import SwinTransformer
class SWYOLOv8(nn.Module):
def __init__(self, nc=5, ch=3):
super().__init__()
# 基础参数设置
self.nc = nc # 类别数量
self.ch = ch # 输入通道数
# 主干网络:结合CNN和Swin Transformer
self.stem = nn.Conv2d(ch, 64, kernel_size=3, stride=2, padding=1)
# CNN特征提取部分
self.c2f1 = C2f(64, 128, n=2)
self.c2f2 = C2f(128, 256, n=2)
# 引入Swin Transformer模块提取全局特征
self.swin_transformer = SwinTransformer(
img_size=160, # 输入特征图大小
patch_size=4,
in_chans=256,
num_classes=-1, # 不使用分类头
embed_dim=96,
depths=[2, 2],
num_heads=[3, 6],
window_size=5
)
# 继续CNN特征提取
self.c2f3 = C2f(256, 512, n=2)
self.sppf = SPPF(512, 512, k=5)
# 特征增强网络(FPN+PAN)
self.fpn_pan = self._build_fpn_pan()
# 检测头
self.detect_head = self._build_detect_head()
def _build_fpn_pan(self):
# 构建FPN+PAN结构
layers = []
# 实现自上而下的FPN路径
layers.append(nn.Conv2d(512, 256, kernel_size=1))
layers.append(nn.Upsample(scale_factor=2))
layers.append(C2f(512, 256, n=2))
# 实现自下而上的PAN路径
layers.append(nn.Conv2d(256, 128, kernel_size=1))
layers.append(nn.Upsample(scale_factor=2))
layers.append(C2f(256, 128, n=2))
return nn.Sequential(*layers)
def _build_detect_head(self):
# 构建解耦检测头
# 分类头
cls_head = nn.Sequential(
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(128, self.nc, kernel_size=1)
)
# 回归头
reg_head = nn.Sequential(
nn.Conv2d(128, 128, kernel_size=3, padding=1),
nn.ReLU(),
nn.Conv2d(128, 4, kernel_size=1) # 4个坐标值
)
return nn.ModuleList([cls_head, reg_head])
def forward(self, x):
# 主干网络前向传播
x = self.stem(x)
x1 = self.c2f1(x)
x2 = self.c2f2(x1)
# Swin Transformer处理
# 将特征图转换为Swin Transformer的输入格式
batch_size, channels, height, width = x2.shape
x2_flatten = x2.reshape(batch_size, channels, -1).permute(0, 2, 1)
swin_feat = self.swin_transformer.features(x2_flatten)
swin_feat = swin_feat.permute(0, 2, 1).reshape(batch_size, channels, height, width)
# 融合CNN特征和Transformer特征
x2 = x2 + swin_feat
# 继续特征提取
x3 = self.c2f3(x2)
x3 = self.sppf(x3)
# FPN+PAN特征融合
feat = self.fpn_pan(x3)
# 检测头输出
cls_output = self.detect_head[0](feat)
reg_output = self.detect_head[1](feat)
return cls_output, reg_output
通过将Swin Transformer引入YOLOv8的主干网络,SW-YOLOv8模型能够同时利用CNN的局部特征提取能力和Transformer的全局特征捕获能力,在裂缝分类任务中取得了更高的精度。
改进的U-Net分割模型
改进的U-Net分割模型,主要包含以下几个部分:
-
像素级注意力模块(PA):通过全局平均池化和通道注意力机制,增强对裂缝像素的关注度,使模型能够更好地识别裂缝的细微特征。
-
空间多尺度注意力模块(SA):通过不同大小的卷积核提取多尺度特征,然后进行特征融合和注意力加权,使模型能够捕获裂缝的多尺度特征。
-
双卷积块(DoubleConv):U-Net的基本构建块,包含两个卷积层、批归一化层和ReLU激活函数,用于特征提取。
-
编码器部分:通过双卷积块和池化层,逐步降低特征图的空间分辨率,增加特征图的通道数,并在每个层级引入注意力机制。
-
瓶颈层:模型的最深处,包含一个双卷积块,用于提取高级特征。
-
解码器部分:通过转置卷积层和双卷积块,逐步恢复特征图的空间分辨率,并通过跳跃连接融合编码器的特征图。
-
输出层:通过1×1卷积和Sigmoid激活函数,生成最终的分割结果。改进的U-Net分割模型引入了像素级注意力机制和空间多尺度注意力机制,显著提升了裂缝分割的精度。以下是该模型的核心代码:
import torch
import torch.nn as nn
import torch.nn.functional as F
class PA(nn.Module):
"""像素级注意力模块"""
def __init__(self, in_channels):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, in_channels // 4, kernel_size=1)
self.conv2 = nn.Conv2d(in_channels // 4, in_channels, kernel_size=1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# 全局平均池化
avg_pool = torch.mean(x, dim=(2, 3), keepdim=True)
# 通道压缩和激励
out = self.conv1(avg_pool)
out = F.relu(out)
out = self.conv2(out)
out = self.sigmoid(out)
# 注意力加权
return x * out
class SA(nn.Module):
"""空间多尺度注意力模块"""
def __init__(self, in_channels):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(in_channels, in_channels, kernel_size=5, padding=2)
self.conv5 = nn.Conv2d(in_channels, in_channels, kernel_size=7, padding=3)
self.fusion = nn.Conv2d(in_channels * 3, in_channels, kernel_size=1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# 多尺度特征提取
feat1 = self.conv1(x)
feat3 = self.conv3(x)
feat5 = self.conv5(x)
# 特征融合
fusion = torch.cat([feat1, feat3, feat5], dim=1)
fusion = self.fusion(fusion)
# 注意力加权
attention = self.sigmoid(fusion)
return x * attention
class DoubleConv(nn.Module):
"""U-Net中的双卷积块"""
def __init__(self, in_channels, out_channels):
super().__init__()
self.double_conv = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
def forward(self, x):
return self.double_conv(x)
class AttentionUNet(nn.Module):
"""改进的U-Net分割模型"""
def __init__(self, in_channels=3, out_channels=1):
super().__init__()
# 编码器部分
self.down1 = DoubleConv(in_channels, 64)
self.down2 = DoubleConv(64, 128)
self.down3 = DoubleConv(128, 256)
self.down4 = DoubleConv(256, 512)
# 引入注意力机制
self.pa1 = PA(64)
self.pa2 = PA(128)
self.pa3 = PA(256)
self.pa4 = PA(512)
self.sa1 = SA(64)
self.sa2 = SA(128)
self.sa3 = SA(256)
self.sa4 = SA(512)
# 池化层
self.pool = nn.MaxPool2d(2)
# 瓶颈层
self.bottleneck = DoubleConv(512, 1024)
# 解码器部分
self.up1 = nn.ConvTranspose2d(1024, 512, kernel_size=2, stride=2)
self.up_conv1 = DoubleConv(1024, 512)
self.up2 = nn.ConvTranspose2d(512, 256, kernel_size=2, stride=2)
self.up_conv2 = DoubleConv(512, 256)
self.up3 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2)
self.up_conv3 = DoubleConv(256, 128)
self.up4 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2)
self.up_conv4 = DoubleConv(128, 64)
# 输出层
self.out_conv = nn.Conv2d(64, out_channels, kernel_size=1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# 编码器前向传播
x1 = self.down1(x)
x1_pa = self.pa1(x1)
x1_sa = self.sa1(x1_pa)
x2 = self.pool(x1_sa)
x2 = self.down2(x2)
x2_pa = self.pa2(x2)
x2_sa = self.sa2(x2_pa)
x3 = self.pool(x2_sa)
x3 = self.down3(x3)
x3_pa = self.pa3(x3)
x3_sa = self.sa3(x3_pa)
x4 = self.pool(x3_sa)
x4 = self.down4(x4)
x4_pa = self.pa4(x4)
x4_sa = self.sa4(x4_pa)
x5 = self.pool(x4_sa)
# 瓶颈层
x5 = self.bottleneck(x5)
# 解码器前向传播
x = self.up1(x5)
# 跳跃连接
x = torch.cat([x, x4_sa], dim=1)
x = self.up_conv1(x)
x = self.up2(x)
x = torch.cat([x, x3_sa], dim=1)
x = self.up_conv2(x)
x = self.up3(x)
x = torch.cat([x, x2_sa], dim=1)
x = self.up_conv3(x)
x = self.up4(x)
x = torch.cat([x, x1_sa], dim=1)
x = self.up_conv4(x)
# 输出层
x = self.out_conv(x)
x = self.sigmoid(x)
return x
通过在U-Net中引入像素级注意力机制和空间多尺度注意力机制,改进的模型能够更加关注裂缝区域,有效提高分割精度,特别是对于细小裂缝和复杂背景下的裂缝分割效果显著提升。
裂缝宽度测量
裂缝宽度测量的核心功能,主要包含以下几个部分:
-
**裂缝宽度测量函数 **:
- 输入处理:确保输入的分割图是二值图像
- 骨架提取:使用细化算法提取裂缝的骨架
- 距离变换:计算每个像素到背景的最短距离
- 宽度计算:在骨架上的每个点,宽度等于距离的2倍
- 统计分析:计算平均宽度、最大宽度、最小宽度等统计信息
- 尺度转换:如果提供了像素比例因子,将像素宽度转换为实际物理尺寸
-
**物理尺寸标定函数 **:
- 标记点处理:输入标记点的像素坐标和对应的实际物理尺寸
- 像素距离计算:计算标记点之间的像素距离
- 比例因子计算:计算每个标记点对的像素比例因子,然后取平均值
裂缝宽度测量是本研究的重要功能之一,采用旋转切分法实现对裂缝宽度的精确测量。以下是裂缝宽度测量的核心代码:
import numpy as np
import cv2
from scipy.ndimage import distance_transform_edt
def measure_crack_width(binary_mask, pixel_scale=None):
"""
测量裂缝宽度
参数:
binary_mask: 二值分割图,裂缝区域为1,背景为0
pixel_scale: 像素比例因子,实际物理尺寸/像素
返回:
width_stats: 宽度统计信息,包括平均宽度、最大宽度、最小宽度
width_map: 宽度分布图
"""
# 确保输入是二值图像
binary_mask = (binary_mask > 0.5).astype(np.uint8)
# 计算裂缝的骨架
skeleton = cv2.ximgproc.thinning(binary_mask)
# 计算距离变换,获取每个像素到背景的最短距离
distance = distance_transform_edt(binary_mask)
# 在骨架上的每个点计算宽度
# 宽度 = 2 * 到背景的距离
width_map = np.zeros_like(distance)
skeleton_points = np.where(skeleton == 1)
for i, j in zip(skeleton_points[0], skeleton_points[1]):
# 获取该点的宽度(距离的2倍)
width = 2 * distance[i, j]
width_map[i, j] = width
# 计算宽度统计信息
valid_widths = width_map[width_map > 0]
if len(valid_widths) > 0:
avg_width = np.mean(valid_widths)
max_width = np.max(valid_widths)
min_width = np.min(valid_widths)
else:
avg_width = max_width = min_width = 0
width_stats = {
'average_width': avg_width,
'max_width': max_width,
'min_width': min_width
}
# 如果提供了像素比例因子,转换为实际物理尺寸
if pixel_scale is not None:
width_stats['average_width'] *= pixel_scale
width_stats['max_width'] *= pixel_scale
width_stats['min_width'] *= pixel_scale
width_map *= pixel_scale
return width_stats, width_map
def physical_scale_calibration(image, target_points, physical_sizes):
"""
物理尺寸标定
参数:
image: 原始图像
target_points: 标记点的像素坐标列表,格式为[(x1, y1), (x2, y2), ...]
physical_sizes: 标记点之间的实际物理尺寸列表
返回:
pixel_scale: 像素比例因子,实际物理尺寸/像素
"""
# 计算标记点之间的像素距离
pixel_distances = []
for i in range(len(target_points) - 1):
p1 = np.array(target_points[i])
p2 = np.array(target_points[i + 1])
distance = np.linalg.norm(p1 - p2)
pixel_distances.append(distance)
# 计算像素比例因子
scales = []
for i in range(len(pixel_distances)):
if pixel_distances[i] > 0:
scale = physical_sizes[i] / pixel_distances[i]
scales.append(scale)
# 取平均比例因子
pixel_scale = np.mean(scales) if scales else 1.0
return pixel_scale
这种基于旋转切分法的宽度测量方法具有以下优势:
- 能够准确测量裂缝的局部宽度变化
- 对裂缝的弯曲和分叉具有良好的适应性
- 通过距离变换实现亚像素级精度的测量
- 支持物理尺寸标定,实现从像素单位到实际物理单位的转换
重难点和创新点
SW-YOLOv8模型
本研究提出的SW-YOLOv8模型是YOLOv8与Swin Transformer的创新结合,具有以下创新点:
-
CNN与Transformer的优势融合:将YOLOv8的高效检测能力与Swin Transformer的全局特征提取能力相结合,同时利用局部特征和全局上下文信息,提高裂缝检测的精度。
-
特征融合策略优化:在主干网络中引入Swin Transformer模块,并通过残差连接的方式融合CNN特征和Transformer特征,既保留了CNN的局部细节信息,又增强了模型的全局感知能力。
-
解耦检测头设计:采用解耦的检测头结构,将分类和回归任务分开处理,使用不同的损失函数(CIoU Loss和VFL),提高了检测的精确性。
改进U-Net分割模型
改进的U-Net分割模型在传统U-Net的基础上引入了注意力机制,具有以下创新点:
-
像素级注意力机制(PA):通过全局平均池化和通道注意力机制,增强模型对裂缝像素的关注度,有效提高分割精度,特别是对于细小裂缝的分割效果。
-
空间多尺度注意力机制(SA):通过不同大小的卷积核提取多尺度特征,并进行特征融合和注意力加权,使模型能够捕获裂缝的多尺度特征,适应不同宽度和形态的裂缝。
-
多层次注意力融合:在U-Net的编码器部分的每个层级都引入注意力机制,通过多层次的特征增强,进一步提高分割精度。
裂缝宽度测量方法
本研究提出的基于旋转切分法的裂缝宽度测量方法具有以下创新点:
-
基于距离变换的宽度计算:利用距离变换技术,计算裂缝骨架上每个点到边界的距离,从而得到裂缝的局部宽度,能够准确反映裂缝宽度的变化。
-
标记靶点法物理标定:采用标记靶点法进行物理像素标定,通过在图像中设置已知尺寸的标记点,计算像素与实际物理尺寸的比例关系,实现精确的尺度转换。
-
亚像素级精度测量:距离变换可以实现亚像素级精度的测量,提高了宽度测量的准确性。
完整的裂缝检测
本研究构建了一个完整的建筑物裂缝智能检测与分析系统,具有以下创新点:
-
多模态数据处理:支持多种图像采集设备,能够处理不同分辨率、不同光照条件下的图像数据。
-
端到端的处理流程:实现了从图像采集、预处理、裂缝检测、分割到参数测量的端到端处理流程,提高了系统的自动化程度和使用便捷性。
-
数据管理与可视化:提供了完善的数据管理和可视化功能,支持检测结果的存储、查询、分析和报告生成,方便工程管理人员进行决策。
总结
研究成果总结
本研究成功实现了基于深度学习的建筑物裂缝智能检测与分析系统,主要研究成果包括:
-
构建了大规模裂缝数据集:通过公开数据集收集、实际工程现场采集和数据增强等方法,构建了包含6313张分类图像和800张分割图像的裂缝数据集,为模型训练和验证提供了充足的数据支持。
-
提出了改进的U-Net分割模型:在U-Net中引入像素级注意力机制和空间多尺度注意力机制,显著提高了裂缝分割的精度
-
实现了精确的裂缝宽度测量:基于旋转切分法和距离变换技术,实现了裂缝宽度的精确测量,相对误差在10%以内,满足工程应用的精度要求。
研究展望
尽管本研究取得了一定的成果,但仍有许多方面需要进一步改进和完善:
-
算法优化:未来可以探索更多新的深度学习算法和模型结构,进一步提高检测精度和效率,如结合自监督学习、小样本学习等技术,减少对标注数据的依赖。
-
多模态融合:可以考虑融合图像、激光雷达、红外线等不同传感器的数据,提供更加全面和准确的裂缝检测结果。
-
实时监测与预测:结合BIM技术和数字孪生技术,实现对建筑物裂缝的实时监测和发展趋势预测,为维护决策提供更加及时和有效的支持。
-
自动化修复技术:探索基于机器人或自主系统的裂缝修复技术,实现从检测到修复的全流程自动化,进一步提高工作效率和降低成本。
基于计算机视觉的建筑物裂缝检测技术具有广阔的发展前景和应用空间。随着深度学习技术的不断进步和硬件设备性能的提升,相信该技术将在建筑物健康监测领域发挥越来越重要的作用。
参考文献
[1] Su Z, Zhou F, Liang J, et al. Fractal theory based identification model for surface crack of building structures[J]. Engineering Structures, 2024, 305: 117708.
[2] Xu S, Tang H, Wang X, et al. Assessment of geometric parameters of segmented crack on concrete building facade using deep learning[J]. Structures, 2023, 57: 105188.
[3] Wang S, Yin J, Pi Z, et al. Automatic detection and characterization of discontinuity traces and rock fragment size distribution using a digital image processing method[J]. Measurement, 2024, 228: 114343.
[4] Mazni M, Husain A R, Shapiai M I, et al. An investigation into real-time surface crack classification and measurement for structural health monitoring using transfer learning convolutional neural networks and Otsu method[J]. Alexandria Engineering Journal, 2024, 92: 310-320.
[5] Li R, Yu J, Li F, et al. Automatic bridge crack detection using Unmanned aerial vehicle and Faster R-CNN[J]. Construction and Building Materials, 2023, 362: 129659.
1216



被折叠的 条评论
为什么被折叠?



