秦龍焜
(蘇州市信息中心 江蘇省蘇州市 215000)
為了保證橋梁工程結(jié)構(gòu)的安全,需要定期對橋梁結(jié)構(gòu)進行狀態(tài)檢測,其中混凝土結(jié)構(gòu)的裂縫檢測是橋梁安全檢測的一項重要內(nèi)容。隨著技術(shù)的發(fā)展,基于無人機影像的橋梁裂縫檢測方法相比傳統(tǒng)人工檢測具有覆蓋度高、速度快、效率高等優(yōu)點?;跀?shù)字圖像處理技術(shù)的邊緣提取算法(例如Canny 算子、拉普拉斯算子等)是從影像中提取裂縫的常規(guī)方法,這些方法對圖像質(zhì)量要求高,受光照、背景紋理、噪聲等因素影響較大。為了提高裂縫檢測的精度,越來越多的研究使用機器學習算法(例如K 均值算法、支持向量機分類算法等)對圖像裂縫進行定位,然后使用數(shù)字圖像處理技術(shù)進一步提取裂縫參數(shù)[1]。近年來,深度學習算法的發(fā)展及應用進一步提高了圖像裂縫檢測的準確性和效率[2-4]。
然而,當前廣泛使用的深度學習框架例如TensorFlow、PyTorch 和Caffe2 等大都在Python 環(huán)境中運行,而實際工程應用中很多項目采用.NET Framework 開發(fā)部署,在.NET Framework 中不能直接集成當前主流深度學習模型框架,從而導致實際工程應用的不便。因此,本文通過預先將PyTorch 中訓練好的模型導出為ONNX(Open Neural Network Exchange,開放神經(jīng)網(wǎng)絡交換)格式,然后在.NET Framework 平臺加載ONNX 格式文件進行圖像裂縫檢測,實現(xiàn)在.NET Framework 環(huán)境進行有效的深度學習工程應用。
對某一大型混凝土結(jié)構(gòu)橋梁利用大疆精靈4 RTK 無人機進行近距離航拍,全面獲取橋梁結(jié)構(gòu)的數(shù)字影像。為了有效對深度學習網(wǎng)絡模型進行訓練,需要選取足夠數(shù)量的裂縫圖像訓練樣本數(shù)據(jù)。從本次橋梁影像數(shù)據(jù)中以及之前其他橋梁混凝土結(jié)構(gòu)的影像數(shù)據(jù)中利用圖像分塊切割工具截取224×224 像素大小的分塊圖像,人工對分塊后的圖像剔除非混凝土結(jié)構(gòu)、遮擋、光線差、質(zhì)量低的圖像,然后將剩余符合要求的圖像分類為裂縫圖像和無裂縫圖像,樣本圖像如圖1、圖2所示。
經(jīng)過人工分類處理后得到樣本圖像12960 張,其中裂縫圖像3120 張,無裂縫圖像9840 張。進一步地,將上述樣本數(shù)據(jù)隨機選取90%作為訓練樣本,剩余10%作為測試樣本,裂縫圖像數(shù)據(jù)集如表1所示。
圖1:裂縫圖像樣本示例
圖2:無裂縫圖像樣本示例
圖3:VGG16 網(wǎng)絡結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,CNN)是人工神經(jīng)網(wǎng)絡的一種,是深度學習的代表算法之一,常被用來分析視覺圖像,廣泛應用于圖像分類、目標檢測和圖像分割等圖像和視頻分析處理中。本文采用VGG16 網(wǎng)絡結(jié)構(gòu)[5]的卷積神經(jīng)網(wǎng)絡,VGG卷積神經(jīng)網(wǎng)絡是牛津大學的計算機視覺組(Visual Geometry Group)和谷歌的DeepMind 公司一起研發(fā)的一種深度學習卷積神經(jīng)網(wǎng)絡,在圖像分類處理中具有良好的分類精度。
具有16 個權(quán)重層的VGG16 網(wǎng)絡如圖3所示,其網(wǎng)絡結(jié)構(gòu)簡潔無分支,該網(wǎng)絡包括1 個輸入層(224×224 像素大小的RGB 3 波段圖像)、13 個卷積層、5 個最大池化層、3 個全連接層、1 個輸出層(分類結(jié)果)。圖3 中N 為分類類別數(shù)量,VGG16 整個網(wǎng)絡都使用了大小相同的卷積核尺寸(3×3)、卷積步距(大小為1)和最大池化尺寸(2×2),卷積層使用ReLU 激活函數(shù)。VGG16 網(wǎng)絡中的卷積層通過卷積核的卷積操作提取圖像特征,最大池化層縮小圖像尺寸,全連接層則對提取的特征進行分類處理。
利用PyCharm 2020 開發(fā)平臺采用Python 3.7 版本編程語言,利用PyTorch 1.7 版本深度學習開發(fā)包構(gòu)建VGG16 網(wǎng)絡模型,對裂縫圖像訓練樣本數(shù)據(jù)進行訓練。訓練算法使用交叉熵損失函數(shù),優(yōu)化器選用隨機梯度下降SGD 算法,學習率設為0.001,動量因子為0.9,訓練迭代次數(shù)為10 次。實驗計算機配置為6 核Intel Core i7 3.2 GHz CPU,16 GB 內(nèi)存,RTX 2080 Ti 顯卡(12G 顯存),Windows 10(64 位)操作系統(tǒng)。為了提高訓練效率,將深度學習模型導入到顯卡中采用GPU 訓練,對應的CUDA 版本為10.1。模型訓練的分類精度如圖4所示,從圖中可以看出,訓練迭代10 次的測試精度達到96.18%,能夠滿足實際工程應用的精度要求。
利用PyTorch 訓練好的網(wǎng)絡模型無法直接在.NET Framework平臺中集成調(diào)用,因此,需要對訓練好的模型進行轉(zhuǎn)換,實現(xiàn)跨框架的深度學習模型部署。開放神經(jīng)網(wǎng)絡交換ONNX 格式是一種用于表達深度學習模型的標準文件,能夠讓不同的深度學習框架(如PyTorch、Caffe2、TensorFlow 和ML.NET 等)可以采用相同格式存儲模型數(shù)據(jù)并交互,從而可以提高深度學習模型的重用性,縮短模型從構(gòu)建、訓練到應用的周期。
在PyTorch 框架中調(diào)用torch.onnx.export()函數(shù)可以將訓練好的VGG16 網(wǎng)絡模型和參數(shù)導出為ONNX 格式,該函數(shù)的部分參數(shù)如表2所示。
表1:裂縫圖像數(shù)據(jù)集
表2:torch.onnx.export()函數(shù)部分參數(shù)
圖4:VGG16 模型訓練精度
圖5:裂縫檢測原型系統(tǒng)
ML.NET 是微軟開發(fā)的一個可以在.NET Framework 環(huán)境下運行的開源機器學習框架,能夠讓.NET 開發(fā)人員將自定義的機器學習模型和算法融入到其應用程序中。在ML.NET 框架中調(diào)用Microsoft.ML.OnnxTransformer 庫中的ApplyOnnxModel(output_names,input_names,f)(函數(shù)參數(shù)意義見表2)函數(shù)即可將ONNX格式模型文件轉(zhuǎn)換為ML.NET 支持的數(shù)據(jù)模型,從而用于后續(xù)的數(shù)據(jù)分類處理應用中。
在Visual Studio 2017開發(fā)平臺采用C#編程語言,開發(fā)基于.NET Framework 4.7版本的圖像裂縫檢測原型程序,程序使用ML.NET 1.5版本動態(tài)鏈接庫,數(shù)字圖像處理算法采用OpenCvSharp3 庫,原型程序如圖5所示。
由于初始拍攝的橋梁結(jié)構(gòu)影像大小為5472×3078 像素,相片范圍比較大,受環(huán)境因素等影響直接從中提取裂縫準確度不高,因此將原始圖像進行分塊處理。由于VGG16 網(wǎng)絡采用224×224 像素大小的RGB 3 波段圖像作為輸入,因此對拍攝的橋梁結(jié)構(gòu)圖片按照224×224 像素大小進行劃分切塊處理,劃分后的圖像如圖5 中的藍色網(wǎng)格線。
在.NET Framework 程序中對圖像進行裂縫檢測前,裂縫檢測原型程序預先讀取ONNX 模型文件并轉(zhuǎn)換為ML.NET的分類模型,該讀取轉(zhuǎn)換過程只需進行一次,后續(xù)的圖像分類處理直接調(diào)用轉(zhuǎn)換后的模型進行推理計算即可。
對于某一圖像塊(如圖5 中綠色網(wǎng)格),將其輸入到轉(zhuǎn)換后的ML.NET 分類模型中,通過VGG16 網(wǎng)絡進行計算后判斷該圖像屬于裂縫圖像還是無裂縫圖像。如果圖像塊屬于無裂縫圖像則無需后續(xù)處理,直接再處理下一圖像塊;如果圖像被分類為裂縫圖像,則利用數(shù)字圖像處理技術(shù),對圖像塊進行圖像增強、二值化、噪聲剔除、裂縫骨架線提取等處理,最后輸出裂縫的測量參數(shù)信息,如圖5 中紅色裂縫檢測結(jié)果線,從而完成橋梁圖像裂縫的自動化檢測處理。
為了實現(xiàn)在.NET Framework 應用中部署深度學習算法進行橋梁裂縫檢測,本文通過建立足夠數(shù)量的裂縫圖像訓練樣本數(shù)據(jù),利用PyTorch 框架對VGG16 網(wǎng)絡進行訓練,然后將訓練好的網(wǎng)絡模型和參數(shù)導出為ONNX 格式文件,最后在.NET Framework 環(huán)境中通過ML.NET 工具包進行讀取調(diào)用。為了驗證本文處理過程的有效性,開發(fā)了基于.NET Framework 4.7 的圖像裂縫檢測原型系統(tǒng),驗證了本文處理過程的有效性。通過本文的處理思路,可以進一步地將其他機器學習框架中的圖像分類、目標檢測、目標分割等模型和算法部署到.NET Framework 應用中。