影輔助診斷主要做兩件事情:
- 醫學知識圖譜構建;
- 基於疾病的診斷。
今天我們來分析如何用AI技術做食道癌識別和輔助診斷。
食道癌是世界五大惡性腫瘤之一,我國又是食道癌的高發地區。這個專案的目標是通過影像判別病人是否可能患有癌症。
專案的整體流程如下:
- 採集數據集:內窺鏡探頭一般從患者鼻腔進入,然後經過咽喉和食管,最後到達胃。我們採集食管數據的時候,可能會引入大量非食管數據。
- 數據標注與模型建立:然後對這些數據做區分,通過食管判別模型,只保留食管數據。然後將食管數據送到下一個模型,這個模型只做一件事情,就是把正常的食管和異常的食管區別開來。
- 圖像分析:區分之後,再把病變的食管數據送到下一個環節,判斷這個圖像代表的是癌症還是炎症。
整個流程大致可以分為這樣三個階段,接下來我會簡單介紹每個階段的難點。
圖像數據集少、表現不一
通常的圖像分類任務動輒幾十萬、上百萬,甚至上千萬的數據量相比,醫療影像它的數據量是非常少的。同時,由於設備參數、醫生的拍照手法或拍攝角度、光照的明暗不同,食管的表觀變化非常複雜。
那麼,我們怎樣才能在這樣的條件下得到一個可靠穩定的模型?
採用Feature map。Feature Map是卷積核卷出來的,你用各種情況下的卷積核去乘以原圖,會得到各種各樣的feature map。你可以理解為你從多個角度去分析圖片。而不同的特徵提取(核)會提取不同的feature,模型想要達成的目的是解一個最優化,來找到能解釋現象的最佳的一組卷積核。
在同一層,我們希望得到對於一張圖片多種角度的描述,具體來講就是用多種不同的卷積核對圖像進行卷,得到不同核(這裏的核可以理解為描述)上的回應,作為圖像的特徵。
他們的聯繫在於形成圖像在同一層次不同基上的描述。下層的核主要是一些簡單的邊緣檢測器(也可以理解為生理學上的simple cell)。
在拿到食管數據之後,如何判別這個食管屬於健康正常食管還是病變食管呢?
這個問題跟前面的問題比較類似,也是一個判別模型。
它們的不同之處在哪呢?
當我們判斷一個食管是否異常食管時,只需要找到一個病變區域,就能夠說明這個食管是異常的。
但是反過來,在正常圖像中,並不能說找到一個正常特徵,就說明這個食管是正常的。只能說在這張圖像中我們沒有找到異常特徵,它可能是見正常的。
因此,在正常特徵和異常特徵之間,我們更傾向於提取病變特徵,抑制正常特徵。
我們是怎麼做到呢?
病變和正常的case都會經過神經網路,以得到特徵向量。對於這個向量,我們希望盡可能凸顯異常特徵,讓正常特徵趨近於0。
我們是如何把這種資訊建模到模型中的呢?
我們對模型進行了重新建模,最後準確率大概在97%左右。
前面的模型相對來說比較簡單,第三個模型主要是區分炎症和癌症,它與前兩個問題不大一樣。
一般情況下,病變的食管圖像裏都會伴隨著一些炎症的特徵。
我們對癌症的判斷往往是通過一個紋理特別小的區域得出的,因此需要提取出更加精細化的特徵。比較好的做法就是讓很多專家把病灶區非常嚴謹地標注出來,這樣我們只需要對這個區域進行識別就好了。
這個標注量非常大,因此數據異常匱乏。我們沒有癌症區域的標注數據,但又希望得到非常精細化的特徵,如何解決這個矛盾呢?
幸運的是,我們雖然無法獲取到非常精准的病變區域標注影像,卻能夠相對容易地知道一張圖像是否包含癌症,因為只需要跟病例對應關聯起來就好了。這樣一來,我們可以更容易地得到圖像全局的標籤。
如果一張圖像包含了癌症,必然會有一個或幾個區域包含了癌症的特徵。也就是說,如果我們把圖像切分成幾個patch,必然會有某個或某幾個patch包含癌症特徵。基於這樣一種思路,我們採取了多序列的學習方式。這個方法的內在思想很簡單,就是把圖像切分成若干個patch,然後對每個patch建模,判別這個patch發生癌症的概率。
我們最後把所有patch裏面癌症概率最高的那塊,作為圖像是否包含癌症的標籤。
做的過程當中,我們會逐漸積累精准標注的數據,這些數據非常少,不足以虛擬一個模型。但圖像中的特徵都是最精准的,是經過人為校驗和標注的。
我們怎樣才能把這種少量的、精准的數據強化到癌症識別中去呢?
這是個非常有意思的問題,如果能解決這個問題,即使只有少量標準數據,我們也能不斷提升。
這裏主要採用了多任務學習的方法,這個方法需要完成兩個任務:
- 基於有病變區域標注的數據建立有監督的學習任務;
- 對於沒有病變區域標注的數據,建立前面提到的多序列學習任務。
這兩個模型共用特徵提取網路,特徵提取網路必須同時滿足兩大任務,這樣才能把精准標注的特徵強化到癌症識別中去。
以上是我們食道癌專案的簡單介紹,下麵再簡單介紹一下我們在輔助診斷方面做的一些工作。
輔助診斷的目的是什麼呢?
我們希望機器最終能夠像臨床醫生一樣具備診斷疾病的能力。
在介紹輔助診斷專案之前,我們先來看看一個醫生或者一個普通的學生是如何成長為一名專家的:一個學生從剛入學開始,學習了大量專業課程,閱讀了大量專業醫學文獻後,就可以積累一定程度的醫學知識。
當醫學知識達到一定程度之後,就可以去醫院裏面實習,由臨床醫生結合一些真實案例,指導他去學習診斷的技能。
當我們具備了這些技能,就能夠成為一名普通的醫生,醫生可以看到大量的病人,學習大量經驗,經驗足夠豐富之後就成了專家。
機器成長的過程與人類大致相似。
我們可以將其分為三個階段:
- 醫學知識圖譜的構建,也就是機器學習知識的過程;
- 有了知識之後學習診斷的能力,也就是建立疾病判別的一些模型;
- 讓機器在與專家的博弈過程中,不斷提升診斷水準,逐漸逼近甚至超過專家。
醫療知識圖譜的構建過程中,我們首先要對文本數據進行處理。文本數據分成兩類,一類是半結構化數據,一類是非結構化數據。
這裏我列舉一個例子,說明我們如何把非結構化的文本變成結構化文本,也就是電腦可以理解的形式。
我們可以把病史分為幾個部分:疾病的情況、入院的治療經過、入院的依據等;把病史分為這樣幾部分資訊後,再對每一類資訊進行細化和提取;經過提取之後,非結構化的文本就變成了電腦能夠理解的結構化文本;我們會把這些資訊轉化為醫學知識圖譜存在電腦裏,於是電腦就把這個知識學會了。
以上就是醫學知識圖譜的構建過程。
第二步我們會有一個診斷模型。
診斷的過程是這樣的,首先把一段人類語言描述的病情轉化成電腦可以理解的結構化知識。有了結構化的知識以後,機器就能理解這個人的情況,把知識推送到疾病診斷模型當中,模型將給出一個疾病列表,診斷模型的流程大致就是這樣。
下麵我們來看一個病情理解的實例。
通過技術對病人病情的理解可以得到一些基本資訊,其中包含性別、年齡,這個人的主動描述、現病史和既往史等。
主動描述裏會提到症狀以及持續的時間,甚至一些更複雜的資訊,比如說唾沫是什麼樣子的,咳嗽是否帶痰。這些資訊都會詳細刻畫出來,按照前面提到的模式畫出病歷,完成對病情的理解。
理解病情以後,將其輸入診斷模型當中。
診斷的demo包含幾個部分:對病情的人類語言的描述,通過病情理解後得到結構化的病情表示,之後得出機器診斷的結果,按照概率從高到低給出5個結果。
我們還給醫生留了一個介面,醫生可以對診斷結果評分,通過評分將結果回饋到模型當中。
通過醫生和機器之間的交互,可以將模型迭代得越來越好。
我們在實驗室數據裏選擇了大概10萬個真實病例進行測試,TOP1的結果與醫生的一致率大概是92%,TOP3是90%,但這種模型還需要更多臨床病例做驗證。