AI落地場景探索:醫學報告單結構化

ITPUB社群發表於2022-11-28

在好大夫線上每天的線上問診中,包含了大量的各種醫院報告單、化驗單等圖片,如何識別並格式化這些報告單資料,成了我們面臨的一大難題。如果這些報告單僅以圖片形式儲存在伺服器中,就難以發揮其在問診過程中的重要價值,無法為問診醫生提供更準確的參考資訊。本文將從實際業務需求、技術挑戰、各種演算法的嘗試等方面,逐一探討我們是如何解決這類問題的。


一、專案背景及挑戰


1.1 專案需求背景    


好大夫網站上,使用者平均每天上傳數萬張圖片,這些圖片中大部分都是醫學檢查報告單(如血常規、肝功能等)。其中蘊含著大量的有價值的資訊,但由於這些照片不是結構化的資料,導致無法進行索引和檢索等一系列複雜功能。


一方面,醫生有將報告單中的關鍵資訊謄寫到病歷上的需求,這可以使醫生能更加清楚明白地跟蹤患者病情發展,但是這個過程太過於繁瑣。


另一方面,無法提取報告單中的具體資訊導致這部分醫療資料無法被利用起來。    


“醫學報告單結構化”專案便是在這個需求背景下成立了。該專案要求演算法能讀取出患者上傳報告單中的文字資訊,並將其組合成表格的形式,以便儲存和利用(如圖1.1所示)。


AI落地場景探索:醫學報告單結構化


1.2 所用技術概述


本專案所用的技術都屬於人工智慧的範疇。圖1.2展示了“人工智慧”技術領域的三大分支,以及各分支的主要細分支。


AI落地場景探索:醫學報告單結構化


該專案同時涉及影像處理和自然語言處理兩大人工智慧技術分支。    


首先,我們需要用到OCR(Optical Character Recognition,光學字元識別)技術將影像轉化為文字。OCR技術是影像處理技術的一個分支,其通常包含“文字區域檢測”和“文字識別”。    


其次,需要用“文字分類”技術項將報告單分類為血常規、肝功能等一系列的類別,該技術是NLP(Natural Language Processing,自然語言處理)的一個重要分支。   


 最後,需要用到NER(Named Entity Recognition,命名實體識別)技術從識別出的文字中準確地提取“檢查項名”、“項數值”、“項範圍”等欄位,該技術同樣是NLP的一個重要分支。


1.3 專案面臨的挑戰


準確率方面。由圖1.3可以看出,使用者上傳的報告單照片的干擾是非常大的,不僅有噪聲的問題,還有文字傾斜,甚至文字彎曲。這些干擾會嚴重影響文字識別的準確率。為了評估報告單影像識別難度,我們整理了“好大夫線上醫學報告單文字行資料集v1.0”(如圖1.4所示),是從報告單影像中切割出近2000個文字行切片,然後進行人工標記。將該資料集輸入到百度通用OCR介面和騰訊OCR介面中進行識別,結果“字串”準確率都沒超過85%(實驗詳細結果詳見本文2.2),遠不能滿足我們最終的要求。同時也可以看出該專案的難度之大。


AI落地場景探索:醫學報告單結構化

AI落地場景探索:醫學報告單結構化


執行速度方面。一天需要處理的報告單數量在6萬左右,要在一天內處理完這些數量的報告單,則要求演算法處理每張影像的平均時間不能超過1.44秒。否則很容易造成積壓,影響使用者體驗。而百度和騰訊通用OCR介面處理每張報告單的速度均在7秒以上,遠不能滿足我們專案的需求。


資料數量方面。雖然伺服器中儲存了上億張醫學報告單照片,但都是沒有被標記的資料。人工智慧演算法的完善是需要大量被標記的資料,資料質量越高,演算法表現越好。但標記的過程需要大量人工成本。


硬體配置方面。考慮到專案投入的價效比問題,我們捨棄了一些執行負載非常高的演算法。



二、應用的相關技術及難點


專案主體使用Python,某些模組為了效率使用C++語言編寫成動態連結庫供Python呼叫。在測試環境下,該專案檢測一張報告單影像的時間平均1.04秒。該專案的整體程式框圖如圖2.1所示:


AI落地場景探索:醫學報告單結構化


共分為:1)文字區域檢測2)文字識別3)報告單分類4)命名實體識別5)結構化內容提取,這五個部分。


2.1 文字區域檢測模組


 “文字區域檢測”,是將影像中的每一行文字切割出來形成一條一條的文字切片,其具體過程如圖2.2所示。目前流行的“文字區域檢測”演算法主要分為基於迴歸的方法和基於分割的方法:


AI落地場景探索:醫學報告單結構化

第一版是基於一個開源專案修改而來,其採用的主體結構是Yolo[1]文字區域檢測+CRNN[2]文字識別。Yolo文字區域檢測演算法屬於基於迴歸的方法。第一版的Yolo文字區域檢測演算法在一般的醫學報告單上面的效果是比較令人滿意的,其文字檢測效果不亞於市面上的一些付費OCR公共介面。


對於一般的文字區域檢測演算法,單獨出現的’+’、’-’等符號通常是被視作噪聲的。我們的Yolo文字區域檢測演算法也傾向於將這些符號視作噪聲。這個先驗知識在大部分醫學報告單上是可行的。但仍然有佔總數比例很小的一些類別的報告單(如尿常規、便常規等)上面會出現這些字元,而這些字元在這些類報告單上代表的卻是非常關鍵的意義:如‘+’通常代表陽性,‘-’通常代表陰性(如圖2.3所示)。為更好地處理這些類別的報告單,我們仍然需要一種效果更好、可以檢測出這些不起眼的小字元的文字區域檢測演算法。


AI落地場景探索:醫學報告單結構化


CVPR2019的一篇論文所提出的Craft演算法[3]進入了我們的視野。Craft演算法是一種基於分割的文字區域檢測演算法。在這裡,我們先重點介紹Craft演算法與Yolo演算法在文字區域檢測任務上的不同。


Yolo文字區域檢測使用固定寬度的小包圍盒來覆蓋檢測到的文字區域以達到文字區域檢測的目的。該演算法先使用卷積神經網路提取影像高維特徵,然後用迴歸的方法獲取文字區域的候選小包圍盒,最後使用非極大值抑制和迴圈神經網路來過濾這些小包圍盒結果。由於使用了迴圈神經網路,因此該演算法是將文字區域檢測看作“序列處理”任務。這種方式對中長序列的文字區域檢測非常有效。但報告單裡單獨出現的’+’、’-’等符號沒有前後文字元,因此“序列處理”反而會降低演算法對這些字元的檢測。


Craft演算法則不將文字區域檢測看作“序列處理”任務,而是將它看作影像分割任務。因此該演算法對所有的文字序列的影像(無論長短)都一視同仁。Craft演算法會對影像中的所有畫素進行二分類——文字區域畫素和非文字區域畫素。因此Craft演算法更容易檢測到單獨出現的’+’、’-’等符號。


綜上,我們選擇了Craft演算法替代原有的yolo演算法。


然而演算法被選定後,一個更大的問題出現了:沒有標記好的資料。Craft演算法的訓練資料需要人工框定每一個字元的包圍盒。根據預測,標記一張報告單影像大概需要25分鐘。標記出一個滿意的資料集需要1000人/天以上的工作量,代價實在太大。


牛津大學的Gupta學者的一些工作[4]引起了我們的注意。Gupta認為完全虛擬生成的文字影像即可訓練出非常好的文字區域檢測演算法。參考Gupta論文[4]裡面的方法,我們創造了自己的虛擬報告單生成演算法(限於篇幅,我會在下一次分享詳細介紹該演算法),能自動生成出一張完整的報告單,幾乎達到以假亂真的程度。圖2.4是一張沒有加背景的虛擬生成的報告單示例。在給報告單加上人工設定的背景(如桌面等)後,我們就可得到最終被訓練的資料。


AI落地場景探索:醫學報告單結構化


最終訓練出的Craft演算法在其他字元檢測效果沒有退步的前提下,大大提升了該模組演算法檢測單獨出現的’+’/’-’等小字元的能力。新舊兩種演算法的對比結果如圖2.5所示:


AI落地場景探索:醫學報告單結構化


獲取文字區域後,由於存在彎曲文字和傾斜文字,所以我們需要對這些文字行圖片進行糾偏。參考演算法[5]和演算法[6],我們設計了一套文字糾偏演算法用於該任務(限於篇幅,我會在後面的分享再詳細敘述該演算法的細節和實現)。該演算法對傾斜和彎曲文字影像的糾偏效果如圖2.6、圖2.7、圖2.8所示:


AI落地場景探索:醫學報告單結構化


AI落地場景探索:醫學報告單結構化


AI落地場景探索:醫學報告單結構化



2.2 文字識別模組


“文字識別”的任務是將切下來的文字行切片轉換為文字。本專案一直使用的是CRNN演算法[2]進行文字識別處理。訓練資料集為人為收集的報告單欄位隨機自動生成的圖片。我們嘗試過使用注意力機制的DAN演算法[7],但公司機器扛不住它的負載。


在“好大夫線上醫學報告單文字行資料集v1.0”上,我們分別試驗了我們的演算法、百度OCR和騰訊OCR三種演算法(如表2.1表2.2所示)。為公平起見,當百度雲OCR介面和騰訊雲OCR介面沒有從影像中檢測出正確的文字區域時,我們則跳過這些圖片,不統計這些圖片的錯誤。表2.3展示了百度雲OCR介面和騰訊雲OCR介面每一類的文字區域檢測錯誤圖片的佔比:


AI落地場景探索:醫學報告單結構化


2.3 報告單分類模組


“報告單分類”本質上是文字分類任務。


該模組最初的版本為我們和產品經理一起設計的關鍵字分類方法,其思想是提取文字檢測結果中的關鍵字,根據關鍵字加權結果進行分類,我們將其稱為“加權關鍵字分類演算法”。“加權關鍵字分類演算法”在一般情況下還是比較準確的。在專案初期,它為我們提供了較高質量的報告單分類影像資料。但這個版本的演算法由於引數是人為設定的,因此噪聲對演算法的影響非常大。如“血常規”報告單在表頭出現“肝功能”等分類權值非常大的字樣就極易讓演算法誤以為它是“生化、肝腎功”類報告單。因此我們仍然需要用一種效果更好,速度更快的演算法去替代我們的“加權關鍵字分類演算法”。


報告單分類模組我們調研了很多演算法。捨棄了效果最好的Bert演算法[8],主要是因為其執行速度較慢,佔用記憶體資源太多。最終我們選擇的演算法是FastText演算法[9]。


FastText演算法有幾個優點:


1. 執行速度快,i7十代的CPU下該演算法處理一張圖片的文字平均15毫秒;

2. 由於其只有2層全連線層,所以記憶體資源佔用非常低;

3. 準確率較高,在Thuctc資料集[10]上的效果強於常用的TextCNN[11]演算法和TextRNN[12]演算法,弱於Bert演算法[8]。相關實驗結果詳見網站[16]。


得益於之前設計“加權關鍵字分類演算法”,我們可以獲取較為可信的報告單影像分類資料集。人工過濾該資料集,並標記出5000多張影像後即可訓練FastText演算法。


在實際的實驗中,我們將訓練得到的FastText演算法在隨機選取的近500張報告單影像的文字檢測結果上進行分類測試,準確率為92.2%,而“加權關鍵字分類演算法”的準確率為75.2%。


2.4 命名實體識別模組


命名實體識別(NER)的任務是抽取句子中的某類特殊名詞。我們專案的“命名實體識別”模組任務如圖2.9所示,需要從報告單文字中提取諸如“檢查項名”、“項數值”、“項範圍”等欄位。


AI落地場景探索:醫學報告單結構化


命名實體識別(NER)是一個經典的NLP問題。學術界最早傾向於用線性鏈條件隨機場(CRF)[13]去解決“命名實體識別”任務的。線性鏈條件隨機場將自然語言中的每一個字當成線性鏈中的一個一個節點,相鄰的字線上性鏈中為相鄰的節點。線性鏈條件隨機場假設線性鏈中的任意一個節點的狀態只與其相鄰節點的狀態相關。但在實際情況下,自然語言中字與字間的聯絡通常會跨越數個字,甚至數句話。線性鏈條件隨機場顯然無法很好的處理這些長距離邏輯關係。


近些年,學術界開始研究用深度學習的辦法去解決“命名實體識別”任務。長短記憶單元(LSTM)[14]開始被人用作處理“命名實體識別”任務。長短記憶單元(LSTM)理論上可以將字與字之間的聯絡擴充套件到無限遠的地方,這進一步提高了其處理NER任務的效果。然而百度研究院的黃志恆博士發現長短記憶單元(LSTM)雖然加強了演算法對中長距離字間聯絡的感知,但是卻在超短距離的字間感知上不如線性鏈條件隨機場。於是黃博士將線性鏈條件隨機場架設在雙向長短記憶單元(BiLSTM)後面,創造了效果更好的BiLSTM-CRF演算法[15]。


2018年,一個里程碑式的演算法——Bert[8]演算法誕生了,它在11項自然語言處理任務上都取得了令人矚目的成果。無論在前面提到的“文字分類”任務上還是當前小節的“命名實體識別”任務上,Bert演算法都是毫無疑問的王者。


公司有一個醫患交流的命名實體識別資料集,該資料庫有近100萬被標記的字元。在該資料庫上,我們進行過三種演算法的測試:1)Bilstm-crf;2)Bert-crf;2)Bert-Bilstm-crf。


根據以往學者的建議,我們選擇的演算法都含有條件隨機場(CRF)進行超短距離標籤修正。最終三種演算法效果最好的是Bert-crf演算法,於是該模組所用的演算法最初為Bert-crf演算法。


提取OCR識別的文字結果後,我標記了200多萬的字元資料,涉及24種標籤,如表2.4所示:


AI落地場景探索:醫學報告單結構化


表中(B)代表首部標籤,(I)代表非首部標籤。其他標記沒有首部與非首部之分。患者性別由於通常為一個字,故只有首部標籤,沒有非首部標籤。


Bert也是一種基於注意力機制的演算法。基於注意力機制的演算法有一個明顯的缺陷,即有最大處理長度,Bert演算法的最大處理長度為512字。然而有很多報告單如血常規、超聲檢查等,字數均在千字以上。血常規等表格式報告單行間聯絡不大,尚可用行分割處理。超聲檢查等兩段式報告單前後聯絡極大,不能簡單的以行為標準進行分割處理。


為了解決這個問題,我們設計了Bert-rb(全稱Bert-roll-back)演算法。Bert-rb演算法是Bert演算法的一個衍生,其利用報告單的固有特性,智慧對報告單進行分割處理(限於篇幅,我會在下次分享詳細介紹其原理及實現)。將Bert-rb演算法後面架設一個crf演算法即得到最終我們用到的Bert-rb-crf演算法。


將Bert-crf演算法替代為Bert-rb-crf演算法後,這個模組即擁有了理論上一次性處理無限長報告單文字的能力。


在實驗中,Bert-rb-crf演算法處理超長兩段式報告單的效果基本與不分割處理的Bert-crf演算法的效果一致,而不分割處理的Bert-crf演算法卻只能處理最多512字元長度的文字。這表明了Bert-rb-crf演算法的先進性和有效性。


解決了演算法問題,演算法也就能在已經標記的200多萬的字元資料上進行訓練了,表2.5是Bert-rb-crf演算法在標記的資料集的測試集上的表現。


AI落地場景探索:醫學報告單結構化


2.5 結構化內容提取


獲取報告單影像文字資料中的命名實體資訊後,需要將這些資訊組合成表格的形式。其思想非常簡單,首先找“檢查項名”,然後在“檢查項名”的當前行和下一行尋找尚未被匹配到的“項數值”、“項範圍”即可。



三、存在的問題


雖然該專案各個模組取得了喜人的成果。但不可否認該專案依舊存在一些問題。


比如文字區域檢測模組的Craft演算法缺乏“印章檢測”功能,所以當報告單中文字上出現印章時會對“文字區域檢測”的結果產生干擾。Craft演算法也喜歡將折線圖誤認為文字,令人欣慰的是,折線圖上通常沒有重要資訊,錯誤識別對最終結果沒有多大影響,還有就是某些紋理(如藍色條紋毛衣等)依舊會對Craft演算法造成干擾,幸運的是這些紋理上一般沒有文字。文字識別模組的CRNN演算法在報告單影像上的效果雖然超過市面上的某些雲OCR介面,但是其依舊有不小的提升空間,這要求我們進一步利用現有的前沿技術,實現產品上的突破。


報告單分類的分類準確率僅有92.2%,我們對這個結果不太滿意,感覺應該能進一步提升至95%以上,但這需要更多高質量資料集。


命名實體識別模組不能檢測出“檢查項單位”。最初沒有標記這個命名實體,因為當時文字識別模組使用的還是通用文字識別模型,而“檢查項單位”由於其包含很多希臘字母,所以沒有經過特定訓練的文字識別模型對這些欄位的識別有許多錯誤,最終導致無法對這些錯誤的欄位進行標記。但現在的文字識別模組對“檢查項單位”的識別準確率已經大大提高,解決這個問題只需要投入更多時間即可。



參考文獻


1. Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788.

2. Shi B , Bai X , Yao C . An End-to-End Trainable Neural Network for Image-Based Sequence Recognition and Its Application to Scene Text Recognition[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2016, 39(11):2298-2304.

3. Baek Y , Lee B , Han D , et al. Character Region Awareness for Text Detection[C]// 2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2020.

4. Gupta A, Vedaldi A, Zisserman A. Synthetic data for text localisation in natural images[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 2315-2324.

5. Ma K , Shu Z , Bai X , et al. DocUNet: Document Image Unwarping via a Stacked U-Net[C]// 2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR). IEEE, 2018.

6. Li Zhang, Chew Lim Tan. Warped Image restoration with Applications to Digital Libraries.[J]. 2005.

7. Wang T , Zhu Y , Jin L , et al. Decoupled Attention Network for Text Recognition[J]. Proceedings of the AAAI Conference on Artificial Intelligence, 2020, 34(7):12216-12224.

8. Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.

9. Joulin A, Grave E, Bojanowski P, et al. Bag of tricks for efficient text classification[J]. arXiv preprint arXiv:1607.01759, 2016.

10. Sun M, Li J, Guo Z, et al. Thuctc: an efficient chinese text classifier[J]. GitHub Repository, 2016.

11. Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.

12. Liu P, Qiu X, Huang X. Recurrent neural network for text classification with multi-task learning[J]. arXiv preprint arXiv:1605.05101, 2016.

13. Lafferty J, McCallum A, Pereira F C N. Conditional random fields: Probabilistic models for segmenting and labeling sequence data[J]. 2001.

14. Hochreiter S, Schmidhuber J. Long short-term memory[J]. Neural computation, 1997, 9(8): 1735-1780.

15. Huang Z, Xu W, Yu K. Bidirectional LSTM-CRF models for sequence tagging[J]. arXiv preprint arXiv:1508.01991, 2015.

16.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2925497/,如需轉載,請註明出處,否則將追究法律責任。

相關文章