葛從兵,陳 劍,嚴吉皞
(南京水利科學研究院,江蘇 南京 210029)
水庫大壩是我國經濟社會發展的重要基礎設施,其安全是國家水安全和公共安全的重要組成部分[1]。布設監測設施進行日常觀測,可以反映大壩安全性態。但監測設施僅能監測到點,不能全面覆蓋水庫大壩,存在漏檢和盲區。因此,《土石壩安全監測技術規范》(SL 551-2012)和《混凝土壩安全監測技術規范》(SL 601-2013)明確規定水庫大壩巡視檢查是大壩安全監測工作的重要組成部分,它可以全面、直觀地對大壩安全性態進行快速診斷。對于大部分沒有監測設施或監測設施損壞的中、小型水庫,水庫大壩巡視檢查對保障水庫大壩安全運行尤為重要。
隨著水管體制改革,水庫管理人員被精簡,許多水庫將巡視檢查工作委托給服務公司,巡檢人員為非專業人員,只能做到按規定路徑巡視,用巡檢儀拍照。大部分水庫在大壩上安裝了攝像機,可以定期對大壩、庫面及其他重要區域拍照。未來,應用無人機對大壩進行巡檢是必然趨勢,它可以按規定路徑飛行,在巡視點上懸停,對巡視部位拍照。上述巡檢圖像如由專業人員逐一查看,工作量大、時效性差,因此,迫切需要一個能夠自動識別巡檢圖像中大壩缺陷的系統。大壩缺陷識別系統主要采用目標識別方法,目標識別方法包括傳統目標識別方法和深度學習目標識別方法[2]。
傳統目標識別方法基于顏色、紋理、邊緣輪廓等特征,其中模板匹配算法抗干擾能力差,因而局限性較大[3]。2003 年,Fortunato 等[4]將遺傳算法與模板匹配算法相結合,提高了目標識別率。2006 年,Wang 等[5]將詞袋模型應用到圖像識別分類。2010 年,Belongie 等[6]提出基于圖像梯度的形狀匹配方法,提高了匹配率,但不能實時處理目標圖像。近年來,SVM 算法在識別分類領域得到廣泛應用,對于小樣本數據分類效果較好[7]。
隨著卷積神經網絡[8](Convolutional Neural Network,CNN)的出現,深度學習[9]備受矚目。1998 年,Yann 等[10]首次提出LeNet,用于手寫數字識別,卷積神經網絡性能一直沒有明顯提升。直到2012年,Krizhevsky 等[11]提 出AlexNet,將Top5 錯誤率從18.2%降低到15.4%,卷積神經網絡重新煥發生機。2013 年,Zeiler 等[12]提出CNN 可視化方法。2014 年,Simonyan 等[13]設計VGG,將Top5 降低到7.3%。2015 年,Szegedy 等[14]提出GoogLeNet,采用Inception 結構,減少了參數量,提高了網絡性能。2016 年,He等[15]提出ResNet,允許層與層之間跳躍相連,網絡性能獲得很大提升。在目標識別方面,2014 年,Girshick 等[16]提出基于區域(Region)的卷積神經網絡R-CNN,以候選框與卷積神經網絡相結合的方式進行目標檢測,取得了突破性進展。2015 年,Girshick[17]提出Fast R-CNN,將分類與檢測任務合并,采用多任務損失函數,大幅縮短了網絡訓練與檢測時間。同年,Ren 等[18]提出Faster R-CNN,采用RPN(Region Proposal Networks)與卷積層共享權值方式,進一步提高了圖像分類和檢測性能。2016 年,Redmon 等[19]提出采用單步(One-Stage)方法的YOLO(You Only Look Once),提高檢測速度,滿足實時性需求;同年,Liu 等[20]提出SSD(Single Shot MultiBox Detector),其速度比Faster RCNN 快,精度比YOLO 高。2017 年,He 等[21]提出Mask RCNN,用RoI Align 層替換RoI Pooling 層,增加目標輪廓預測分割分支。
本文在研究目標識別和遷移學習[22]基礎上,采用TensorFlow[23]深度學習框架,開發了B/S 架構的大壩缺陷識別系統,實現了大壩缺陷識別模型訓練和缺陷自動識別。
大壩缺陷識別系統開發基于深度學習框架Tensor-Flow,應用TensorFlow Object Detection API 庫,采用MySQL數據庫、Python 語言[24]和Django 框架[25],系統框架如圖1所示。TensorFlow 是采用Python 語言的主流學習框架,其核心功能是加速計算、自動梯度、神經網絡;TensorFlow Object Detection API 用于多目標檢測,并在COCO、Kitti 和Open Images 等數據集上訓練好模型,用于遷移學習;Django 是一個開源的、全棧式(full-stack)的Web 應用框架,它采用MTV 設計模式,包含Web 開發所用到的幾乎所有模塊。
大壩缺陷識別系統可根據需要選擇預訓練模型,建立大壩缺陷識別模型;上傳缺陷樣本,對樣本進行重構,標注樣本中的缺陷,將樣本轉換為TFRecord 格式文件;采用訓練樣本對模型進行訓練;采用評估樣本,對模型進行評估,顯示評估結果;根據模型檢查點文件,生成模型凍結文件;上傳待識別圖像,識別圖像中的缺陷。系統主要流程如圖2所示。
大壩缺陷識別系統功能如圖3所示。
模型管理可添加、修改、刪除缺陷識別模型,添加或刪除模型相應的目錄、預訓練模型、標簽映射文件和配置文件;根據模型檢查點文件,生成缺陷識別模型凍結文件,凍結文件存儲模型網絡結構(計算圖)、模型變量及其取值;查詢模型的網絡節點和操作的屬性;下載模型壓縮包,包括配置文件、檢測點文件和凍結文件,供其他大壩缺陷識別的軟硬件使用。
樣本管理可將樣本的圖像文件和標注文件上傳至樣本庫;通過圖像水平翻轉、垂直翻轉、旋轉進行樣本重構,增加樣本數量;采用矩形或多邊形標注樣本中的缺陷;對樣本是否已標注、缺陷名稱是否正確進行合規性檢查,對缺陷標注位置進行準確性檢查;將圖像文件和標注文件轉換TFRecord 文件,提高模型輸入數據速度。
模型訓練可修改配置文件中模型訓練參數;采用訓練樣本TFRecord 文件對預訓練模型進行訓練;顯示訓練過程參數,包括學習率、分類損失、定位損失、總損失和單步訓練時間等。
模型評估可采用評估樣本TFRecord 文件對模型進行評估;顯示評估結果,包括分類損失、定位損失、AP(Average Precision)、mAP(Mean Average Precision)和評估樣本圖像。

Fig.2 System process圖2 系統流程

Fig.3 System function圖3 系統功能
缺陷識別可上傳待識別圖像,并應用模型凍結文件,對待識別圖像進行缺陷識別,顯示圖像及其缺陷類型、缺陷方框或缺陷淹膜。
2.1.1 Faster R-CNN
Fast R-CNN 將整張圖像輸入至CNN,得到圖像的特征層;利用Selective Search 方法得到原始圖像中的候選框,將這些候選框投影至特征層;針對特征層上每個大小不同的候選框,對其進行池化,得到固定維度的特征表示;通過兩個全連接層,分別用Softmax 分類、回歸模型進行檢測。
Fast R-CNN 中Selective Search 方法的滑窗(anchor)選擇效率低,會產生大量無效候選框。針對這一問題,Faster R-CNN 采用RPN 代替Selective search 方法產生候選框,如圖4 所示。RPN 是一個小的全卷積網格,對于任意大小的圖像,輸出候選框的具體位置以及候選框是否為目標。
2.1.2 Mask R-CNN

Fig.4 Faster R-CNN framework圖4 Faster R-CNN框架
Mask R-CNN 是一個實例分割模型,由Faster R-CNN和FCN(Fully Convolution Nets)組合而成。前者負責物體檢測(分類標簽+方框),后者負責確定目標輪廓。Mask RCNN 用RoI Align 層替換Faster R-CNN 的RoI Pooling 層,并添加一個含FCN 層的預測分割分支,如圖5 所示。與RoI Pooling 層不同,RoI Align 層使用插值算法得到輸出坐標,不再進行量化;每個網格中的值也是使用差值算法得到,不再使用max 函數。FCN 是一種流行的語義分割算法,它通過卷積層和最大池化層,將輸入圖像壓縮到原始大小的1/32,在這個細粒度級別進行分類預測;采用反卷積層對最后一個卷積層的特征圖進行上采樣,將圖像還原成原始大小。
2.1.3 SSD
SSD 整合YOLO 的無顯式候選框提取和Faster R-CNN中的滑窗機制,在特征空間中融合不同卷積層的特征進行預測。SSD 檢測速度較快,檢測精度也很高,可以與Faster R-CNN 相媲美,在實時目標檢測方面有非常廣泛的應用。
在Faster R-CNN 中,滑窗是在主干網的最后一個特征層上生成。而在SSD 中,其他幾個高層特征層也產生滑窗。靠前的特征層用于檢測小目標,靠后的特征層用于檢測大目標。特征層上每個方格是一個特征點,每個特征點可以生成多個比例、多個尺度的滑窗。滑窗經過正負樣本篩選,再進行分類和邊界框位置學習。
大壩缺陷識別系統從Github 平臺tensorflow 項目中下載采用上述3 種目標檢測方法的預訓練模型:faster_rcnn_inception_v2_coco、mask_rcnn_inception_v2_coco、ssd_inception_v2_coco,針對收集的大壩缺陷圖像,采用Object Detection API 的trainer.train 函數對預訓練模型進行再訓練,得到缺陷識別模型。缺陷識別時,加載缺陷識別模型,采用tensorflow.Session 會話的run 函數識別圖像中的大壩缺陷。
深度學習需要專業人員進行大數據收集和清洗,深度學習的極高識別精度主要來自于對深度卷積神經網絡百萬乃至千萬個參數的訓練。要將如此多的參數訓練出來,除需要上萬,甚至十萬、百萬以上的大數據外,還要有與之相匹配的超強算力。因此,深度學習存在數據收集困難、數據標注耗時、模型訓練耗時等問題,遷移學習是一個非常好的解決方法。
遷移學習是將一個已經在大規模數據集上訓練好的模型中的知識遷移到另一個模型,即保留特征提取器不變,在具有相似特征新的數據集上對分類器進行重新訓練。由于特征提取器無需再訓練,因而極大減少了需要訓練的參數,僅需少量數據即可。
收集上萬個大壩缺陷樣本難度很大,因此大壩缺陷識別系統采用遷移學習方法,從Github 平臺Tensorflow 項目中下載預訓練模型,然后遷移至大壩缺陷識別模型。預訓練模型的訓練數據集為COCO(Common Objects in Context)數據集,該數據集包括人、自行車、汽車、貓、狗等多種類型的圖像。大壩缺陷識別系統的數據集為大壩缺陷數據集,大壩缺陷數據集需根據預訓練模型的輸出類型,采用矩形或多邊形在缺陷圖像上標出大壩缺陷位置。
3.1.1 標注文件轉換
系統中有2 種標注形式:矩形標簽和多邊形標簽。矩形標簽用于Faster R-CNN、SSD,一個樣本的所有矩形標簽保存在一個.xml 標注文件里;多邊形標簽用于Mask RCNN,一個樣本的所有多邊形標簽保存在一個.json 標注文件里(見圖5)。
對于矩形標簽,首先將所有.xml 標注文件匯集成一個.cvs文件,主要從各.xml標注文件中讀取文件名、圖像寬度、圖像高度、圖像深度度、缺陷名稱、缺陷框坐標等信息,保存至.csv 文件;然后將.csv 文件和圖像文件轉換為.tfrecord 文件,主要是采用具名元組方式從.csv 文件中讀取樣本的所有標簽信息,從對應的圖像文件中讀取圖像數據,采用tensorflow.train.Example 函數生成tensorflow 訓練樣本,以記錄形式存入.tfrecord 文件,一個樣本一條記錄。
對于多邊形標簽,首先將多個.json 標注文件匯集成一個COCO 數據集,主要從各.json 標注文件中讀取文件名、圖像寬度、圖像高度、圖像深度、缺陷名稱、缺陷形狀和多邊形各點坐標,根據預定義標簽文件,將缺陷名稱轉換為缺陷標識,保存至.json 文件;然后將COCO 數據集的.json文件和圖像文件轉換為.tfrecord 文件,主要從.json 文件中讀取每個樣本信息及其對應的圖像數據,針對每個樣本,讀取每個缺陷標簽信息,計算每個缺陷標簽坐標范圍,采用tensorflow.train.Example 函數生成tensorflow 訓練樣本,以記錄形式存入.tfrecord 文件。

Fig.5 Mask R-CNN framework圖5 Mask R-CNN框架
3.1.2 模型訓練
模型訓練采用訓練樣本TFRecord 文件對預訓練模型進行訓練,得到模型的檢查點文件。由于訓練時間較長,因此在模型訓練完成之前,系統將阻止啟動新的模型訓練。
模型配置文件主要包括以下5 部分參數:①model:模型主要信息,包括模型架構、特征提取器、圖像尺寸調整器等;②train_config:訓練參數,包括SGD 參數、輸入預處理和特征提取器初始值等;③eval_config:評估參數;④train_input_reader:訓練數據集位置;⑤eval_input_reader:評估數據集位置。
模型訓練時,先根據預訓練模型文件建立網絡模型,再從TFRecord 文件中讀取訓練圖像數據,采用Object Detection API 的trainer.train 函數對模型進行訓練。模型訓練可以采用分布式,由多臺計算機共同完成模型訓練,以縮短模型訓練時間。系統測試時采用單機模式。
3.1.3 訓練過程顯示
在模型訓練過程中和訓練結束時,一般可用可視化工具TensorBoard 顯示模型計算圖的計算過程,以便有針對性地調整訓練參數。由于TensorBoard 需另啟動一個Web 服務,故本系統采用TensorBoard 事件加速器(EventAccumulator)的scalars.Items 函數從模型訓練記錄文件中讀取計算過程數據,在頁面上顯示相關參數圖形,包括學習率、分類損失、定位損失、總損失和單步訓練時間等。主要代碼如下:
3.1.4 模型評估
模型評估采用評估樣本TFRecord 文件,對模型進行評估。模型評估時,先根據檢查點文件,建立網絡模型,再從TFRecord 文件中讀取評估圖像數據,采用Object Detection API的evaluator.evaluate 函數,對模型進行評估。
模型評估后,一般也可用可視化工具TensorBoard 查看評估結果。由于同樣原因,該系統采用TensorBoard 事件累加器(EventAccumulator)的scalars.Items 函數從模型評估記錄文件中讀取數據,在頁面上顯示相關參數圖形,包括分類損失、定位損失、AP、mAP 和評估樣本圖像,評估樣本圖像上將標注模型識別出的缺陷類型、缺陷方框或缺陷淹膜。
3.1.5 缺陷識別
缺陷識別根據模型凍結文件,對待識別圖像進行缺陷識別。缺陷識別時,首先根據模型凍結文件建立網絡模型,從預定義標簽文件獲取缺陷分類;然后逐個從待識別圖像文件讀取圖像數據,采用tensorflow.Session 會話的run函數進行推理;最后顯示識別結果,即模型識別出的缺陷類型、缺陷方框或缺陷淹膜的圖像。缺陷識別界面如圖6所示。

Fig.6 Defect recognition圖6 缺陷識別
從37 份大壩安全鑒定報告收集到120 張裂縫圖像和85 張破損圖像,用作訓練樣本,其他類型缺陷圖像較少;從196 份水庫日常巡視檢查報告收集到18 張裂縫圖像和5 張破損圖像,用作測試樣本。典型圖像如圖7所示。
典型圖像標注數據如下,其中size 標簽存儲圖像大小,name 標簽存儲缺陷名稱,bndbox 標簽存儲覆蓋缺陷的方框在圖像中位置:

Fig.7 Typical image圖7 典型圖像
從目標檢測類TersonFlow 預訓練模型中選擇3 個典型預訓練模型用于實驗,如表1 所示。根據收集到樣本和預訓練模型,創建5 個缺陷識別模型,如表2 所示。將訓練樣本上傳至系統后,對樣本進行缺陷標注和標注文件轉換。標注文件轉換時,系統隨機抽取10%樣本,用于模型評估。
模型訓練后,模型評估結果如表3 所示。從模型評估結果來看,采用mask_rcnn_inception_v2_coco 的性能優于faster_rcnn_inception_v2_coco,采 用 faster_rcnn_inception_v2_coco的性能優于ssd_inception_v2_coco。
將測試樣本上傳至系統,缺陷識別結果如表4 所示。對于大壩安全而言,能夠自動識別圖像上有無缺陷至關重要,至于具體缺陷數量和位置則較為次要,故增加缺陷圖像識別率,以考察有缺陷的圖像是否被識別出來。從模型測試結果看,對于大壩缺陷識別,采用faster_rcnn_inception_v2_coco 和mask_rcnn_inception_v2_coco 較為 合適,但mask_rcnn_inception_v2_coco 標注難度和工作量稍大。造成缺陷未識別、缺陷誤識別的主要原因有:訓練樣本較少;一條裂縫被識別為多條裂縫;不同破損之間差異大;寬裂縫和某些破損相似,不宜區分。

Table 1 Pre-training model表1 預訓練模型

Table 2 Defect recognition model表2 缺陷識別模型
本文開發的大壩缺陷識別系統具有模型管理、樣本管理、模型訓練、模型評估和缺陷識別等功能,可根據需要建立單缺陷識別模型和多缺陷識別模型,所訓練的模型可供其他終端使用。實驗結果表明,在訓練樣本較少的情況下,采用faster_rcnn_inception_v2_coco 和mask_rcnn_inception_v2_coco 預訓練模型可獲取性能較好的大壩缺陷識別模型。為了獲取性能更好的大壩缺陷識別模型,在進行模型訓練前需做好以下工作:①收集盡可能多的缺陷圖像樣本;②按缺陷表象進行分類,兼顧相關規范中按缺陷機理和后果分類方式;③缺陷分類要盡可能地提高類內相似度和類間差異性;④提高樣本標注中缺陷類型和位置準確性。

Table 3 Model evaluation表3 模型評估

Table 4 Model test表4 模型測試