袁柱
(廣東工業大學計算機學院,廣州 510006)
作為秦始皇統一六國后官方指定的文字,小篆廣泛存在于牌匾、印章、碑文等地方。但由于中國漢字經過了多次的演變和簡化,距今兩千多年的小篆和現如今的簡體漢字相差甚遠,普通人或許可以通過搜索引擎查找出某些簡體漢字所對應的小篆字體,卻很難認出牌匾或印章中的小篆是哪些漢字,所指何意,更別說古籍中成文的小篆。因此,在很多時候,我們需要一種從小篆轉換到簡體漢字的方法。但是由于中國的漢字個數眾多,小篆字體較為復雜,很長一段時間內都沒有找到一種較好的識別方法。
最近幾年來,隨著深度學習的興起和不斷地發展,卷積神經網絡(Convolutional Neural Network,CNN)在圖像識別領域上取得了大量突破性的成果。從奠基性的LeNet[],到將卷積神經網絡發揚光大的AlexNet[2]、VGG[3]、GoogLeNet[4]、ResNet等,都在越來越復雜的場景下,進一步地提高了圖像識別的準確率。眾多的模型結構證明,卷積神經網絡所學習到的特征可以超越手工提取的特征,而經過良好設計的卷積神經網絡模型比傳統的機器學習模型在圖像識別領域更具有優勢。與此同時,眾多取得成功的網絡模型也為從業者提供了方向上的指導。本文基于識別小篆字體的目的,在AlexNet的基礎上設計了適合于識別小類別小篆字體的模型,并取得了較好的結果。
本文使用的小類別小篆數據集是通過網絡爬取和多人手寫的方式所得。該數據集包含20類小篆的字體,分別代表了20個姓氏。每類小篆字體都包含了120張訓練數據和60張測試數據,每張圖片的規格都是112×112像素顏色不同的png格式。

圖1 部分訓練數據集
大規模的數據集是成功應用深度卷積神經網絡的前提。由于構建的數據集較小,因此需要通過數據增廣(Data Augmentation)技術來對訓練圖像做一系列的隨機改變,產生更多相似卻又不相同的訓練樣本。本文用到的數據增廣技術包括:小角度的旋轉、平移和拉伸[5]。小角度的旋轉包括向左旋轉和向右旋轉一定的角度。由于漢字有上下左右之別,本文的旋轉的角度范圍在-25°~+25°之間。平移包括將文字從原來的位置沿著X軸和Y軸的方向平移到另外一個地方去。由于CNN對圖像具有平移不變性,文字的位置雖然發生了變化,但平移之后的圖像,CNN依然能夠探測出來。拉伸將文字沿著某個方向增大文字的覆蓋范圍。

圖2 數據增廣
通過上述的四種數據增廣技術,可以產生大量的訓練樣本,從而擴大訓練數據集的規模,豐富樣本空間中的樣本個數。
在原始的數據集中,小篆字體包含不同的顏色。由于字體的顏色與字體的識別在本文并無本質的關系,因此在訓練網絡之前,需要將所有的字體圖片都轉換為灰度圖片,用黑白兩色就可以完整地表達了特征的信息。
基于AlexNet模型結構的設計思想,構建了適用于小篆識別的卷積神經網絡模型。為了加快模型的訓練,在該模型的基礎上引入了批量歸一化(Batch Normalization,BN)算法。
批量歸一化算法是由谷歌研究院Sergey Ioffe[6]提出來的,該算法通過減輕神經網絡訓練時的內部協變量偏移(Internal Covariate Shift),從而有效地提高神經網絡的訓練速度。在模型的訓練過程中,批量歸一化算法利用小批量訓練樣本上的均值和方差,不斷調整神經網絡的中間輸出,使整個神經網絡在各層的中間輸出數值更穩定,從而更容易訓練。
假設神經網絡中某層的輸入是大小為m的小批量數據X={x1,…,xm},其中小批量X中任意的樣本xi∈Rd,1≤i≤m。對小批量X求均值和方差:

接著標準化xi中的每一維度,得到:

其中?是一個大于0很小的常數,是為了保證分母大于0。
在上面標準化的基礎上,批量歸一化引入了兩個可以學習的d維向量模型參數:拉伸參數γ和偏移參數β,它們與?分別做按元素乘法和加法計算:

得到的yi就是批量歸一化算法對于輸入xi的輸出。
在神經網絡的訓練中,批量歸一化算法常常作為網絡模型中的一層BN層,且通常應用在卷積層和全連接層中。在對卷積層做批量歸一化的時候,BN層通常加在卷積計算之后、應用激活函數之前。在對全連接層做批量歸一化的時候,BN層通常加在仿射變換和激活函數之間。本文選擇除了輸出層外,對所有的全連接層和卷積層做批量歸一化處理。
與AlexNet相似,本文構建的卷積神經網絡結構主要由卷積層、池化層和全連接層組成。卷積層具有較強的特征抽象和提取的能力,通過多個卷積核能夠學到多種不同的特征。池化層對卷積層輸出的特征圖做聚合統計,降低特征圖的維度。與AlexNet不同的是,為了提高模型的訓練速度,本文的模型在卷積層和全連接層中均加入了BN層。此外,與ImageNet數據集相比,考慮到本文所使用的數據集的真實情況,在一定程度上減少卷積層的通道個數,降低部分卷積層的卷積核大小。具體模型結構如圖3所示。

圖3 CNN模型結構
在該模型中,池化層maxpooling都設計為步幅(strides)為 2、填充(padding)為 0、池化區域為 3×3 的固定結構。卷積層的結構如表1所示。

表1 卷積層的結構
對于每個輸入數據,該模型將進行如下處理:
首先,數據將通過一個包含了64個通道、卷積核大小為7×7的卷積層C1,卷積計算后輸出的中間數據變為64張規格為54×54的特征圖,接著經過池化層,特征圖的大小變成了26×26。
其次,上一層的特征圖輸入到第二個卷積層C2時(C2包含了128個通道、卷積核大小為5×5),經過卷積計算后得到了128張26×26的特征圖,同樣經過池化層后規格變為12×12。
隨后,數據將經過三個相似的卷積層,每個卷積層中卷積核大小都是 3×3,strides為 1,padding為 1;前兩層包含256個通道,最后一層卷積層包含128個通道。上一層特征圖經過連續的三個卷積層后規格依然是128張12×12的特征圖,再進行池化處理后,特征圖的規格變為128張5×5,展開成為128×5×5=3200維的向量連接到三個全連接層上。三個全連接層的神經元個數分別為1024、512和20。其中最后一層的20代表類別的個數。得到20個神經元的輸出后,進行Softmax處理,即對于每個神經元的輸出,進行如下計算:其中k代表輸出神經元的個數,V代表輸出i層第i個神經元的輸出。
最后,在每個卷積層中,卷積計算過后,都會進行批量歸一化的處理,處理過后經過ReLU激活函數作為下一層的輸入。同樣的,除了最后一層輸出層外,其他兩個全連接層在ReLU激活函數之前都經過了批量歸一化的處理。
模型的訓練優化算法為帶有動量(momentum)的小批量隨機梯度下降(SGD)算法[7],初始學習率learning_rate設定為0.01,momentum設定為0.9。模型每迭代15次計算一次模型在當前小批量數據上的識別準確率。在模型的訓練過程中,盡可能大地設置訓練循環次數,當觀察到模型在測試集上地識別準確率不再增加時,停止訓練過程。
實驗環境:Windows 10操作系統、NVIDIA GTX 1650顯卡、8G內存,深度學習框架為TensorFlow[8]。
本文采用對照實驗的方法,一組是不做批量歸一化處理,另外一組對卷積層和全連接層做批量歸一化處理。實驗結果如圖5、圖6所示,兩組實驗都能達到較好的識別效果,訓練數據集和測試數據集的識別率均可達到了94%。值得注意的是,不做批量歸一化處理的模型最少需要經過500次的迭代才能夠收斂,而經過批量歸一化處理的模型僅需要300次的迭代就可以收斂了。實驗表明,設計良好的卷積神經網絡對小類別的小篆識別能夠達到較好的識別效果;批量歸一化處理可以明顯提高網絡模型的收斂速度。

圖4 無批量歸一化

圖5 有批量歸一化
本文通過多種數據增廣技術擴大了訓練數據集,基于AlexNet設計了用于識別小類別小篆字體的網絡模型,取得了94%的識別準確率。同時探討了批量歸一化算法對模型訓練的加速效果,為小篆字體識別的研究和模型的訓練加速提供了新的思路,在工程上具有一定的實際意義。