阎卫东,石日新,王井利,刘国奇,马 健
(沈阳建筑大学交通与测绘工程学院,辽宁 沈阳 110168)
由于年久失修、气候干扰、人为损伤等原因,古建筑中的木结构会发生各种形式的破坏,其中裂缝是最常见的损伤形式[1]。且随着时间推移会出现不可逆转的结构损坏,甚至造成建筑物坍塌,因此对古建筑木结构裂缝检测具有重要意义。
传统人工测量存在工作难度大、效率低等问题,因此学者们提出了一系列基于图像识别深度学习的方法来检测图像中的裂缝,其中以区域分割方法最为经典[2-3]。R.Girshick[4]在Faster R-CNN网络中添加预测物体掩码信息的分支,K.He等[5]提出了经典的Mask R-CNN 实例分割网络,实现了图像的目标检测。马健等[6]使用YOLOv5来识别图像中的裂缝。与YOLO等目标检测网络相比,Mask R-CNN包含的“实例”信息可以更精确地刻画裂缝的区域,而不仅仅是裂缝处的包围盒。韩士伟等[7-8]利用三维重建技术将古建筑的整体结构、表面纹理等信息进行重建,获得裂缝检测工作中所需要的裂缝大小、深度等具体信息。韦虎等[9-10]利用双目立体视觉与多视几何技术恢复古建筑表面的三维结构与纹理,精度提高,但计算速度慢。阮競芸等[11-13]使用深度相机拍摄多视角深度图,利用立体匹配与特征匹配技术计算各视角下的相机位姿,再将深度图融合到三维空间,其特点是速度快,可以实时地完成重建,更适合大规模古建筑的三维重建工作,但其精度较低。S.Izadi等[14]使用栅格化的方式表示整个三维场景,利用高速的GPU设备,通过截断距离函数计算空间中每一个栅格到其最近表面的距离。A.Dai等[15]在M.Nieβner 等[16]提出的Voxel Hashing算法基础上改进,提出了Bundle Fusion三维重建系统,引入从局部到全局的相机位姿优化策略,在重建大型建筑上具有更好的鲁棒性,但此类三维重建方法,仅生成一个由点云构造的三维模型,不能识别分析模型中包含的裂缝信息。J.Mccormac 等[17-19]提出将图像识别和三维重建联合的方法,利用CNN网络识别场景中不同语义的区域,可将识别到的物体融合到三维模型中。这类方法重建精度较低,很难将裂缝刻画清晰。
综合以上研究,笔者使用Mask R-CNN实例分割网络提取古建筑木结构表面的裂缝信息,使用基于Bundle Fusion系统的三维重建框架将裂缝信息与图像信息应用到三维重建中,建立一个含有裂缝信息的古建筑三维结构模型。进而提出一个裂缝分析方法,在生成含裂缝信息的三维模型后,计算裂缝的长度和深度。将Voxel Hashing算法中体素的结构推广到不同分辨率的应用场景中,以实现速度快、精度高的三维重建。
图1描绘了裂缝识别与多分辨率三维重建方法系统框架,包括裂缝识别与相机位姿优化模块、三维重建模块和裂缝分析模块。
图1 系统框架Fig.1 The framework of system
图2为裂缝识别与相机位姿优化模块,该模块的输入为一个RGBD视频流,裂缝识别与相机位姿优化在此模块的两个线程中并行执行。
图2 裂缝识别与相机位姿优化模块Fig.2 The crack recognition and camera pose optimization module
1.1.1 相机位姿优化
1.1.2 裂缝识别
每间隔k帧进行一次裂缝识别,以使相机位姿优化与裂缝识别速度一致。对于到达的RGBD帧It(tmodk=0),将其中的RGB图像输入到Mask R-CNN网络中预测其实例信息Mt。
Mt和It尺度一致,记录了实例所属的类别以及相应的位置,即Mt(x,y)=m,其中m∈{0,c}为像素的掩码值,c为Mask R-CNN网络训练时裂缝的标签。Mt中存储了It每一个像素对应的裂缝信息,此信息与It中颜色和深度信息都要被融合到TSDF模型中。由于裂缝识别模块与相机位姿优化模块在不同的线程中执行且裂缝识别并不是在每一帧都执行,因此当It进行融合时,Mt可能还未计算得到。为了解决这一问题,将Mt信息存储在程序中,在重新融合It时判断其是否有对应的Mt,若存在则融合Mt。
1.2.1 三维重建模型结构
在Voxel Hashing算法的基础上,新增一个多分辨率模型来存储重建的三维结构信息和裂缝信息。此模型使用体素块来表达三维场景,体素块分为基本块和细化块,基本块中存储初始重建的3D数据和裂缝的实例信息,细化块中存储细化的3D数据。图3展示多分辨率重建模型的结构。使用哈希表和细化表来管理基本块和细化块。每一个基本块和细化块都对应真实场景的一个三维坐标。每个基本块和细化块的边长为 0.08 m,在当前的实现中,一个基本块由83个体素组成,一个细化块由323个体素组成,基本块中相邻体素之间的距离为10 mm,细化块中相邻体素之间的距离为2.5 mm。
图3 多分辨率重建模型Fig.3 The multi-scale reconstruction module
当拍摄到一帧后,根据此帧的相机位姿计算位于It相机视野下的基本块,并获得这些基本块中体素的三维坐标W=(x,y,z),通过哈希函数计算哈希条目:
H=(p1x+p2y+p3z)modn.
(1)
式中:p1,p2,p3为最大的素数;n为哈希表的大小。每一个基本块的内存位置可以由H索引,每一个体素的内存位置可以由与其所属基本块的坐标偏差计算得到。将基本块中的体素投影到It的成像平面,读取It中RGB图像、深度图像和掩码图像投影点的值,计算投影点处相应的信息,即SDF、权重、颜色和掩码信息。若投影点恰好是裂缝所在的位置,则细化该基本块——即在细化表中顺序查找一个空闲的细化条目,将此细化条目存储在It相机视野下的基本块中,再将细化块中的体素投影到It的成像平面,计算投影点处对应的SDF、权重、颜色和掩码信息。
1.2.2 含语义信息的体素融合
将基本块中每个体素的世界坐标W投影到It的成像平面上,得到二维投影点p:
(2)
式中:Tc∈R3×3为相机的内参矩阵。新计算的SDF值D′、权重值E′、颜色值C′见式(3)~(5):
D′=Depth(p)-WZ.
(3)
E′=1-Depth(p)/dmax.
(4)
C′=RGB(p).
(5)
式中:dmax为融合允许的最大深度值;WZ为W在z轴上的距离;Depth()函数和RGB()函数为获取It对应的深度图和RGB图中指定像素的深度值和颜色值。然后将D′、E′、C′的值加权融合到D、E、C中。
M′=Mask(x,y).
(6)
Mask()函数为获取掩码图中指定像素的掩码值,将M′融合到M中,得出:
(7)
细化M>0的基本块,即通过1.2.1节中的方法,建立细化块中体素之间的关联和存储位置,并按照上述方法更新细化块中体素的值。最终得到一个包含裂缝信息的木结构三维模型,模型中以体素的形式表达了木结构的形状、纹理与裂缝信息。
1.2.3 裂缝长度与深度分析
基于裂缝一般呈现条状特点,使用裂缝的长度来表示裂缝的大小。在三维空间中,采用欧式聚类法分割被标记为裂缝的体系,同时计算其包围盒,使用包围盒长轴的长度来描述裂缝的长度。
在计算裂缝的深度时,提取每一个裂缝所在的局部平面,使用RANSAC构造三维平面约束。在裂缝区域的点云中随机选取3个点,计算其初始平面方程Ax+By+Cz+D=0。计算裂缝区域每一个点到初始平面的距离di=|Axi+Byi+Xzi+D|,若di小于距离阈值(默认采用0.02m),则记录该点为模型的内样本点,根据内样本点计算新的平面方程。迭代每一个点到新的平面方程的距离,寻找最优内样本点和平面方程。计算裂缝区域点云到最优平面方程的最大值,记为裂缝的深度信息dm。
目前关于裂缝的数据集较少,包含裂缝的RGBD数据集则更少。选用Red Wood[21]公开数据集中HUT 03056序列作为实验数据集。此序列包含一个完整的木屋结构,墙体中存在部分开裂的情况。同时使用labelme标注工具,将序列中的裂缝标注出来以供Mask R-CNN网络训练,训练参数如表1所示。
表1 Mask R-CNN训练参数Table 1 The training parameters of Mask R-CNN
在Red Wood数据集上训练Mask R-CNN网络,并使用训练后的网络识别数据集和真实场景中的裂缝,如图4 所示。
图4 Mask R-CNN识别结果Fig.4 The result of Mask R-CNN
按1.2.2方法将融合进三维模型的裂缝信息以体素的形式提取出来,通过式(2)将体素投影到识别的掩码图像中,与所识别的结果拼接。在Red Wood数据集和真实场景中均超过了Mask R-CNN的识别精度,表明所提出将融合的裂缝信息投影到二维平面来补偿识别的方法是有效的(见表2)。
图5为三维重建部分的实验结果,使用DirectX显示当前工作的实时结果,和Bundle Fusion一致。
图5 三维重建运行效果Fig.5 The performance of 3D reconstruction
图6为多分辨率三维重建与Bundle Fusion(BF)重建结果,多分辨率的三维重建将木结构裂缝表面刻画得更清晰。
图6 BF重建与多分辨率重建结果对比Fig.6 The comparison of reconstruction results in BF and multi-resolution method
Bundle Fusion采用Voxel Hashing算法进行建图,其TSDF模型是该算法的核心,此模型使用间距10 mm的体素表达重建的场景。在这种均匀的体素空间中,精度每提升1倍,体素的显存占用量就会扩大8倍。将整个空间划分为基本块和细化块。当重建精度为10 mm时,Bundle Fusion需占用468.75 MB显存空间,当重建精度是2.5 mm时,需占用30 000 MB显存的空间。笔者提出的方法仅对部分区域细化后,达到2.5 mm的精度仅需占用3 843.75 MB显存空间,在保持显存空间不变下可以提高三维重建的精度。
实验中重建和识别裂缝的效果如图7所示。在三维体素空间中标注每一个裂缝所在的位置,当体素转为网格后,将裂缝对应体素位置用深色标注,并用方框标志每个裂缝的区域。图7(a)为Red Wood数据集中的重建与裂缝识别结果,场景包含11个裂缝,正确识别10个裂缝;图7(b)为真实场景中的重建与裂缝识别结果,场景包含2个裂缝,正确识别2个裂缝。在没有裂缝的区域,图7(a)中误识别1处,图7(b)中误识别2处。这是由于将图像识别网络与三维重建相结合,会在多次图像识别中造成误判。为解决此问题,采用面积过滤的方法,将所识别的长度小于阈值(0.2 m)的区域舍弃,以此提高识别精度。
图7 裂缝识别与重建Fig.7 The recognition and reconstruction of crack
由于Red Wood数据集中不包含裂缝的长度信息,因此从RGB图中读取裂缝两端像素值,再读取深度图中对应的深度值,即对应像素到相机光心的距离,根据两点坐标计算得出裂缝的长度。表3为场景中9个裂缝的长度测量值与实际值的对比,其中,裂缝实际长度为现场采用手工测量方式获取。细化前为单一分辨率三维重建计算得到的裂缝长度,其平均误差率为12.3%,细化后为多分辨率三维重建计算得到的裂缝长度,平均误差率为9.3%。
表3 裂缝长度分析Table 3 The analysis of crack length
使用RANSAC算法拟合每一个裂缝所在平面,并计算裂缝的最大深度。由于Red Wood数据集仅包含每一帧像素到光心的距离,很难通过像素到光心的距离得出裂缝的实际深度值,因此裂缝深度分析结果仅与真实场景中人工测量值进行比对(见表4)。
表4 裂缝深度分析Table 4 The analysis of cracks depth
经计算,单一分辨率三维重建的平均深度误差率为36.8%,多分辨率三维重建的平均深度误差率为19.7%。
(1)通过细化裂缝处重建效果,在Red Wood数据集中将图像识别精度从原49.94%提高到88.13%,在真实场景中将图像识别精度从原32.11%提高到54.30%。
(2)与人工测量结果比对计算误差率,在Reg Wood数据集中,与单一分辨率重建方法相比,多分辨率方法的裂缝长度平均误差率从12.3%降低到9.3%。
(3)在真实场景中,与单一分辨率重建方法相比,多分辨率方法的深度平均误差率从36.8%降低到19.7%。