雪花般落下在櫃檯的處方箋是藥師習以為常的工作內容之一,盯著螢幕將紙上的資料一條一條輸入,反覆操作。如果量小還好,也許幾分鐘就可以處理完,當作業量大時,可是好幾鐘頭的枯燥工作。
藥局的藥師工作一般包含常見的包藥、銷售、衛教等等,是個具備醫療知識有時需要業務技能的職業。當我司注意到藥師的工作中包含處方箋登打這項繁瑣、規律的項目且主要資料是以影像的方式輸入時,便想到也許這是讓人工智慧能派上用場的時候!
影像是含有豐富資訊的資料,從紋理、光影、顏色到形狀、深淺、實體乃至互動關係的資訊都可以記錄在一張圖片裡。而這次的案例:處方箋登打,是個需要將紙張上的文字轉換成可以萃取資訊的資料形式後,再抽取其內有用資訊的任務。
於是我把問題分解為三階段的工作,
1. 紙張上的文字 → 電腦上的文字
2. 電腦上的文字 → 萃取資訊
3. 萃取資訊 → 醫療系統輸入
這時便可借助深度學習的力量,幫助我們完成前面兩項工作!
1. OCR
處方箋較偏向於平直角度、單一字型、固定場景的文字辨識,光學字元識別(Optical character recognition)便是本次影像文字轉電腦文字的不二首選,相較場景文字辨識(Scene text recognition, STR)。
在成本、人力等考量下,我決定以 google OCR 作為本次專案的 OCR 引擎,標記OCR相當於標記每個字元的物件識別任務,成本太高故與其自行開發 CTPN + CRNN架構不如使用有大規模文本且市場證實有效的 API 服務,而我們使用後效果的確不錯。
如果要自行開發,我會選用CTPN(水平字元偵測) + CRNN(字元辨識) 的架構實現一個簡易的OCR,兩者結構相似,主要是預測頭的差異,前者是區域提議網路(Region proposal network, RPN),後者是轉錄層(Transcription layer)。
2. NLP
既然有了電腦上的文本,接著應如何取出相對應的重要資訊呢?自然語言處理(Natural Language Processing, NLP)是最好的選擇,雖然有其他的替代方案,但是能考慮語意和上下文關係的方法,會更細膩地萃取文本中的特徵。上游字元嵌入(character embedding)採用的是BERT,其遷移學習的能力和龐大的字彙量足以應付各式各樣的下游任務。
經由處方箋的收集和NLP模型的預測,目前可達到 74 % 左右的準確率(包含困難樣本),並且是格式不均(format-free)的,相較其他的模型可能需要先找出是否為特定的醫院格式,我的作法更有彈性。
3. pywinatuto
最後是實現流程自動化(Robotic Process Automation, RPA)並套上GUI供藥師使用。RPA近年來逐漸受到市場上的關注,許多公司開始尋找事務流程中繁瑣、重複的項目,並設法自動化,例如本專案的處方箋登打。目前處方箋的資訊並沒有被健保局整合成統一格式,藥局系統介面各自為陣,中間缺乏適當的接口,這便是本專案有機會進入市場的原因。
結語
本專案成功拿下政府補助案之餘,也讓人思考如何提供更佳的服務體驗品質以及各樣研發模型的角度,例如可以將 NLP 的下游任務模型改為few shot的一或者可以改為 lattice LSTM,也可能是將 OCR 和 NLP 結合成 multi-modal end-to-end 的模型。
此外,此次開發的技術亦可用於其他領域的文件辨識,例如證件、票據、文書作業之類的文件上。