李雅倩,薛銀濤,李海濱,張文明,高雅昆
(燕山大學電氣工程學院,河北秦皇島 066004)
碼頭散裝貨物計重的國際通用方法是用水尺測量的方式,利用阿基米德原理,通過讀取船舶的六面吃水值來計算船舶的散貨載重量.在船舶吃水值獲取過程中,傳統(tǒng)的方法主要依靠人工目視觀測的方式,通過觀測一段時間的水位變化,記錄波峰波谷,取平均值得到船舶最終載重吃水值.但由于受海況影響,加上人工讀數(shù)的主觀性大,水尺數(shù)據(jù)的獲取存在較大不可控因素,容易引起糾紛.所以近年來,很多人提出用科學的手段來代替人工實現(xiàn)這一過程,最大程度降低人為以及環(huán)境因素的干擾.目前,學者所主要研究的方法有兩大類,基于超聲波傳感器的方法以及基于視覺的方法.朱四印等人提出基于超聲波傳感器動態(tài)采集船舶的吃水深度,通過對點云數(shù)據(jù)進行分析,得到最終的船舶吃水值.該方法的檢測精度只有0.1 m,主要用于裝船時超載預(yù)警[1];劉新建等人分析研究了聲波傳輸過程中的干擾,通過均值濾波等方法去除噪聲的干擾,實現(xiàn)了基于聲波的船舶吃水線實時檢測[2].上述前兩種方法主要想利用超聲波檢測船舶在裝船時避免超載情況出現(xiàn),對檢測精度要求不高.而對于船舶散貨載重計量來說,檢測精度要求達到0.5 cm,而基于超聲波的方式遠遠達不到精度要求.
近年來,計算機視覺技術(shù)得到了快速的發(fā)展和廣泛的應(yīng)用,一些學者提出利用計算機視覺的手段對船舶吃水線進行提取.羅婧等人提出利用Canny算子對圖像進行邊緣檢測以及幾何校正后,通過霍夫變換檢測出水跡線和水線位置,然后通過位置比較消除水跡線的干擾[3];郭秀艷等人提出基于投影、圖像分割、彩色模型、尺度變換等圖像處理方法進行吃水線的檢測[4];吳海等人提出根據(jù)海水混濁程度分為兩種情況:當水體較為清澈時,利用霍夫直線檢測提取吃水線位置;當海水較為混濁時,從多種顏色空間判斷出主色調(diào),然后通過二值化分割提取吃水線位置[5].上述方法利用計算機視覺方法,使機器具有“看”的能力,有效避免人的主觀意識的干擾,但由于傳統(tǒng)算法有一個共同的特點,都是研究者根據(jù)具體問題,手工設(shè)計的特征,容易受到天氣、光照、水浪、漂浮物、斑駁船體、不同水質(zhì)等因素的影響,因而所提取的特征泛化能力不強,魯棒性較差,難以適應(yīng)復(fù)雜多變的實際情況,所以無論是傳統(tǒng)的分割算法還是直線檢測算法都無法得到準確地結(jié)果.
本文提出了一種基于深度卷積神經(jīng)網(wǎng)絡(luò)的船舶吃水位置檢測方法.相比傳統(tǒng)人工設(shè)定的特征,基于深度卷積神經(jīng)網(wǎng)絡(luò)方法學習得到的特征能夠適應(yīng)與訓練集有相似特征的同類目標,具有較強的魯棒性和穩(wěn)定性.本方法首先使用基于深度學習的語義分割算法對圖像中目標區(qū)域進行分割,通過水平投影得到水線在圖像中的位置,然后根據(jù)統(tǒng)計取平均值得到最終的吃水深度.
在深度學習技術(shù)之前,圖像分割算法可謂是百花齊放,從最簡單的基于像素的閾值分割算法[6]、基于邊緣分割算法[7–8]到基于區(qū)域的分割算法[9–10].它們都是利用像素自身比較低階的視覺信息來進行圖像分割,在較困難的分割任務(wù)中,難以取得令人滿意的結(jié)果.在計算機視覺進入深度學習時代之后,語義分割也取得了全新的進展.
語義分割是在像素級別上對圖像的理解,將每一個像素進行歸類,進而將圖像中表達不同語義進行區(qū)域劃分.在2014年,Berkeley的Long等人提出的全卷積網(wǎng)絡(luò)(fully convolutional network,FCN)[11]是一種端對端的語義分割模型,文中提出全卷積、反卷積以及跳躍結(jié)構(gòu)3個創(chuàng)新點,成為了語義分割的基本框架,后續(xù)的研究都是在此基礎(chǔ)上進行改進.
FCN網(wǎng)絡(luò)也存在局限性:第一,得到的結(jié)果還是不夠精細,它是對前邊的一些層直接反卷積,這樣采樣的結(jié)果是比較模糊和平滑,對圖像中的細節(jié)不敏感;第二,FCN沒有考慮像素之間關(guān)系,而是對每個像素進行的分類,這樣會缺乏空間的一致性,出現(xiàn)過分割現(xiàn)象.所以后續(xù)的算法針對其存在的問題進行了改進,PSPNet[12]使用空間金字塔池化結(jié)構(gòu),該結(jié)構(gòu)通過一系列池化和卷積操作獲得多尺度的特征并進行組合.DeepLab使用空洞空間金字塔池化,采用具有不同膨脹程度的空洞卷積,因此與PSPNet相比,創(chuàng)建了更密集的特征.最近,ZigZagNet[13]和ACNet[14]利用中間特征,而不僅僅是主干網(wǎng)絡(luò)最后一層的特征來創(chuàng)建多尺度上下文.在PASCAL VOC2012數(shù)據(jù)集上,準確率從FCN的62.2%提升到現(xiàn)在DeepLab v3+[15]的85.7%.在追求精度的時候不可避免的會增加網(wǎng)絡(luò)的復(fù)雜度,而實際應(yīng)用中,有些場景可能需要算法能夠?qū)崟r處理.ENet采用了一種不對稱的編解碼結(jié)構(gòu),減少了網(wǎng)絡(luò)層數(shù),并且使用了空洞卷積,避免在池化過程中丟失太多的信息.在損失一定精度的情況下,算法的速度得到了極大的提升[16].ICNet在保證實時性的同時,提出了采用圖像級聯(lián)方式來提升分割的精度,該網(wǎng)絡(luò)將輸入圖片分為低、中、高3個尺度分辨率的圖片分別提取特征,最后在進行特征融合,提升了分割精度[17],但對于本文來說,多尺度信息反而會導(dǎo)致過分割.
對于本文研究的問題,既要考慮分割的準確率,還需要考慮算法的實時性,處理速度需要達到每秒30幀以上.所以在模型選擇上,優(yōu)先考慮的是其處理速度,在速度達標的同時,再選擇準確率最高的模型,本文采用的是基于MobileNet v2[18]目標檢測網(wǎng)絡(luò)實現(xiàn)的語義分割,該模型為編解碼結(jié)構(gòu),編碼采用去掉最后一個下采樣塊以及全連接層的MobileNet v2結(jié)構(gòu),解碼采用對稱結(jié)構(gòu),為了保證實時性,去掉了重復(fù)塊.網(wǎng)絡(luò)共有4個下采樣層和4個上采樣層,核心是一種反轉(zhuǎn)殘差結(jié)構(gòu),見下文第3.3節(jié).整體網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示.
本研究在秦皇島貨物運輸港口,通過搭載有攝像頭的爬壁機器人沿水尺線到達水面上方1.5 m處,調(diào)整相機角度,使其正對吃水線,盡量使圖像在吃水線附近畸變最小.針對不同船只,不同裝載情況以及不同的海況采集了數(shù)十個視頻,數(shù)據(jù)集的制作標準參考了PASCAL標準數(shù)據(jù)集.根據(jù)數(shù)據(jù)以及標注特點,利用MFC+OPENCV進行數(shù)據(jù)集制作,通過載入視頻,點擊標注區(qū)域,移動鼠標一系列操作即可生成標注的數(shù)據(jù),標注過程準確高效.
標注過程中的難點是,顏色較為接近的船體或者水質(zhì)較為接近的水體如何標注,如圖2(a)所示,船體中部為紅色,透撤的水體也呈現(xiàn)船體的顏色.常規(guī)的思路:一種是顏色接近的都標注為一類,另一種是全部作為新的一類標注.測試發(fā)現(xiàn),這兩種方式無論哪一種得到的結(jié)果都不好,魯棒性較差,容易過擬合.上述兩種標注方法將本研究歸為多分類問題,而本文根本是為了提取水線的位置,最簡單的就是得到二值圖,進而獲取水線位置.所以直接將圖片標注為兩部分,水體和船體,如圖2(b)所示.這樣得到的數(shù)據(jù)集,只有兩個類別,通過測試,這種標注方式使得算法的泛化能力得到了極大的提升,訓練過程不容易出現(xiàn)過擬合現(xiàn)象.
深度可分離卷積是一種高效的卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu).基本思想是將傳統(tǒng)的卷積結(jié)構(gòu)分解成兩個單獨的層.第1層稱為深度卷積,每個濾波器只對一個輸入通道進行卷積,第2層是1×1卷積,稱為逐點卷積,負責將上一層卷積的結(jié)果線性組合.
深度可分離卷積將傳統(tǒng)的卷積分解為一個深度卷積和一個1×1的卷積,對比標準卷積,深度可分離卷積的計算量減少了8到9倍.
卷積神經(jīng)網(wǎng)絡(luò)由輸入層、卷積層、激活函數(shù)層、池化層以及全連接層組成,其中,激活函數(shù)起到尤為關(guān)鍵的作用,使用非線性函數(shù),隨著網(wǎng)絡(luò)深度的增加,可以使得網(wǎng)絡(luò)逼近任意的函數(shù).在MobileNet v2中,作者通過實驗分析得到,ReLU會對通道數(shù)較低的張量造成較大的信息損耗,這是因為ReLU的特性使得對于負值輸入,其輸出為0,而且降維本身就會造成特征壓縮,這樣就使得特征損失更為嚴重.所以,為了保留低維的信息,采用線性變換會起到比非線性更好的效果.所以,在完成降維后,接下來的1×1 卷積層后接的是一個線性激活,其他情況用的是ReLU.如圖3所示,先用3×3深度可分離卷積(depthwise separable convolutions,Dwise),然后用1×1 卷積(convolutions,Conv)將輸入的特征圖維度變小,最后使用1×1的卷積運算將其維度變大.此時的1×1卷積運算后,不再使用ReLU激活函數(shù),而是使用線性激活函數(shù)Linear,以保留更多特征信息,保證模型的表達能力.
圖3 線性塊Fig.3 Linear bottlenecks
在MobileNet v2中,使用了類似于ResNet[19]中的短連接結(jié)構(gòu),在ResNet往后,許多模型都使用了該結(jié)構(gòu),證明了它的有效性.在該網(wǎng)絡(luò)中,并沒有直接使用殘差結(jié)構(gòu),而是對其進行了修改,通常的殘差塊是先經(jīng)過一個1×1的卷積層,把特征圖的通道數(shù)降下來,再經(jīng)過3×3卷積層,最后經(jīng)過一個1×1的卷積層,將特征圖通道數(shù)再擴張.深度可分離卷積層提取的特征受限于輸入的通道數(shù),若是采用以往的殘差塊,先“壓縮”,再卷積提特征,那么深度可分離卷積層可提取得特征就太少了,因此一開始不對其“壓縮”,而是先“擴張”,本文中使用的“擴張”倍數(shù)為6,再降維,這樣的操作和原來ResNet中殘差塊對維度的操作正好是相反的,所以稱作為Inverted residuals.
圖4 網(wǎng)絡(luò)子結(jié)構(gòu)Fig.4 Network substructure
圖4是網(wǎng)絡(luò)子結(jié)構(gòu)的組成形式,分為兩種情況:1)圖(a)所示的步長s為1的逆殘差塊,Input為上一網(wǎng)絡(luò)層的輸出特征圖,Add表示跨層合并,該反轉(zhuǎn)殘差結(jié)構(gòu)bottleneck是網(wǎng)絡(luò)的重要組成部分;2)圖(b)與圖(a)的主要區(qū)別在于步長為2,主要為了實現(xiàn)池化的過程.
表1描述了本文所采用的模型結(jié)構(gòu).正如上一節(jié)所討論的那樣,基本的構(gòu)建塊是一個瓶頸深度可分離帶殘差的卷積,整體是一個編解碼結(jié)構(gòu).編碼采用去掉最后一個下采樣塊以及全連接層的MobileNet v2結(jié)構(gòu),解碼采用對稱結(jié)構(gòu),為了保證實時性,去掉了重復(fù)塊.假設(shè)輸入是大小為224×224的彩色圖片,輸出為224×224×C的分割圖,C表示輸出通道個數(shù),本文輸出是一個二值圖,所以C等于1.參數(shù)t表示的是擴張因子,c是該層的輸出通道數(shù),n代表該層的重復(fù)次數(shù),s表示步長.所有空間卷積都使用3×3核.第1層,使用正常的卷積結(jié)構(gòu),剩下的編碼結(jié)構(gòu)都是采用的上文中提到的瓶頸深度可分離的帶殘差的卷積.解碼部分由上采樣加上瓶頸深度可分離的帶殘差的卷積實現(xiàn),圖片尺寸縮小了16倍,在解碼部分,通過4次上采樣,恢復(fù)原來的圖片大小,整體模型成對稱結(jié)構(gòu).
表1 網(wǎng)絡(luò)結(jié)構(gòu)Table 1 Network structure
船舶吃水線提取是在分割結(jié)果的基礎(chǔ)上,通過水平投影得到的.分割的實驗算法采用的是上文所提到基于Mobilenets v2網(wǎng)絡(luò)改進的語義分割模型,稱之為Fine-Mobilenet.工程環(huán)境為Windows系統(tǒng)下的Visual Studio 2015,Fine-Mobilenet模型訓練在Linux系統(tǒng)下用Python實現(xiàn).所以,本實驗采用的是C++和Python混合編程的方式,在Windows 下,用C++調(diào)用Linux下基于Python語言訓練好的模型進行實驗.
實驗所用的數(shù)據(jù)集是自己建立的數(shù)據(jù)集.數(shù)據(jù)集格式按照PASCAL VOC數(shù)據(jù)集格式建立,視頻源是在現(xiàn)場通過相機拍攝采集的,共包含不同船只、不同天氣條件的視頻30個.每個視頻制作200到500張數(shù)據(jù)集,總共1萬多張圖片.數(shù)據(jù)集中每張圖片標注為兩類:0和1,分別代表船體和水體.每個視頻制作的數(shù)據(jù)集中隨機抽取30張作為驗證集,10張作為測試集,最終訓練集總共有10000張圖片,驗證集有900張圖片,測試集有300 張圖片.在對語義分割模型進行訓練時,實驗環(huán)境為Linux系統(tǒng),顯卡為GTX1080.語義分割模型Fine-Mobilenet模型訓練超參數(shù)設(shè)置如下:學習率為0.001;最大迭代次數(shù)為40;動量Momentum為0.9;權(quán)重衰減項為0.0005;在Ubuntu 系統(tǒng)環(huán)境下,調(diào)用GPU時語義分割算法的推理速度約為0.017 s/張.
圖5(a)所示的為訓練過程的損失誤差曲線,灰色為訓練誤差,黑色為驗證誤差.在迭代次數(shù)達到30次之后,損失趨于平穩(wěn).圖5(b)所示的為訓練過程的準確度曲線;同樣,灰色代表訓練精度,黑色代表驗證精度,準確率達到98%以上,符合檢測精度要求.
圖5 訓練趨勢圖Fig.5 Training trend chart
圖6為各種復(fù)雜情況下的分割結(jié)果.實驗處理的圖片大小為224×224,實驗采集到的視頻大小為640×480,所以,對視頻分析的時候,需要在第1幀圖像上確定感興趣區(qū)域的位置,隨后每一幀感興趣區(qū)域的位置由前后兩幀水線位置差更新.從圖6可以看到,每一張圖片中水線基本處于圖像的中心位置,這樣保證了圖片中水體和船體都具有明顯的特征,保證圖片分割更為精確.圖6第1行圖片干擾較少,包含滿載線,透徹的水體和渾濁的水體,以及水跡線等干擾,分割結(jié)果的邊緣保持很好;第2行是同一條船的兩個狀態(tài),屬于風浪較大的情況,波峰波谷達到1 m以上,從分割結(jié)果上看,第1張分割的有毛刺現(xiàn)象,主要是浪花的干擾,分割結(jié)果并不影響水線的提取;第3行是水體非常透徹的情況,第4行主要是反光以及浪花的干擾,第5行主要是斑駁船體等干擾.這10 張圖片包含了主要的幾種干擾情況,實驗分割的誤差小于2%,符合要求.語義分割后得到了目標區(qū)域的二值圖,通過水平投影得到水線在圖中的位置,目標區(qū)域通過前后幀水線差更新,最后統(tǒng)計取平均值得到最終的吃水深度.系統(tǒng)可視化界面如圖7所示,包括吃水線實時識別結(jié)果,目標分割結(jié)果,吃水線歷史曲線圖.
圖6 分割結(jié)果Fig.6 Segmentation results
圖7 系統(tǒng)人機交互界面Fig.7 Human computer interaction interface of system
圖8為采用不同方法識別吃水線的結(jié)果圖:圖8(a)采用本文算法,圖8(b)采用文獻[5]中的傳統(tǒng)方法.圖中對比了兩個具有代表性的場景:
第1行為海浪大于1 m,浪花較大,且存在滿載線的干擾,本文算法得到的分割圖與真實圖趨于一致,且該段視頻的水線歷史曲線平滑而規(guī)律,符合真實的船體晃動情況;而傳統(tǒng)的算法受波浪滿載線等干擾,分割圖粗糙,且水線歷史曲線畸變較多,水線的識別效果差.
第2行場景存在滿載線、水跡線、透明水質(zhì)和反光等影響.本文算法得到的結(jié)果比較理想,而傳統(tǒng)算法對于透明水質(zhì)分割效果差,將水面識別為了水線,且容易將滿載線識別為水線,這在歷史曲線中有明顯的體現(xiàn),在中間某一段時刻,歷史曲線只有極小的波動,其曲線明顯的不合理.大量的實驗表明,本文算法較傳統(tǒng)算法有著更好的魯棒性,能夠適應(yīng)大多數(shù)場景,而傳統(tǒng)算法受外界干擾嚴重,算法無法適應(yīng)復(fù)雜的現(xiàn)場環(huán)境.更多的實驗數(shù)據(jù)如表2所示.
圖8 水線識別結(jié)果Fig.8 Waterline recognition results
表2展示了不同船只對應(yīng)的人工觀測結(jié)果、程序識別結(jié)果以及傳統(tǒng)算法識別結(jié)果[5].實驗為了確保對比數(shù)據(jù)的可靠性,人工觀測結(jié)果為多位專業(yè)計量人員分別讀取結(jié)果,并取平均值得到.可以看出在大多數(shù)情況下本文算法識別結(jié)果和人工觀測的結(jié)果誤差在0.5 cm內(nèi),而傳統(tǒng)算法波動較大.在海浪高于0.5 m的情況以及海浪光照等自然環(huán)境干擾較大的時候,本文算法在5 cm 的誤差范圍,而傳統(tǒng)算法誤差超過了10 cm.當然,當海浪較大時,人工觀測的方式讀取的結(jié)果偏差較大,這也是目前的一大挑戰(zhàn).為了保證該方案的可靠性,下一步將在大型海洋模擬實驗室進行驗證.通過實驗數(shù)據(jù)可以看出,本文的方案在實際船舶吃水線檢測中,魯棒性好,檢測精度以及效率都滿足實際的需求.
表2 實驗誤差分析表Table 2 Experimental error analysis
本文基于深度學習實現(xiàn)了對不同種類、不同環(huán)境下的船舶吃水線提取.通過實驗驗證了本文方法能對圖像中的水體和船體準確的分割,得到的分割結(jié)果通過水平投影即可得到吃水線的位置.通過對港口拍攝的視頻進行實驗,實驗結(jié)果與港口工作人員基本保持一致,證明了基于深度學習算法提取吃水線這種方法的有效性.未來的研究方向是進一步優(yōu)化本文方法,提升算法的實時性,減少對硬件的依賴,同時探索更準確獲得吃水線真實值的方法,以便更好地對算法性能進行評估.