叢林虎 何偉鑫
(海軍航空大學岸防兵學院 煙臺 264001)
隨著智能化時代的發展,大多數行業均向著人工智能化方面發展。部隊也在積極尋求著人工智能方面的應用。海航彈藥技術保障大隊任務繁忙,彈庫裝備出入庫次數較多,但當前的出入庫數據登記仍然使用手工登記的方式,這不僅浪費了時間與人力,同時與我軍的發展目標大相徑庭。而每一火工品上都有其獨一無二的編號,可以唯一標識該裝備,深度學習算法的革新使得識別該編號,實現自動登記成為了可能[1~4]。
文字識別指從圖片中定位并識別到文字,由于存在光照的變化以及圖像的復雜背景以及文字存在的多角度、多維、多長度,因此文字識別是難度系數較大的任務[5~8]。
傳統文本識別方法準確率較低,如模板匹配法在身份證號碼識別等應用中結果較差,該算法只有在字體統一清晰的阿拉伯數字的識別應用中有所建樹,較復雜的場景中就無法滿足需求。而OCR的通用方法:設計特征,提取特征而后進行分類,得出最終的識別結果,但效果也很難達到應用需求。針對傳統OCR的不足,使得基于深度學習的OCR大放異彩[9~12]。
基于深度學習的文字識別算法使文字識別技術落地成為了可能,其準確率有了較大突破,且無需花大量精力用以設計字符特征。在OCR系統中,神經網絡對特征進行提取和分類,字符圖像輸入到網絡,得到識別結果。在各項基于深度學習的文本識別算法中,CRNN以期優越的性能一度成為各項應用的首選,文獻[13]展示了其在多個數據集中的識別準確率均優于其他算法,同時CRNN能夠識別多方向的文本,對多種場景下也擁有較高的識別率。因此,彈目編號識別系統將使用CRNN作為識別算法。
CRNN是一種卷積循環神經網絡結構,用于解決基于圖像的序列識別問題,特別是場景文字識別問題。CRNN的網絡結構如圖1所示,其由三個部分組成,從上到下分別為卷積層、遞歸層和轉錄層。

圖1 CRNN結構圖
在卷積循環神經網絡的起始,圖像輸入到CNN層中而后得到特征序列[14]。RNN層預測特征序列的每一幀。卷積循環神經網絡的翻譯層將RNN輸出的預測轉換為標簽序列。雖然卷積循環神經網絡由不一樣的網絡構成,但可用一個損失函數聯合訓練CNN和RNN。
2.1.1 CNN結構
CNN采用的是VGG的結構,并且對VGG網絡做了一些微調,如圖所2示。

圖2 CNN網絡結構圖
從圖2可以看出,對VGG的調整如下:為了能將CNN提取的特征作為輸入,輸入到RNN網絡中,將第三和第四個maxpooling的步長從2×2改為了1×2,如此可使特征圖的寬度被更好的保留。同時在第五和第六個卷積層后面加上了BN層[15]以提升訓練速度。
該網絡的輸入為W×32單通道灰度圖,即輸入圖片的寬度無需固定,但其高度需調整為32。如包含10個字符的圖片大小為100×32,經該網絡后將獲得的特征尺度大小為25×1,獲得一個特征序列,每一列特征與原圖的一個矩形區域(如下圖所示)互相對應,這樣就很方便作為RNN的輸入進行下一步的計算了,而且每個特征與輸入有一個一對一的對應關系,而且改變后的池化層的步長能夠產生長寬比較大的感受野[16],使得網絡對寬度窄的文本識別更加容易如“1”。

圖3 CNN輸出圖
2.1.2 RNN結構
在卷積層的頂部建立了一個深度雙向LSTM網絡。循環層對每個幀xt都預測一個標簽的概率分布yt[16~17]。RNN單元在其輸入層和輸出層之間有一個自連接的隱藏層。每次接收序列中的幀xt時,其均用一個非線性函數來更新其內部狀態ht,該函數同時以當前輸入xt和過去狀態ht-1作為輸入:ht=g(xt,ht-1),接著ht對當前幀yt做出預測。所以yt值由之前的輸入以及當前的共同決定,所以當前幀同時利用前文信息。
LSTM(圖4)由內存單元和輸入門、輸出門以及忘記門組成。內存單元存儲歷史上下文信息,輸入和輸出門使單元格存儲較長一段時間的上下文。同時,細胞中的內存ct可以通過忘記門進行更新。LSTM的特殊設計使它能夠在多次訓練中保持穩定,從而能獲得長距離的上下文[18~21]。

圖4 LSTM結構圖
2.1.3 翻譯層
翻譯層是將RNN所做的每幀預測轉換成標簽序列的過程。從數學上講,翻譯層是根據每幀預測找到概率最高的標簽序列,其共有兩種翻譯模式,即無字典和基于詞庫的翻譯[22]。在無字典模式下,預測是在沒有任何詞庫的情況下進行的。在基于字典的模式下,通過選擇后驗概率最高的標簽序列進行預測。CRNN標簽序列概率采用Graves等提出的連接時續分類(CTC)進行計算[23]。
Django是基于python的web開源框架。過往進行web開發的時候可能進程緩慢、效率低下以及數據庫切換不便捷,為克服此類問題,Django進行了很好的設計[24]。
Django框架利用MVC設計模式,即模型,模板以及視圖,如圖5所示。

圖5 Django框架
1)模型主要處理數據相關事務,其與數據存取層對應;
2)模板主要處理相關決定,其與業務邏輯層對應;
3)視圖主要用于調用、存儲模型與相應邏輯,其與表面層對應。
數據模型層以及前端視圖層、業務邏輯層在本框架具備高內聚低耦合的特點,方便開發者更快速使用。同時,本框架采取ORM對象關系映射,可以更加方便地對數據模型進行設計以及交互,能夠提供表單模型以及傳統SQL語句的運行,豐富了數據庫的選擇性。本系統使用SQL server數據庫進行數據的存取和管理。系統采用Django框架進行搭建。
文章所用數據集為實地在海航某部彈藥技術保障大隊所拍攝數據集。研究發現,同一型號裝備的編號字體大小等均相同,而不同型號裝備之間的字體型號之間均存在著差別。于是每種型號之間均拍攝編號圖像若干,且文本圖像非嚴格的水平狀態,或多或少存在一定角度的傾斜,這是由于實際使用時,工作人員在進行文字識別的時候不可能隨時嚴格正對導彈編號。
對于所拍攝的數據集,訓練深度卷積神經網絡顯然是數據集遠遠不夠,且該數據集無法像普通圖像分類人物一樣進行數據增強。因為文本識別任務中文本無法進行旋轉、鏡像等方式的處理。因此,如果僅用提取的數據集進行訓練,容易造成過擬合,對驗證機的識別結果也會較差。因此需要合成新的文本數據集。

圖6 原始數據集樣式
具體步驟如下:
1)確定不同裝備的外觀背景所需圖片數量,這里我們選取六種背景圖,每種背景圖生成圖片20000張;
2)生成目標文本的同時,每個目標文本的字體均隨機選擇,并在一定的范圍內隨機設置文本的彎曲程度;
3)隨機從文本數據中獲取內容,長度4~10隨機,作為要填充的文本內容,這里文本數據為阿拉伯數字0~9,小寫字母a~z,大寫字母A~Z以及特殊字符“—”。
4)將文本背景融合,并且將區域進行一定角度的旋轉;
5)對文本目標區域添加噪聲和顏色信息等。
文本合成的步驟就是以上五步,通過合成產生120000張圖片保證后續文本識別模型的訓練。生成的圖片數據集如圖7所示。

圖7 人工合成數據集樣式
本文實驗在Ubuntu16.04系統下進行,CPU:酷睿 i5-8400 2.80GHz,顯卡為 GTX1060,顯存為6GB,計算機內存為16G;python 3.6,配套OpenCV、numpy等庫支持使用,使用的深度學習框架為ten?sorflow。使用Adam優化器進行優化,初始學習率為0.0001。圖片大小設定為W*32,迭代次數到510次后,準確率達到了要求,LOSS也降到小數點后兩位。

圖8 CRNN訓練圖
從圖可以看出LOSS以及Accrucy已經達到要求,所以模型達到一個較好的性能,且使用測試圖片可以看出模型對陌生圖片的測試也全部準確。因此,使用訓練好的模型,設計實現導彈編號識別系統可以替代人工對出入庫導彈的登記。
B/S模式是一種網絡結構模式,該模式使得客戶端得到了統一,將所要實現的功能核心集中到服務器上,如此便可減少了系統開發以及維護的開銷;用戶電腦只需安裝一個browser,server上安裝SQL server等相應數據庫;browser通過Web Server與數據庫進行數據交互[25]。
根據第三節訓練以及測試好的CRNN模型,設計實現基于CRNN的導彈編號識別系統,調用OpenCV庫進行文本區域的切割。
圖9為導彈出入庫管理系統的工作主界面,通過調用攝像頭,獲取圖像導彈編號的圖像,而后OpenCV將具有編號的部分具體提取出來。訓練好的CRNN模型根據OpenCV提取出來的文字部分進行識別,得到最終的導彈編號,工作人員可據此進行操作。目前,本系統已在海航某部彈庫進行實地調試,可以滿足彈庫的工作需求。

圖9 系統界面圖
海航某部彈庫日常工作繁忙然而用人工登統計的方式進行工作導致人力以及時間的浪費,為克服此不足,設計實現了基于深度學習的導彈編號識別系統,實現導彈出入庫的自動化登統計。根據實地所拍攝的數據集,對照進行文本識別數據集的合成,而后利用合成的數據集進行CRNN模型的訓練。經過測試,模型滿足識別要求。
利用訓練測試好的CRNN模型,在Django框架上設計實現導彈編號識別系統,經過在海航某部彈庫的測試,設計的導彈編號識別系統能夠滿足要求,代替人力進行導彈出入庫的自動登記。