張琦,區錦鋒,周華英
(1.廣東藥科大學 醫藥信息工程學院,廣東 廣州 510006;2.廣東省中醫藥精準醫學大數據工程中心,廣東 廣州 510006)
傳統中藥包括中藥材、中藥飲片和成品中成藥三大部分。其中,中藥飲片是指在中醫藥理論指導下,根據辨證論治和調劑、制劑的需要,對中藥材進行特殊加工炮制后的制成品[1]。近年來,中藥飲片產業取得了長足的發展,在國內外得到越來越多的認可。由于我國中藥材品種繁多、來源復雜,很多中藥飲片外形相似,容易混淆,一般用肉眼難以鑒別真假。傳統的人工鑒別方法主觀性強、誤判率高,而基于計算機視覺的中藥飲片識別分類具有快速、準確等特點,使飲片篩選智能化[2]。
使用計算機視覺對中藥飲片圖像進行智能識別,經歷了機器學習與深度學習兩個階段。機器學習算法主要依靠提取中藥飲片圖像特征進行分析識別,包括大小、顏色、形態與紋理等[3-6]。這種方法容易產生過擬合現象,雖然在訓練集上識別結果的準確率很高,但是在測試集上效果不甚理想[7]。而深度學習擁有強大的泛化性,可以針對機器學習的不足,提高中藥飲片圖像識別的準確率。文獻[8]利用GoogLeNet 深度學習模型對8 886 張中藥飲片圖像進行訓練,平均識別率達到92%,優于HOG 特征的機器學習算法。文獻[9]利用AlexNet、VGGNet 和ResNet 三種逐通道卷積(Depthwise Convolution)神經網絡算法,基于遷移學習對7 種不同的中藥飲片進行分類,其中ResNet 效果最佳,正確率高達98.17%。
傳統機器學習在訓練時需要標注大量數據,非常耗時耗力,如果沒有標注數據則模型性能較差。而遷移學習[10](Transfer Learning)則是將已訓練好的模型應用到新的不同數據集上,從而達到模型或數據可以復用的目的。通過使用其他相關任務訓練模型的參數,即使只有一個小的數據集,也可能達到很好的性能[11]。本文利用在ImageNet 數據集上預訓練的Xception 網絡,將其權重參數遷移到本文的中藥飲片識別模型中來。
深度可分離卷積在常規卷積的基礎上做了改進,深度可分離卷積包含逐通道卷積和逐點卷積(Pointwise Convolution)兩個過程[12],可以降低模型復雜度、減小模型大小、提高模型的計算效率等。由于普通的卷積操作需要對所有輸入通道進行卷積計算,導致模型參數數量和計算量都變得更大;而深度可分離卷積通過更精細的卷積操作來捕獲局部特征和空間信息,避免了不必要的冗余參數。因此,在保持模型規模相對較小的情況下,可以提高模型在各種任務上的表現。深度可分離卷積將卷積操作主要分為兩個步驟,分別是逐通道卷積和逐點卷積。
1.2.1 逐通道卷積
逐通道卷積的目的是在每個通道上分別提取特征,使得網絡可以學習通道之間的不同特征表示。通過這種方式,逐通道卷積在減少參數量和計算量的同時,能夠保持較高的特征表達能力。
逐通道卷積是深度可分離卷積操作中的重要組成部分之一,它使用尺寸大小為D×D的卷積核K對輸入特征圖F中的每個通道進行卷積運算,從而得到輸出特征圖G中的每個通道和位置(x,y)的特征表示,逐通道卷積的計算公式如下:
式中:x'和y'為輸入特征圖F的位置;m為輸入通道的索引;K(x-x',y-y',m,i)為卷積核在位置(x,y)上對輸入通道m和輸出通道i的權重;sum 為對所有的輸入通道m和卷積核位置(x-x',y-y',m,i)的加權和。
式(1)表示在每個輸出通道i和位置(x,y)上,將輸入特征圖F的每個通道m的值與對應位置的卷積核K(x-x',y-y',m,i)進行元素級乘法,并將所有通道m的乘積相加,得到輸出特征圖G的對應位置(x,y) 的值。
1.2.2 逐點卷積
逐點卷積的作用是在保持特征圖尺寸不變的同時,通過對每個通道進行加權和的操作,實現通道之間的信息融合和特征變換。逐點卷積通常用于調整通道數、改變特征圖的表示維度,或者進行特征圖之間的非線性變換。
假設輸入特征圖為Hin,輸出特征圖為Hout,卷積核為W,逐點卷積是深度可分離卷積中的另一個過程,它在特征提取和融合的過程中扮演著至關重要的角色。通常使用大小為1×1 的卷積核對輸入張量中的每個通道上的特征進行卷積運算。由于卷積核的大小非常小,因此它在計算時可以非常高效地對每個元素進行卷積計算,并得到相應的輸出特征圖。對于輸出特征圖Hout的每個通道j和位置(x,y),逐點卷積的計算公式如下:
式中:i為輸入通道的索引;W(i,j)為卷積核在輸入通道i和輸出通道j之間的權重;sum 表示對所有的輸入通道i的加權和。
式(2)表示在每個輸出通道j和位置(x,y)上將輸入特征圖Hin的每個通道i的值與對應位置的卷積核W(i,j)進行元素級乘法,并將所有通道i的乘積相加,得到輸出特征圖Hout的對應位置(x,y)的值。
需要注意的是,逐點卷積不改變特征圖的空間分辨率,只對每個通道進行獨立的線性變換。深度可分離卷積操作的數字表達式如下:
式中:yi,j,k為輸出張量中第i行、第j列、第k個通道的元素;Cin為輸入張量的通道數;Kh和Kw分別為卷積核的高度和寬度;wr,s,p,k為卷積核中第r行、第s列、第p個通道與第k個通道的權重;Xi+r,j+s,p為輸入張量中第i+r行、第j+s列、第p個通道的元素。
深度可分離卷積的流程圖如圖1所示。在逐通道卷積階段,為了對輸入張量的每個通道進行卷積運算,通常會使用一個僅包含一個通道的卷積核,以便從每個通道中提取出不同的特征信息,并將它們合并成一個深度張量。這樣就可以利用卷積核的滑動窗口特性,對輸入張量中每個通道的每個位置進行卷積計算,從而獲得一個具有更多特征信息的深度張量。而在逐點卷積階段,為了進一步提取和融合這些特征信息,使用1×1 的卷積核對深度張量中的每個元素進行卷積運算,這樣就能夠對不同位置的特征信息進行加權融合,并得到一個輸出張量。通過這種方式,可以利用卷積運算高效的特征提取能力實現對輸入張量中復雜特征的快速提取與融合。

圖1 深度可分離卷積的流程圖
Xception[13]全稱為Extreme Inception,是谷歌公司提出的對Iception V3 的一種改進模型,該模型結合了深度可分離卷積(Depthwise Separable Convolution)和ResNet結構里面殘差連接的思想,深度可分離卷積可以實現對特征張量的跨通道相關性和空間相關性的完全解耦。相比于普通卷積,深度可分離卷積的參數數量和運算成本都降低了,但是深度可分離卷積的復雜性更高,使得模型的層數更深。殘差結構則是保證在層數更深的前提下,能大幅度地保留原來的特征,保護信息的完整性,減少在卷積的過程中特征張量的信息丟失、損耗的問題,使得模型學習隨著深度的增加效果也逐漸增加。
Xception 結構如圖2 所示,圖中的SeparableConv 代表可分離卷積結構,ReLU 代表神經網絡激活函數,Conv代表普通卷積結構,Stride 代表卷積滑動步長。殘差連接的卷積層為下采樣卷積層,相比于池化層,下采樣卷積控制了步進大小,信息融合更好,能更好地保留特征張量原來的信息。模型分為輸入層、中間層和輸出層三個結構,其中包含了34 個可分離卷積,中間層每一層結合了3次結構,特征張量在中間層需要重復循環8次該結構,最后到輸出層再進行卷積操作。

圖2 Xception 結構圖
由于目前并未有公開的中藥飲片圖像大規模數據集,因此本文以香港浸會大學所建的中藥材圖像數據庫為基準,從中選取60 種常見中藥飲片作為實驗數據集,部分飲片圖像如圖3 所示。

圖3 部分中藥飲片圖像
選用的中藥飲片均在正規機構購買,為了提高模型測試的魯棒性,利用單反相機對單個中藥飲片的雙面圖像進行拍攝采集,得到11 125 張圖像,每種飲片圖像數量在200~250張之間。另外,通過網絡爬取獲得1 963張圖像,共計13 088 張。由于網絡抓取的圖像可能會存在背景干擾、圖片水印以及圖像不清晰等問題。因此,采用以手工拍攝為主與網絡爬取相結合的方式,不僅能保證中藥飲片的準確性,而且有助于提高模型的性能效果。
由于數據集格式參差不齊,包含了單個飲片的部分圖片和多個同種飲片聚堆的圖片,為了提高模型測試的穩定性,首先提取每個飲片獨立為一張圖像,尺寸大小為299×299,并對圖像中像素點進行歸一化,使像素值介于0 和1 之間,實驗將會按照7∶2∶1 的比例劃分訓練集、驗證集以及測試集,其中9 163 張圖像為訓練集,2 617 張圖像為驗證集,1 308 張圖像為測試集。將每種飲片用不同的數字進行標記,實驗訓練將對應的標簽轉化為對應的獨熱編碼方便訓練。
實驗硬件為聯想臺式計算機,CPU 為Intel Xeon Platinum 8260C,GPU 為NVIDIA GeForce RTX 3090,顯存24 GB,內存86 GB。采用的是Windows 10 操作系統,Python 版本為3.9,TensorFlow 版本為2.8.0,并采用GPU 加速訓練,CUDA 的版本為11.2。
本實驗基于Xception 模型網絡,遷移在ImageNet 數據集上預訓練過的權重參數到本次中藥飲片圖像實驗中,但對其中的權重進行微調。微調是指將其靠近輸出的幾層解凍,并將這幾層與分類器聯合訓練,讓模型更加適用于當前要解決的問題。Xcepiton 結構分為14 個模塊,除了第一個模塊外,其余模塊至少包含兩次或兩次以上的分離卷積結構,本實驗將凍結第1 個模塊,通過訓練次數不斷迭代來更新其他13 個模塊和模型拼接的全連接層結構參數,使得訓練模型能更好地擬合數據。
實驗采用SGD 優化器,初始學習率設置為0.01,動量值為0.9,并且利用Nesterov 動量更好地調整學習率的梯度方向。批量大小Batchsize 設置為41,訓練次數Epochs 為100,分類器則選用Softmax,運用交叉熵Categorical Crossentropy 作為損失函數,將拆分后的訓練集和驗證集輸入到模型進行迭代訓練和驗證,最后得出60 種中藥飲片識別模型。
輸入60 種中藥飲片圖像到網絡模型中,得到飲片圖像的顏色、形狀與紋理特征,使得每種飲片具有自己的辨別特征。通過可視化方法可以將每次卷積后的特征圖顯示出來,如圖4 所示為部分中藥飲片的第1、2、3及最后一層卷積、激活后的可視化特征圖。

圖4 部分飲片的可視化特征圖
對于識別本實驗中的60 種中藥飲片圖像,圖5 展示了訓練集與驗證集的分類準確率與損失率,其中訓練集的準確率為100%,而在驗證集上的準確率稍低,為97.42%,損失值為0.155。從圖5 中可以看出,在整個訓練過程中,訓練集隨著訓練次數的增加,它的準確率在快速上升,而損失率則穩步下降,大約經過了20次訓練后基本趨于穩定。因此,可以得出本文構建的飲片識別模型能夠很好地擬合驗證集。最后再通過輸入測試集來驗證模型的準確率,達到97.26%。實驗數據表明使用遷移學習可以使模型快速地收斂,參數擬合數據集的速度更快,即使模型在較少的訓練次數中也能達到較高的準確率。

圖5 訓練集與驗證集的準確率與損失率
為了進一步評估模型的分類性能,實驗選用混淆矩陣這一評價指標對本文模型進行評估,它可以直觀反映模型對不同種類樣本分類性能的好環。本模型對于60種中藥飲片進行分類,其中40 種飲片達到100%的識別率,但有20 種飲片發生識別錯誤,圖6 所示為其混淆矩陣。圖中x軸為預測的飲片類別,y軸為實際的飲片類別,每一列中的數值表示真實數據被預測為該類的數目。因此,混淆矩陣中標識出來的數字越大,則說明模型預測的飲片種類準確性越高。從圖6 中得出,出現分類錯誤的中藥飲片樣本數量均在3 個以內,只有白術和當歸的錯誤數量較多,分別為6 個和5 個。這可能是由于白術與當歸的數據集中的飲片形態數量過多,外形與其他飲片過于相似,導致難以正確識別。

圖6 識別錯誤的中藥飲片的混淆矩陣
針對中藥飲片數據集規模較小,本文提出采用遷移學習的方法,基于Xception 網絡,通過賦予模型預訓練參數并微調模型的方式進行訓練。實驗結果表明,模型對中藥飲片圖像分類效果較好,達到了97.26%的準確率,相比文獻[8]中使用GoogLeNet 模型的方法,準確率提升了4%。雖然數據量有限,但所選飲片種類中多個飲片形態相似,外形難以區分,本文模型依然可以準確區分出這些易混淆的中藥飲片,證明了Xception 模型對于中藥飲片圖像識別具有一定的優勢。
注:本文通訊作者為周華英。