秦龙焜
(苏州市信息中心 江苏省苏州市 215000)
为了保证桥梁工程结构的安全,需要定期对桥梁结构进行状态检测,其中混凝土结构的裂缝检测是桥梁安全检测的一项重要内容。随着技术的发展,基于无人机影像的桥梁裂缝检测方法相比传统人工检测具有覆盖度高、速度快、效率高等优点。基于数字图像处理技术的边缘提取算法(例如Canny 算子、拉普拉斯算子等)是从影像中提取裂缝的常规方法,这些方法对图像质量要求高,受光照、背景纹理、噪声等因素影响较大。为了提高裂缝检测的精度,越来越多的研究使用机器学习算法(例如K 均值算法、支持向量机分类算法等)对图像裂缝进行定位,然后使用数字图像处理技术进一步提取裂缝参数[1]。近年来,深度学习算法的发展及应用进一步提高了图像裂缝检测的准确性和效率[2-4]。
然而,当前广泛使用的深度学习框架例如TensorFlow、PyTorch 和Caffe2 等大都在Python 环境中运行,而实际工程应用中很多项目采用.NET Framework 开发部署,在.NET Framework 中不能直接集成当前主流深度学习模型框架,从而导致实际工程应用的不便。因此,本文通过预先将PyTorch 中训练好的模型导出为ONNX(Open Neural Network Exchange,开放神经网络交换)格式,然后在.NET Framework 平台加载ONNX 格式文件进行图像裂缝检测,实现在.NET Framework 环境进行有效的深度学习工程应用。
对某一大型混凝土结构桥梁利用大疆精灵4 RTK 无人机进行近距离航拍,全面获取桥梁结构的数字影像。为了有效对深度学习网络模型进行训练,需要选取足够数量的裂缝图像训练样本数据。从本次桥梁影像数据中以及之前其他桥梁混凝土结构的影像数据中利用图像分块切割工具截取224×224 像素大小的分块图像,人工对分块后的图像剔除非混凝土结构、遮挡、光线差、质量低的图像,然后将剩余符合要求的图像分类为裂缝图像和无裂缝图像,样本图像如图1、图2所示。
经过人工分类处理后得到样本图像12960 张,其中裂缝图像3120 张,无裂缝图像9840 张。进一步地,将上述样本数据随机选取90%作为训练样本,剩余10%作为测试样本,裂缝图像数据集如表1所示。
图1:裂缝图像样本示例
图2:无裂缝图像样本示例
图3:VGG16 网络结构
卷积神经网络(Convolutional Neural Networks,CNN)是人工神经网络的一种,是深度学习的代表算法之一,常被用来分析视觉图像,广泛应用于图像分类、目标检测和图像分割等图像和视频分析处理中。本文采用VGG16 网络结构[5]的卷积神经网络,VGG卷积神经网络是牛津大学的计算机视觉组(Visual Geometry Group)和谷歌的DeepMind 公司一起研发的一种深度学习卷积神经网络,在图像分类处理中具有良好的分类精度。
具有16 个权重层的VGG16 网络如图3所示,其网络结构简洁无分支,该网络包括1 个输入层(224×224 像素大小的RGB 3 波段图像)、13 个卷积层、5 个最大池化层、3 个全连接层、1 个输出层(分类结果)。图3 中N 为分类类别数量,VGG16 整个网络都使用了大小相同的卷积核尺寸(3×3)、卷积步距(大小为1)和最大池化尺寸(2×2),卷积层使用ReLU 激活函数。VGG16 网络中的卷积层通过卷积核的卷积操作提取图像特征,最大池化层缩小图像尺寸,全连接层则对提取的特征进行分类处理。
利用PyCharm 2020 开发平台采用Python 3.7 版本编程语言,利用PyTorch 1.7 版本深度学习开发包构建VGG16 网络模型,对裂缝图像训练样本数据进行训练。训练算法使用交叉熵损失函数,优化器选用随机梯度下降SGD 算法,学习率设为0.001,动量因子为0.9,训练迭代次数为10 次。实验计算机配置为6 核Intel Core i7 3.2 GHz CPU,16 GB 内存,RTX 2080 Ti 显卡(12G 显存),Windows 10(64 位)操作系统。为了提高训练效率,将深度学习模型导入到显卡中采用GPU 训练,对应的CUDA 版本为10.1。模型训练的分类精度如图4所示,从图中可以看出,训练迭代10 次的测试精度达到96.18%,能够满足实际工程应用的精度要求。
利用PyTorch 训练好的网络模型无法直接在.NET Framework平台中集成调用,因此,需要对训练好的模型进行转换,实现跨框架的深度学习模型部署。开放神经网络交换ONNX 格式是一种用于表达深度学习模型的标准文件,能够让不同的深度学习框架(如PyTorch、Caffe2、TensorFlow 和ML.NET 等)可以采用相同格式存储模型数据并交互,从而可以提高深度学习模型的重用性,缩短模型从构建、训练到应用的周期。
在PyTorch 框架中调用torch.onnx.export()函数可以将训练好的VGG16 网络模型和参数导出为ONNX 格式,该函数的部分参数如表2所示。
表1:裂缝图像数据集
表2:torch.onnx.export()函数部分参数
图4:VGG16 模型训练精度
图5:裂缝检测原型系统
ML.NET 是微软开发的一个可以在.NET Framework 环境下运行的开源机器学习框架,能够让.NET 开发人员将自定义的机器学习模型和算法融入到其应用程序中。在ML.NET 框架中调用Microsoft.ML.OnnxTransformer 库中的ApplyOnnxModel(output_names,input_names,f)(函数参数意义见表2)函数即可将ONNX格式模型文件转换为ML.NET 支持的数据模型,从而用于后续的数据分类处理应用中。
在Visual Studio 2017开发平台采用C#编程语言,开发基于.NET Framework 4.7版本的图像裂缝检测原型程序,程序使用ML.NET 1.5版本动态链接库,数字图像处理算法采用OpenCvSharp3 库,原型程序如图5所示。
由于初始拍摄的桥梁结构影像大小为5472×3078 像素,相片范围比较大,受环境因素等影响直接从中提取裂缝准确度不高,因此将原始图像进行分块处理。由于VGG16 网络采用224×224 像素大小的RGB 3 波段图像作为输入,因此对拍摄的桥梁结构图片按照224×224 像素大小进行划分切块处理,划分后的图像如图5 中的蓝色网格线。
在.NET Framework 程序中对图像进行裂缝检测前,裂缝检测原型程序预先读取ONNX 模型文件并转换为ML.NET的分类模型,该读取转换过程只需进行一次,后续的图像分类处理直接调用转换后的模型进行推理计算即可。
对于某一图像块(如图5 中绿色网格),将其输入到转换后的ML.NET 分类模型中,通过VGG16 网络进行计算后判断该图像属于裂缝图像还是无裂缝图像。如果图像块属于无裂缝图像则无需后续处理,直接再处理下一图像块;如果图像被分类为裂缝图像,则利用数字图像处理技术,对图像块进行图像增强、二值化、噪声剔除、裂缝骨架线提取等处理,最后输出裂缝的测量参数信息,如图5 中红色裂缝检测结果线,从而完成桥梁图像裂缝的自动化检测处理。
为了实现在.NET Framework 应用中部署深度学习算法进行桥梁裂缝检测,本文通过建立足够数量的裂缝图像训练样本数据,利用PyTorch 框架对VGG16 网络进行训练,然后将训练好的网络模型和参数导出为ONNX 格式文件,最后在.NET Framework 环境中通过ML.NET 工具包进行读取调用。为了验证本文处理过程的有效性,开发了基于.NET Framework 4.7 的图像裂缝检测原型系统,验证了本文处理过程的有效性。通过本文的处理思路,可以进一步地将其他机器学习框架中的图像分类、目标检测、目标分割等模型和算法部署到.NET Framework 应用中。