1. 引言
裂缝是混凝土结构建筑诸多损伤中最为常见的一种损伤表现,它是结构现场安全性检测监测以及模型试验研究的重要指标。在工程结构现场检测与实验室实验中,目前人工检测仍然是裂缝检测的主要方法。然而,人工检测需要维护人员进行现场勘查、标记、测量,并记录结果。实践表明,人工检测裂缝主观性强、工作强度大、效率低且存在安全隐患,因此人工检测裂缝无法满足工程实践的需求。
近年来,随着数字图像处理技术的发展,利用数字图像处理技术进行结构表面裂缝检测成为有效的检测方法。根据Zaker等人 [1] 的归纳,与裂缝检测相关研究与应用相对较多的有4种,分别基于阈值、边缘、区域、匹配。其中Sobel算子以及Canny算子在裂缝检测中应用最为广泛 [2]。与传统人工检测相比,虽然裂缝的提取过程更加客观,实现了裂缝形态和参数的准确记录,但图像处理过程复杂,且易受环境影响。
随着深度学习的兴起,裂缝检测领域研究逐步由传统的图像处理技术转变为基于深度学习方法进行检测。通过对大量样本进行学习,自动提取裂缝特征,实现裂缝的识别与提取。Hsieh等人 [3] 根据不同目的将基于深度学习的裂缝检测算法分成了3类:图像分类算法、目标检测算法、图像分割算法。Cha等人 [4] 首次利用CNN模型来检测混凝土表面裂缝,结果表明CNN优于传统裂缝检测方法。与分类算法不同,目标检测算法不仅需要判断类别,而且需要定位裂缝的位置。目标检测算法可分为以RCNN [5] 为代表的二阶段算法和以YOLO [6] 为代表的一阶段算法。无论分类算法还是目标检测算法,都无法进行后续裂缝特征参数计算,而图像分割算法则能实现后续裂缝特征参数计算。常用的图像分割算法包括FCN [7] 、SegNet [8] 、PSPNet [9] 、DeepLab [10] 、U-Net [11] 等,Ren等人 [12] 提出了基于SegNet的裂缝检测网络CrackSegNet;于海洋等人 [13] 改进U-Net模型,建立了一种融合残差和注意力机制的道路裂缝检测模型。以U-Net为代表的编码–解码结构深度学习网络模型,其结构适用于细长物体检测,常用于裂缝检测领域。由于实际结构表面裂缝复杂多样,目前裂缝检测也存在着一些难题:预测结果边缘较厚,裂缝轮廓定位不精准;深度学习技术在提取裂缝后,无法更进一步获得裂缝的相关参数。
为了解决上述问题,本文采用深度学习算法与图像处理技术相结合来识别裂缝的形态和计算裂缝几何特征,改进U-Net深度学习算法来提取裂缝形态,后续利用连通域去噪、断裂连接、边缘检测、裂缝细化等图像处理技术来计算裂缝的几何特征,通过实验验证本文检测方法的可行性。
2. 混凝土表面裂缝检测方法
混凝土表面裂缝检测方法主要步骤包括移动智能手机裂缝图像采集、像素标定、基于深度学习算法的裂缝提取、裂缝参数测量。
2.1. 裂缝图像采集
利用移动智能手机对校园里一段混凝土路面进行裂缝图像采集,本次采用如图1所示的设备进行拍摄,用三角支架固定手机,使手机平面与地面平行。为方便后续计算,固定拍摄距离大小,通过多次尝试,最终固定手机与地面距离为40 cm为最佳拍摄距离。

Figure 1. Schematic diagram of crack image acquisition device
图1. 裂缝图像采集装置示意图
2.2. 像素标定
物体的像素尺寸并非实际尺寸,要将图像中的像素尺寸转换为实际尺寸,需要对像素进行标定。本文采用二维码技术 [14] 进行像素标定。如图2所示,将待测裂缝旁放置标准尺寸二维码贴纸作为标识,二维码采用统一尺寸,AB、AC的实际尺寸为25 mm。利用python软件获得AB的像素长度
,AC的像素长度
,理想情况下,AB = AC。为减小手机平面与地面倾斜带来的拍摄误差,取两直角边均值为
(1)
因此可根据实际二维码尺寸与其所成像的像素尺寸获得像素标定值,公式如下:
(2)
其中,D为二维码的实际尺寸,本文为25 mm;d为二维码图像的像素尺寸,单位为pixel。

Figure 2. Schematic diagram of QR code placement
图2. 二维码放置示意图
2.3. 深度学习算法与实现
2.3.1. 裂缝分割整体框架
U-Net是编码-解码结构的图像分割算法。编码阶段即特征提取阶段,结构与VGG16相似,由卷积与池化堆叠而成。解码阶段即加强特征提取阶段,将编码阶段最底层特征逐步上采样还原,与编码阶段特征层进行融合,最终还原到原始图像分辨率大小。U-Net上采样恢复图像分辨率过程中,不仅丢失很多裂缝特征信息,而且还会导致裂缝边缘定位不精准。于是本文在U-Net不足上进行改进。如图3所示,在U-Net基础上进行多级特征融合,防止特征信息丢失。另外增加一个边缘细化分支,用于定位裂缝边缘。
采用多级特征融合,防止特征丢失。将编码阶段五个加强特征层P1~P5进行特征拼接。融合的特征层包含了丰富的细节特征信息的同时,还包含丰富的高级语义信息。
边缘细化分支对预测结果进行边缘细化定位。Canny算子的边缘检测能够得到真实的裂缝边缘特征。本文采用Canny算子得到梯度图像,将梯度图像与多级融合特征层相结合,以细化边缘预测结果。

Figure 3. Structure of crack segmentation network
图3. 裂缝分割网络结构图
2.3.2. 损失函数
裂缝检测是一个二分类任务,常用交叉熵作为损失函数。对于裂缝图像来说,正负样本极不平衡,使用交叉熵损失函数进行网络训练,网络更偏向于背景预测。为降低样本不平衡带来的影响,本文采用加权交叉熵损失函数 [15],定义如下:
(3)
其中,N表示像素数,
表示第i个像素点的标签,
表示第i个像素点的预测结果,
,
和
分别表示裂缝和非裂缝像素数量。
加权交叉熵函数关注的是每个像素的预测情况,没有考虑裂缝预测的整体情况。因此在加权交叉熵函数的基础上引入Dice损失函数 [16],定义如下:
(4)
其中,参数
设置为1,防止分母为0情况。
因此,本文网络模型训练的总体损失函数为:
(5)
2.4. 裂缝参数测量
通过深度学习算法提取裂缝后,采用数字图像处理技术对预测结果进行后处理,计算裂缝的宽度,具体步骤包括连通域去噪、断裂连接、边缘检测、裂缝骨架化、裂缝宽度计算等,如图4所示。

Figure 4. Measurement process of crack parameters
图4. 裂缝参数测量过程
2.4.1. 连通域去噪
如图4(a)所示,首先采用八连通域进行标记,然后计算各标识块的像素数,最后删除像素数小于阈值的连通域。
2.4.2. 断裂连接
基于图像分割的算法预测裂缝,可能出现断裂的情况,断裂处会直接影响后续裂缝宽度的计算。传统的形态学方法处理断裂,可能破坏裂缝的连通性和完整的骨架结构。为了获得完整、连续的裂缝,采用基于KD-tree的裂缝连接算法 [17] 对分割后的裂缝进行连接,结果如图4(b)所示。
2.4.3. 边缘检测
如图4(c)所示,采用Canny算子进行边缘检测。对图像进行灰度化,利用高斯滤波来平滑图像去除噪声,计算梯度幅值和方向,对梯度幅值进行非极大值抑制来消除边误检,用双阈值算法来寻找可能的边界,利用滞后技术来跟踪边界。
2.4.4. 裂缝骨架化
本文采用Zhang-Suen并行细化算法 [18] 来提取裂缝的骨架,如图5所示,中心像素点P1的八邻域图,具体步骤如下:
步骤1:循环所有的裂缝像素并将同时满足以下条件的裂缝像素转为背景像素:
a)
b)
c)
d)
步骤2:满足以下全部条件的像素点也从裂缝像素转为背景像素:
a)
b)
c)
d)
其中,
表示P1中心点周围属于裂缝的像素点的总数,
表示P2~P9~P2顺时针0~1累积出现的次数。
使用Zhang-Suen细化算法,可以得到裂缝的骨架,但提取的骨架还存在一些毛刺、假枝和非单像素宽度问题,如图6所示。这些问题会影响后续裂缝参数的计算,因此需要对细化后的结果再进行处理。

Figure 6. Display of thinning algorithm problems
图6. 细化算法问题展示
非单像素宽度问题指的是非分支点处的连通性大于2。经统计在裂缝骨架上会出现如图7所示的四种非单像素宽度情况。本文采用基于模板匹配的方法来解决非单像素宽度问题。具体步骤为:遍历裂缝骨架,若骨架上的裂缝像素点P1及其八邻域像素满足下面任意一种情况,则将该裂缝像素点P1转化为背景像素点。具体情况为:
1)
且
2)
且
3)
且
4)
且
按照上述算法,可实现裂缝骨架的单像素宽化。
针对裂缝骨架中的毛刺、假枝,本文基于连通域标记方法来进行消除,具体步骤如下:
1) 遍历单像素宽化后的裂缝骨架每一像素点,直到所有裂缝像素点被遍历完毕;
2) 统计当前点P1的八邻域中为裂缝像素的个数,若个数大于2则表明点P1是分支点,记录其P1位置并将P1像素值设置为0;
3) 将P1转化为背景像素后,此时图像中会出现多个连通域,分别计算每个连通域的像素和;
4) 设置一个阈值T,删除连通域像素个数和小于T的连通域,即从裂缝像素转化成背景像素,反正,不作处理;
5) 统计点P1的八邻域范围内的裂缝像素个数,若个数大于1则将点P1像素值从0变为1,反正,不作处理。继续遍历下个裂缝像素。
通过设定阈值,可以消除掉裂缝骨架中较小的毛刺、假枝,同时也能够消除骨架图像中的孤立点。
2.4.5. 裂缝宽度计算
裂缝宽度的大小代表着路面的破损等级,是评价裂缝危害等级的一个重要标准。本文使用正交骨架线法 [19] 来计算裂缝的宽度,如图8所示,两条黑线代表裂缝边缘轮廓,红线为裂缝骨架线,裂缝宽度计算步骤如下:
步骤1:计算骨架线上任意像素点
的法线梯度。
为了计算
点处的法线梯度,首先需要计算
与之相邻的两个裂缝像素点
、
拟合的抛物线函数:
,然后求
点处在抛物线上的一阶偏导数,即
的斜率
。
的斜率与法线梯度互为负倒数,于是
的法线梯度可由公式(6)计算出:
(6)
步骤2:根据
处的法线长度计算该点的裂缝宽度。
的法线
与裂缝边缘相交的两点距离即为
处的裂缝宽度。如图8中,计算两点之间的距离即红色直线便是点
的裂缝宽度。
步骤3:计算骨架上每个像素点的裂缝宽度,得到裂缝宽度的平均值和最大值。

Figure 8. Schematic diagram of crack width calculation
图8. 裂缝宽度计算示意图
3. 实验结果与分析
3.1. 评价指标
为了评估我们的工作,我们在分割任务中引入了常见的评估指标 [20] :Precision,Recall,F1-score,PAM,PA和MIou,其公式如下:
(7)
(8)
(9)
(10)
(11)
(12)
其中,TP、FP、TN、FN分别表示真阳性、假阳性、真阴性、假阴性。
3.2. 裂缝分割实验结果与分析
本文基于python的深度学习框架tensorflow2上进行实验。模型训练和预测在Linux系统上完成。训练过程中,设置早期停止,批处理大小设置为16,训练周期设置为200,采用Adam优化器优化网络模型。
表1给出了算法的评价指标结果,与U-Net相比,改进后的算法检测精度更高,其平均精度达到了90.08%,验证了改进后的算法的有效性和优越性。

Table 1. Quantitative evaluation results of algorithm
表1. 算法定量评价结果
本文算法进行训练后,在测试集中进行裂缝检测,部分结果如图9所示,可以看出本文提出的裂缝分割算法能够完整地识别出裂缝。

Figure 9. Crack identification results of the algorithm in this paper
图9. 本文算法裂缝识别结果
3.3. 裂缝宽度检测
为验证本文裂缝宽度计算方法的有效性,对图9中的裂缝识别结果进行宽度检测,并使用裂缝测宽仪测量裂缝真实值,测量精度为0.01 mm。为直观显示裂缝宽度的变化情况,对图9裂缝分割F沿裂缝骨架的方向计算每一个裂缝测量点的裂缝宽度,得到了裂缝宽度分布曲线,如图10所示。
采用本文宽度测量方法,计算图9裂缝图像裂缝宽度最大值和平均值,裂缝宽度计算结果如表2所示。从表中可以看出,本文计算裂缝宽度结果与实测值总体差距不大,检测结果与实测结果最大宽度和平均宽度相对误差都10%以内,证明本文宽度检测方法的有效性。

Table 2. Crack width test results
表2. 裂缝宽度检测结果
4. 结论
针对现有裂缝检测研究上面的不足,本文提出了一种基于深度学习与图像处理技术相结合的混凝土表面裂缝智能识别方法,并进行了实验验证。
1) 对U-Net深度学习图像分割算法不足进行改进来提取裂缝。采用多级特征融合,防止特征信息丢失,添加边缘细化分支对预测结果进行边缘细化定位。
2) 为提高裂缝参数检测精度,深度学习算法提取裂缝后进行了一系列的图像处理技术,宽度计算结果与真实值对比显示:裂缝宽度最大值与平均值相对误差小于10%,属于误差范围内,验证了本方法的有效性与可行性。
3) 在后续工作中可以考虑利用深度学习的方法来计算裂缝的宽度,简化计算量的同时也避免背景复杂度的影响。