黃應清,陳曉明,謝志宏,田欽文
(陸軍裝甲兵學院, 北京 100072)
作為基礎軍事訓練項目,實彈射擊在部隊開展的諸多訓練項目當中是不可或缺的。在射擊訓練中,傳統的人工報靶方式通常需要報靶人員提前隱蔽于目標附近的靶壕中,利用每輪射擊的間隙離開靶壕觀察靶面并記錄成績。這種方式效率低下,且安全性差,正逐漸被自動報靶的方式所取代。在諸多不同種類的自動報靶系統中,基于計算機視覺技術的報靶系統憑借其低成本、使用方便的特點而被各個院校、公司以及科研院所廣泛研究。
彈孔檢測是基于計算機視覺的自動報靶系統算法中最為重要的部分,直接影響著系統性能的優劣。如何精準、快速地檢測胸環靶圖像中的彈孔一直是技術難點。在現有的系統中,基本都是通過傳統的圖像處理方法來實現彈孔檢測的[1-6]。例如,先使用幀差法得到射擊前后兩幀胸環靶圖的差分圖像,再通過形態學方法去除干擾,或是利用彈孔灰度特征,根據彈孔與背景的灰度值差異進行檢測等等。由于傳統圖像處理技術的局限性,這些算法或多或少在檢測的精度、速度、抗干擾能力以及普適性等方面有所不足,難以滿足實際需求。近年來,深度學習技術逐漸興起,其在計算機視覺領域的應用具有良好前景。本研究另辟蹊徑,使用深度學習的方法彌補傳統圖像處理算法中存在的短板,將兩者相結合,提出一種基于計算機視覺的彈孔檢測算法,以滿足部隊實際射擊訓練需求。
對于彈孔檢測工作而言,圖像的質量會對算法設計與檢測效率產生很大的影響。因此,為確保彈孔檢測的效果,有必要對圖像進行預處理操作。需要注意的是,預處理應當適可而止,處理過度不僅會使算法的速度降低,還可能導致圖像的特征信息缺失,反而不利于彈孔的檢測,本文分三步對胸環靶圖像進行預處理。
為消除胸環靶圖像在采集和傳輸過程中所產生的噪聲,需通過平滑濾波的方式對其進行去噪處理,最常用的方法為中值濾波或高斯濾波。中值濾波可以較好地保留彈孔的邊緣信息,但其屬于非線性濾波,對于高斯噪聲的去噪效果不甚理想。高斯濾波屬于線性濾波,擁有較好的去噪能力,但容易破壞彈孔的邊緣信息,對接下來的樣本標注以及模型訓練工作造成不利影響。本文選擇雙邊濾波的方法處理樣本圖像,其處理結果如圖1所示。不難看出,相比于高斯濾波,它可以更好地保護彈孔的邊緣信息,且去噪性能不遜于中值濾波,能夠在不破壞彈孔特征的同時盡可能地消除噪聲的影響。
經過雙邊濾波處理后的胸環靶圖像基本消除了噪聲的影響,但其仍存在一些以靶場背景環境為主的區域。這些背景區域通常包含大量的無用信息,會嚴重干擾彈孔檢測工作,因此必須設法將其剔除。
為提高算法的普適性,并使其能夠適應復雜的靶場環境,本文使用深度學習的方法解決該問題。首先利用Labelme工具標注從靶場采集以及通過互聯網爬取到的胸環靶圖像并建立數據集,之后通過PyTorch深度學習框架搭建并訓練基于RefineNet[7,11]的語義分割模型,對胸環靶有效區域進行像素級分割,訓練過程中的部分參數如表1所示。

圖1 平滑濾波結果圖Fig.1 Smoothing filtering results

表1 模型參數
本文所搭建的深度神經網絡模型對原有的RefineNet網絡結構進行了改進,采用2種不同尺度的輸入,并且修改了RefineNet Block的連接方式,使模型能夠更加充分地學習各層級的特征信息,其結構如圖2所示。

圖2 改進后的RefineNet網絡結構示意圖
另外,由于是二類分割任務,引入加權交叉熵損失函數(Weighted cross entropy loss)為正樣本(胸環靶有效區域)加權,從而減少假陰性,防止彈孔信息丟失。
經過50輪的訓練,語義分割模型對于驗證集的平均像素精度(Mean Pixel Accuracy)達到了96.31%,平均交并比(Mean Intersection over Union)達到了91.55%,很好地完成了胸環靶有效區域的分割任務。根據模型的輸出結果將無用背景剔除,只保留胸環靶有效區域,其結果如圖3所示。

圖3 靶面分割圖Fig.3 Segmentation results of chest ring target
在現有的基于計算機視覺技術的自動報靶系統中,一般都是利用攝像機以固定的仰角去采集胸環靶圖像的,且當子彈擊穿胸環靶時,會導致靶面振動。上述2種情形會造成采集到的胸環靶圖像產生不同程度的透視畸變,靶面上的彈孔也會隨之變形。為方便后續工作,并提高算法的魯棒性,有必要對其進行校正。
本文采用透視變換的方法對胸環靶圖像進行校正:

(1)
其中:(xi,yi)為校正前的點;(ui,vi)為其校正后所對應的點;pij是校正系數。為求得校正系數,需在原始圖像中確定4個基準點及其校正后的位置。考慮到部隊射擊訓練的實際情況,依靠人力進行基準點的手動選取顯然是不可行的,這里利用特征匹配的方式來實現基準點的自動獲取。根據胸環靶圖像的特點,選取其左胸、右胸、左肩、右肩的4個角點作為基準點,分別對應著4個固定的校正位置。使用SIFT特征匹配算法,截取胸環靶圖像左胸、右胸、左肩、右肩適當位置各15×15像素大小的矩形區域作為匹配材料,提取其特征點作為匹配依據。由于胸環靶左肩、右肩與頭部左側、右側的特征比較相似,可能會出現匹配錯誤的情況。為確保匹配的準確率,先使用掩模遮擋胸環靶圖像頭部區域,之后再執行特征匹配操作,從而實現胸環靶左胸、右胸、左肩、右肩4個位置的精準定位。最后,根據各角點在匹配材料中的相對位置來確定胸環靶圖像中基準點的位置,并求出校正系數,完成透視畸變校正,其結果如圖4所示。

圖4 畸變校正圖Fig.4 Distortion correction results
ROI(region of interest)即感興趣區域。在機器視覺、圖像處理技術的應用中,進行ROI檢測主要是為了專注于圖像的重點區域,方便接下來要執行的操作。合理地進行ROI檢測可以有效提高算法的精度與處理速度。對于本文的彈孔檢測工作而言,感興趣區域自然是胸環靶圖像中的全部彈孔區域了。首先,選取合適的閾值對預處理結果進行二值化處理,將灰度值低于閾值的像素灰度設置為0,高于閾值的像素灰度設置為255。由于圖像中彈孔像素的灰度值非常低,在二值化時保留了全部的彈孔特征。之后使用OpenCV庫中的findContours函數,對二值化后的圖像進行輪廓提取。最后根據提取結果創建其最小包圍盒(Minimum Bounding Box),完成了ROI檢測,檢測結果如圖5所示。這一步實現了胸環靶圖像中疑似彈孔區域的檢測,其中包括所有彈孔區域以及部分非彈孔區域,相當于彈孔的粗提取。

圖5 ROI檢測結果圖
經過ROI檢測后,已經完成了胸環靶圖像中疑似彈孔區域的提取。接下來的工作就是要對提取出的感興趣區域進行研究,識別彈孔與非彈孔區域,將非彈孔區域全部剔除,最終實現彈孔的精準檢測。本文使用深度學習的方法進行彈孔識別,通過搭建并訓練基于ResNet50[8,9]的圖像分類模型,判斷胸環靶圖像中的疑似區域是否為彈孔,并根據模型的輸出結果,保留被判斷為彈孔的部分,從而完成彈孔檢測工作。
深度神經網絡模型的訓練目標是實現輸入的圖像是否為彈孔的判斷,相當于一個二分類監督學習問題,需要大量的正樣本(彈孔)以及負樣本(非彈孔)圖像來建立數據集。最直接的數據采集方法是從胸環靶圖像中手動截取樣本數據并對其進行分類,這樣做不僅費時費力、效率低下,且負樣本的采集標準難以衡量,這將會導致樣本的整體質量難以保證,容易對模型的彈孔識別效果造成負面影響。
為避免上述問題,本文使用一種更加便捷、高效的方法來建立數據集。首先利用Labelme工具標注經過預處理的胸環靶圖像中的彈孔區域,根據json文件生成彈孔區域的真值圖。然后使用之前提出的ROI檢測方法提取胸環靶圖像中的疑似彈孔區域,截取檢測結果,保存為樣本圖像數據,并定位其在真值圖中的對應區域。之后計算該區域中被標記為彈孔的像素數量,若彈孔像素數量占比超過區域所含像素總量的65%,則將樣本歸為彈孔類,反之歸為非彈孔類。如此一來,便獲得了適用于本文算法的樣本數據,如圖6所示。按照上述思路編寫程序,批量處理500張胸環靶圖像,建立了包含3 483個正樣本,7 204個負樣本的數據集。

圖6 數據集展示Fig.6 Display of datasets
搭建基于ResNet50的深度神經網絡模型,并在原有網絡結構的基礎上進行改進。引入注意力機制捕獲高級語義信息,加強模型對于彈孔特征的學習,以提高其分類精度。目前,大多數學者都致力于開發更復雜的注意力模塊以追求更高的性能,導致模型的復雜度增加,有時反而會影響訓練效果[10]。為解決該問題,Qilong Wang等于2020年提出了ECA[14](Efficient Channel Attention)。ECA-Net是一種輕量化的通道注意力模塊,它能夠平衡模型的性能和復雜性,雖然僅涉及少數幾個參數,但卻能夠帶來明顯的性能提升,ECA block的結構如圖7所示。

圖7 ECA模型結構示意圖
GAP(Global Average Pooling)為全局平均池化,σ為激活函數。ECA能夠通過核為k的快速1D卷積實現,k表示局部交叉跨通道交互的范圍,圖7中k的取值為5。這里使用一種自適應確定k的方法,避免通過交叉通道手動對其進行調整:
(2)
其中,|t|odd表示與t最近的奇數。本文針對ResNet50模型的Identity block與Conv block進行修改,在其基礎卷積塊中插入ECA block。另外,使用Mish[13]激活函數代替ReLU連接各block,其表達式:
f(x)=xtanh(ln(1+ex))
(3)
Mish的優點在于其正值可以達到任何高度,避免了由于封頂而導致的飽和。對于負值的輕微容忍允許更好的梯度流,且平滑的激活函數能夠使樣本特征信息深入神經網絡,從而獲取更強的準確性和泛化性。綜上,改進后的Residual block結構如圖8所示。
基于PyTorch深度學習框架搭建模型并進行訓練,訓練過程中的部分參數如表2所示。

圖8 改進后的Residual block結構框圖

表2 模型參數
為防止過擬合現象,增強模型的泛化性,引入數據增強操作,按一定的概率對樣本圖像進行旋轉、水平翻轉處理。另外,由于數據集中負樣本的數量較多,正負樣本比例有些失衡,引入焦點損失函數[12](Focal loss)以降低大量的簡單負樣本在訓練中所占的權重,其表達式:

(4)
其中,α取0.25,γ取2。經過75輪的訓練,驗證集的準確率(Accuracy)達到了95.72%,查全率(Recall)達到了93.61%,很好地完成了彈孔識別任務。
根據分類模型的輸出以及ROI檢測結果,剔除胸環靶圖像中的非彈孔區域,最終實現彈孔的檢測。基于Windows 10系統,3.60 GHz Intel Core i7-9700K處理器,16 GB內存的實驗環境,利用本文算法對多幅從不同靶場、不同時間采集到的胸環靶圖像進行彈孔檢測測試。記錄各圖像測試中的虛警(False Positive)率、漏檢(False Negative)率以及程序的運行時間,如表3所示。在測試中,若出現將多個重疊彈孔誤判為單個彈孔的情形,算作一次正確檢測,其余均計為漏檢。由表3的測試結果可以看出,算法的準確率較高,在正常情況下,虛警率和漏檢率均能夠保持在較低的水平,且檢測速度較快,基本能夠適應30 fps的圖像傳輸速度。在圖9中,1號樣本和2號樣本分別為傍晚及正午時所采集,且成功檢測出了全部彈孔,由此可見,算法能夠適應不同光照條件下的靶場環境。算法存在的不足之處在于,當胸環靶圖像中的彈孔數量較多時,對于重合彈孔的檢測精度較低,容易將重疊程度較大的兩個或多個彈孔誤判為一個彈孔,這也是造成漏檢的主要因素。5號樣本和6號樣本的檢測結果如圖10所示,對于同種類型的靶子,前者的測試結果明顯優于后者,究其原因,是6號樣本中的彈著點過多,存在大量的重疊彈孔,部分被誤判為單個彈孔,造成了漏檢。虛警主要是由于射擊次數較多時,有時會將靶紙震裂,產生的裂痕會被誤判為彈孔。在實際射擊訓練中,這種情況比較少見,且能夠通過調整分類模型訓練集中負樣本的組成來得到改善。

圖9 彈孔檢測圖Fig.9 Bullet hole detection results

圖10 彈孔檢測圖Fig.10 Bullet hole detection results
本文將傳統的圖像處理方法與深度學習的方法相結合,取長補短,提出了一種基于計算機視覺技術的彈孔檢測算法。通過圖像預處理、ROI檢測以及彈孔識別3個步驟實現了胸環靶圖像中所有彈孔的檢測。實驗結果表明,本算法具有較高的精度以及良好的時效性,且適應性強,有效推動了基于計算機視覺的自動報靶系統的應用進程。