張萬義,張千,潘繼波,張浩宇,孟宇翔,相玖紅
(1.東營市勝利醫院,山東 東營 257091;2.中國石油大學(華東)計算機科學與技術學院,山東 青島 266580)
中草藥作為中醫藥材,是中華民族在與疾病長期斗爭的過程中積累的寶貴財富。目前各地在救治新冠肺炎過程中,廣泛運用中醫藥,顯著提高了治愈率和成功率。國務院印發的《中醫藥發展戰略規劃綱要》中指出,在繼承發揚中醫藥優勢特色的基礎上,充分利用現代科學技術,推動中藥現代化和國際化,以滿足時代發展和民眾日益增長的醫療保健需求,是歷史賦予我們的責任。
目前線上對中草藥進行分類和介紹的軟件還比較少,對于中草藥分類的研究比較少,現有的研究只是對少數的植物進行分類。各個地域的中醫對于不同中草藥的需求也不一樣。近幾年來,深度學習技術發展迅速,在分類識別這方面已經取得了非常好的效果,所以我們采用深度學習的方法對收集到的中草藥植物圖像進行分類。針對黃河三角洲一帶的中醫大夫的需求,使用深度學習相關技術來制作一款實現線上智能識別的APP,為經驗尚淺的大夫們辨識中草藥提供方便,為中醫的發展起到一定的幫助,為中醫的線上發展提供新的思路。
目前,對于中草藥圖像并沒有一個非常全面的數據庫,所以我們首先收集并建立了包含數量較多的中草藥圖像數據集。本項目與山東省名中醫藥專家張萬義博士團隊合作,由醫生團隊提供中草藥圖像數據集。使用最近比較流行的python語言,在Django[3]框架上進行具體實現。將近300種中草藥數據存放在MySql[7]數據庫中。將所需要的圖片文件放在Django項目之內方便快速讀取,部分圖片直接放在前端工程中方便快速加載。將工程部署在騰訊云[8]服務器上,保證項目可以隨時無間斷地運行。前端用CSS進行布局,用JavaScript進行函數編寫[5],充分考慮用戶的體驗,設計了合理并且能充分展示所要顯示的藥品信息的界面。
查詢功能主要分為三個模塊:按名稱關鍵字查詢、按首字母查詢和按照功效查詢。在mysql數據庫中,因為中草藥的名稱是可以唯一確定這種中草藥對應的全部信息的,一條記錄對應一種草藥名稱,所以數據庫中只設置一個數據表,取名為herbalplant。表中包含的字段包括hid(自動生成的記錄編號,主碼)、name(中草藥名,候選碼),name_supply(別名)、family(科類)、genus(屬類)、character(形狀)、field(分布)、officinal_part(入藥部位)、value(藥用價值)、latin_name(拉丁語名,候選碼)、english_name(英文名)、effect(功效分類)。用戶在選擇查看一種中草藥的信息時,數據庫中的這些信息能夠全部反饋給用戶。關鍵字查詢利用了數據庫的模糊查詢機制,按首字母查詢利用了數據庫中的english_name字段,而按照功效查詢則利用了effect字段。
此功能模塊主要適用于已知中草藥的全稱或者全稱的一部分,然后獲得全稱中包含輸入內容的中草藥。如圖1所示,這是打開小程序后的首頁,在上方的輸入框中輸入關鍵詞,比如“白”。如圖2所示,是搜索后的結果。因為利用的是數據庫的模糊查詢機制,關鍵字必須在名稱中連續存在。

圖1 小程序首頁

圖2 關鍵字“白”查詢結果
針對黃河三角洲特有的十七種中草藥進行深度學習識別。用tensorflow[2]和keras[6]等工具對圖片進行處理,借助大量的訓練集對機器進行訓練,通過CNN算法讓機器掌握每一種中草藥的若干特征,從而讓機器能夠“認識”每一種中草藥。在給出一張中草藥的照片后,機器能夠準確識別出中草藥。
對其中17種中草藥識別的過程是通過從相冊選取或者拍照上傳一張中草藥的圖片,系統會告訴用戶這張圖片最可能對應哪種中草藥,并且提供識別結果中的中草藥詳情頁的鏈接。需要識別的17種中草藥包括:百合、薄荷、車前、枸杞、益母草、桔梗、酸棗、薏苡、蒲公英、決明子、艾葉、黃精、黃芩、羅布麻、馬齒莧、茵陳、蛇床。
因為本次研究沒有現成的對應這17種中草藥的優質數據集,從網上爬取的數據集首先需要人工剔除一些并不能展現對應中草藥和重復了的圖片。即便這樣,由于爬取的原始圖片的分辨率參差不齊,很多圖片的分辨率較低也會成為限制,很難支撐太多的卷積層和池化層。而且常用的VGG-11、LeNet、AlexNet[4]等模型計算非常復雜,所以本次研究選取了通道數較少的VGG模型,并以其為基礎,配合使用Relu激活函數和Adam[1]優化算法。
使用爬蟲[9]在百度和必應搜索引擎上爬取每種中草藥的圖片。因為爬取的圖片集總體質量不高,所以需要經過人工篩選的過程,保證最終的原始數據集中的圖片都能正確反映對應的中草藥。因為所獲取的圖片集的最小行/列分辨率為165,所以設計了三層卷積層+三層池化層的結構??紤]到池化層的輸入應該為偶數,經過分析后得出處理后的數據集最大分辨率在這種結構下為160×160。
將原始數據集拆分為訓練集和測試集兩組,訓練集用于深度學習訓練階段,測試集用于檢測訓練的效果。將原始圖片設置標簽,因為目前識別的中草藥一共十七種,所以打標簽的時候,讓一種中草藥的訓練集名字中的前兩個數字一樣,從而讓系統實現區分這十七種中草藥的訓練集的效果。后來采用了python批量打標簽的方法讓這個過程變得更為高效。驗證集與之同理,模型取得驗證集對應的中草藥種類,跟預測的結果進行比對,從而得到最終的準確率。如圖3為對蒲公英的圖片集批量打標簽后的蒲公英數據集,可以看到其中的所有圖片的標簽中的前兩位數字都是08,表示蒲公英是識別模型中的08號中草藥。訓練時用python中的正則表達式提取出標簽中的前兩位數字,轉化為對應的整數,然后跟識別完成后得到的索引值做對比,如果相同說明識別的結果是準確的。
先統計每個文件中圖片的個數,然后將所有原始數據經過灰度化并將大小調整為160×160,最后一層的輸出為20×20,再繼續增加層數的意義已經不大了?;叶然蟮钠压祿鐖D4所示,此時的數據集中圖片的大小全部變為160×160。使用Keras在安裝了Tensorflow的環境下進行訓練。

圖3 蒲公英數據集

圖4 灰度化后的蒲公英數據集
將上述中草藥庫的功能設置在同一個微信小程序[10]之中,作為其“中草藥識別”功能模塊。訓練好了的模型文件提前放到服務器上,然后前端對后端發送請求并上傳要識別的圖片后,將上傳的圖片文件轉化為二進制格式,如圖5和圖6所示。然后將模型文件調入,根據生成的二進制預測數組對上傳的圖片進行預測,預測值越大,說明圖片顯示的是該值對應的中草藥的概率就越大。將預測的編號傳到前端,前端將編號轉化為對應的草藥顯示出來。

圖5 原始圖片

圖6 上圖轉化成二進制的數組
Batch(批尺寸)過小時,驗證的準確度較低;而batch值達到了20之后,繼續增加效果并不明顯。Epoch(訓練輪數)的值較小時,驗證的準確度度較低;達到30輪后模型已經“熟悉”了訓練集,繼續增加輪數對準確度的增長效果較小。之前使用過處理之后為126*126的訓練集和測試集,可以明顯看出改用160*160的訓練集和測試集后準確度也有所提升,因為分辨率較大意味著較多的有用數據,有利于更好地提取一種中草藥的特征。合理設置這些參數,使對從訓練集分離出來的驗證集的平均識別率達到96%,圖7展示了其中一次的驗證結果。由此可以看出batch、epoch和分辨率等參數對于識別率的重要意義。

圖7 對訓練集中取出來的驗證集的一次測試結果
因為數據集較少,在有些圖片中,識別的最佳答案和實際圖片呈現的內容還是會出現一些偏差,所以采取最可能答案+備選答案的呈現模式。對一張圖片進行識別后,會得到包含17個和為1的元素的numpy數組,選取兩個最大的值的位置,將這兩個位置對應的中草藥作為前二可能的識別結果;第一個結果作為最佳答案,第二個結果作為備選答案。部分代碼(運行在Pycharm中)如下所示:

賦值后m中為預測數組,num存放最可能的結果的編號,然后將該位置的值變為數字終端最小值。然后再找到此時值最大的值的索引,即原數組中值第二大的值的索引,存放在num1種。此時原數組中兩個最大值的索引,將這兩個索引合成一個五位數,前端即可在該五位數中的第2、3位找到num(最可能結果的編號)的值,第4、5位找到num1(第二可能結果的編號),然后即可在前端完成轉化。
圖8為初始界面,即進入“黃河三角洲本草”小程序后點擊下方的“中草藥識別”進入的界面。圖9為選擇完本地圖片或拍照后的效果,對應的圖片已經顯示在圖片框中。圖10和圖11為選擇好圖片后點擊“識別中草藥”得到的結果,(如果未選擇圖片,點擊識別按鈕后會提示未選擇圖片,從而不能進入下一頁)圖中正確識別出了“益母草”,并且提供了另一個相對可能性大一些的答案“桔?!?。并且點擊這兩個按鈕可以分別進入益母草和桔梗的詳情頁。

圖8 中草藥識別功能首頁

圖9 選擇好圖片后的界面

圖10 識別結果(上)

圖11 識別結果(下)
如圖12所示,在分類頁面點擊“按功效查詢”,然后選擇想查詢的中草藥的功效分類,如“理氣藥”。如圖13所示,即得到數據庫中對應該功效的全部中草藥,圖中所列的中草藥均屬于“理氣藥”。此功能一般用于查看某一種功效的中草藥有哪些。

圖12 按功效查詢頁

圖13 “理氣藥”查詢結果
如圖14示,在首頁或搜索頁面點擊某一項中草藥,就會顯示中草藥的詳細信息,包括簡介、功效作用、性狀三個部分,包含的內容包括名稱、拼音、拉丁文、科、屬、產地、功效作用、性狀,這些內容均是來源于MySQL數據庫中。

圖14 白刺簡介
總共對蒲公英、決明、車前、益母草、薄荷等17種中草藥進行了識別,以VGGNet模型為基礎,提前對圖像進行批量標準化操作,緩解網絡模型的過擬合操作。使用三層卷積層和三層池化層,激活函數選用relu函數來對數據進行修正。使用Adam優化器來解決梯度下降算法初始化。使訓練集分離出來的驗證集的平均識別準確率達到了96%。將卷積神經網絡的中草藥識別功能移植到微信小程序端,用戶通過上傳照片來實現對圖片中的中草藥植物的識別。后端對此圖片進行匹配,將匹配到的結果送還前端,呈現給用戶最后的匹配結果。