全文詳解:深度學習如何協助處理醫療中的數據難題
圖源:pixabay
原文來源:WordPress
作者:Luke Oakden-Rayner
「雷克世界」編譯:嗯~是阿童木呀、KABUDA、EVA
醫療數據很難處理。
在醫學成像中,數據存儲(檔案)是基於臨床假設進行操作的。不幸的是,這意味著當你想提取一個圖像(比如一個正面的胸部x光片)時,你通常會得到一個裝滿其他圖像的文件夾,並且沒有簡單的方法來區分它們。
這些全部是相同的文件夾是合情合理的,因為在放射學中我們報告的是病例,而不是圖像。這是病人在經歷創傷後同時掃描的所有東西
根據製造商的不同,最終可能會得到水平或垂直翻轉的圖像。它們可能有反向的像素值(inverted pixel values)。它們可能會旋轉。問題在於,當處理一個龐大的數據集(比如,50-100k的圖像)時,如何在沒有醫生查看所有這些畸變(aberration)的情況下發現這些畸變?
你可以嘗試編寫一些簡練的解決方案,比如:
在許多胸部x光片的兩側有黑色的邊界(因為大多數胸部都比寬度高),所以如果底部有超過50個黑色像素行,那麼它可能旋轉了90度。
但是一如既往,我們陷入了失效模式(failure mode)。
這裡只有中間的圖像有經典的「兩側黑色邊界」外觀
這些脆弱的規則無法為我們解決這些問題。
進入軟體2.0,我們使用機器學習來構建解決方案以解決我們無法自己編碼的問題。令人尷尬地是,像旋轉圖像這樣的問題是可學習的。這意味著,像人類一樣,機器可以很容易地(幾乎)完美地完成這些任務。
因此,使用深度學習來為我們修複數據集是顯而易見的答案。本文將說明這些技術的工作原理,如何以最少的努力完成工作,並展示一些使用方法的示例。舉個例子,我將使用Wang等人的CXR14數據集,該數據集看起來是精雕細琢的,但仍然包含偶然的壞圖像。如果你使用CXR14數據集,我甚至會給你一套新的~430標籤,這樣你就不用擔心那些潛在的壞圖像了!
非常令人尷尬
我們真正需要問的第一個問題是——
問題1:這個問題是令人尷尬地可學習的嗎?
考慮到大多數的研究都是常規的,你需要非常高的精確度來防止排除太多「好的」研究。我們應該把目標定在99.9%。
很酷的一點是,這些我們可以很好地執行的簡單問題,在視覺上是可以識別的。所以,一個很好的問題是「你能想像一個單一的視覺規則來解決這個問題嗎?」在區分狗和貓時當然不是這種情況,這是ImageNet數據集的主要目的。
有太多的變化和太多的相似點。我經常在演講中使用這個例子——我甚至無法想像如何編寫一般意義上在視覺上區分這兩種動物的規則。這並不是令人尷尬地可學習的。
但在醫療數據中,許多問題其實很簡單。變化很小。解剖學、角度、照明、距離和背景都很穩定。為了說明這一點,讓我們看一個來自CXR14的簡單示例。在數據集中的普通胸部x光片中,有一些是旋轉的(這在標籤中未被識別,所以我們不知道是哪些)。它們可以左右旋轉90度左右,或180度(上下顛倒)。
這是令人尷尬地可學習的嗎?
旋轉和垂直的胸部x光片之間的區別真的簡單得令人尷尬
答案是肯定的。在視覺上,非常規研究與常規研究完全不同。你可以使用一個簡單的視覺規則,比如「肩膀應該高於心臟」,你就會得到所有的例子。鑒於解剖學是非常穩定的,而且所有人都有肩膀和心臟,這應該是一個可學習的卷積網路規則。
非常渴望
我們需要問的第二個問題是——
問題2:我們擁有足夠的訓練數據嗎?
在旋轉圖像的情況下,我們當然會擁有,我們做得到!我們所需要的只是幾千個常規的胸部x光片,然後對它們進行隨機旋轉。例如,如果你在圖像中使用numpy數組(numpy array),你可能會使用這樣的函數:
這只是將圖像按照順時針方向旋轉90、180度或270度。在這種情況下,繞著第二個和第三個軸(axis)旋轉,因為第一個軸是信道的數量(鑒於theano dim排序規則)。
請注意:在這種情況下,CXR14數據集中幾乎沒有旋轉的圖像,所以意外「糾正」已經旋轉圖像的幾率非常小。我們可以假設數據中沒有數據,並且模型將會學習得很好。如果有更多非常規的圖像,那麼你最好手動選擇常規和非常規圖像。因為像旋轉這樣的問題很容易被識別,我發現我可以在一個小時內進行幾千個標記,所以這並不需要太多的精力。由於這些問題很簡單,我經常發現我只需要幾百個樣本即可「解決」這個挑戰。
所以我們建立了一個常規圖像的數據集,對其中的一半進行旋轉,並相應地標記它們。在我的例子中,我選擇了4000個訓練案例(其中2000個是經過旋轉的)和2000個驗證集(validation set)案例(其中有1000個是經過旋轉的)。這似乎是一個很好的數據量(請記住,經驗法則(the rule of thumb):1000個樣本可能是好的,加上誤差範圍(margin of error)),而且它適合於RAM,所以很容易在我的家用計算機上進行訓練。
為了在機器學習中進行有趣的改變,我不需要一個單獨的測試集。證據需要實踐來檢驗(in the pudding)——無論如何,我都將在整個數據集上運行這個模型,並將輸出作為我的測試進行檢查。
一般來說,對於這類研究,我會讓自己的生活變得輕鬆。我將圖像縮小(因為旋轉檢測看起來不需要高解析度)到256 x 256像素,並且使用一個經過預先訓練的以keras作為基礎網路的resnet50。使用經過預先訓練的網路並沒有真正的理由,因為幾乎所有你使用的網路都會在一個簡單的解決方案上聚合,但是它很簡單,並且不會減慢任何速度(無論如何,訓練時間都是快速的)。我使用了一組默認的參數,並且不為這個如此簡單的任務進行任何調優。
你可以使用手邊的經過編碼的任何網路,VGG-net可行, Densenet可行,任何網路都可行,真的。
在幾十個輪數之後,我得到了我的結果(這是在val集上的):
AUC = 0.999, ACC = 0.996, PREC = 0.998, REC = 0.994
很好,如果這是一項令人尷尬地可學習的任務,我希望能找到的就是這個。
檢查結果
正如我之前所說的,在醫學圖像分析中,我們總是需要檢查我們的結果。查看圖像,確保模型或過程做到了你想要它做的事情。
所以最後一步是在整個數據集上運行模型、進行預測、然後排除旋轉研究(the rotated studies)。由於數據中幾乎沒有旋轉研究,所以我可以簡單地查看被預測為旋轉的所有圖像。
如果相反的話,這就是一個有很多異常圖像的問題(比如超過5%的數據),那麼收集幾百個隨機案例和手工標記一個測試集將會更為高效。然後,你可以通過適當的指標追蹤模型的精確度。
我特別關心的是任意一個被稱之為旋轉(假陽性)的正常研究,因為我不想失去寶貴的訓練案例。這實際上是一個比你所能夠想像的更大的問題,因為這個模型可能會過度調用某種特定類型的病例(也許是那些讓病人變得懶散和傾斜的病例),如果我們排除這些作為規則,那我們將會引入偏差進入我們的數據中,且不再有「真實世界」的代表性數據集。這顯然與醫療數據有很大關係,因為整個目標就是生產出能夠在真正的診所中運行的系統。
該模型總共將171個案例識別為「旋轉」。有趣的是,它實際上作為一個「異常」檢測器,識別出許多實際上並沒有旋轉的壞案例。這是有道理的,因為它可能是學習解剖學的標誌。任何異常的東西,如旋轉的膠片或其他身體部位的X射線,都不具有相同的標誌。所以我們實際上能夠收穫更多的東西,而不僅僅是尋找異常旋轉的圖像。
在171個預測中,51個是旋轉了的正面胸部X射線。鑒於低的離譜的患病率(120,000中有51個),這已經是一個極低的假陽性率了。
旋轉的胸部膠片樣本
在餘下的120個案例中,56個不是正面胸部膠片。主要是側面影片和腹部X光片的混合。無論如何,我還是想把這些擺脫掉。
其餘的呢?有一些混合的縮小性研究(黑色或白色的大邊界)、淘汰性研究(整個研究灰色)、反向像素水平研究等等。
總的來說,大約有10項研究,我將稱其為明確的假陽性(意味著它們是我可能想要保存的良好的正面X射線)。值得慶幸的是,即使你想將它們重新添加進去,由於只有171個預測值,所以手動對其進行操作也是非常容易的。
所以旋轉檢測器看起來像是部分解決了一些其他問題(如像素值反轉)。要知道它做的有多好,我們需要檢查它是否漏掉了其他不好的案例。我們可以測試這一點,因為像素值反轉(pixel value inversions)很容易為(圖像中的x,x = max-x)生成數據。
所以我使用與旋轉檢測器相同的方法訓練了一個快速的「反向檢測器」,並取得了很好的結果。
AUC = 1.0,ACC = 0.9995,PREC = 0.999,REC = 1.0
在這種情況下,可能有一些方法可以在沒有機器學習的情況下做到這一點(直方圖應該看起來很不一樣),但是這也很簡單。
那麼,這個特定的檢測器是否比旋轉探測器發現了更多的反向結果呢?是的。旋轉檢測器在整個數據集中發現4個,而反向檢測器發現38個反向研究。所以旋轉檢測器發現了一些不好的研究結果,但不是全部。
觀點重申:培養單一模型來解決每個問題是正確的方法。
所以,我們需要特定的模型來完成附加的清潔任務。
每一點幫助
為了顯示少量的標記數據是有用的,我拍攝了使用旋轉檢測器(n = 56)所發現的橫向和不良區域的膠片,並在它們上面訓練了一個新模型。由於我沒有很多這樣的膠片所以試圖做得更為詳盡,甚至沒有使用驗證集。由於這些任務是可學習的,一旦它接近100%,它應該就會具有很好的泛化能力。顯然這裡有過度訓練的風險,但我認為是值得冒險的。
它效果很好!我發現了額外的幾百張側面膠片、腹部膠片和幾個骨盆。
顯然,如果我從頭開始構建這個數據集,解決這個問題會更加容易,因為我可以訪問很多相關的非正面胸部圖像。對於我來說,想要比現在做得更好,我需要從當地的醫院檔案中提取來自各個身體區域的一組圖像,這超出了本博客的範圍。所以我不能確定我是否掌握了大部分這些內容,但從這樣一個小數據集中獲得了相當好的效果。
除了關於CXR14的數據外,我注意到我的模型總是會對關於幼兒的膠片顯現崩潰的狀態。這些兒科膠片在外觀上與成人膠片有很大不同,且它們被旋轉檢測器、反向檢測器和不良身體部位檢測器識別為「異常」。我建議它們應該被忽視,但是因為患者年齡被包含在標籤集中,所以可以在沒有深度學習的情況下完成。考慮到數據集中只有286名5歲以下的患者,除非我特別想要研究這個年齡段的患者,並且真正知道我在做什麼,所以從醫學成像的角度來看,我會排除所有這些患者。實際上,我可能會把所有10歲以下的人排除在外,因為這是一個合理的年齡,可以將體型和病理特徵更加「成人化」。有興趣的是,10歲以下的人約有1400人,因此約有1%的數據。
觀點重申:幼兒胸部X光與成人非常不同。考慮到數據集中低於10歲的數據只有大約1%,除非有很好的理由,否則應該將其排除在外。
根據你的任務,放置不良和放大的膠片可能是一個問題,但是武斷地定義一個「壞膠片」對於所有任務來說都是不可能的,這不是我想做的。還有一件事是特定於任務的。
就是這樣。總的來說,使用深度學習來解決簡單的數據清理問題效果很好。經過大約一個小時的工作,我清理了數據集中大部分旋轉和反向的圖像(這裡需要注意一個名為csv的文件)。我我可能已經確定了相當一部分的側面膠片和其他身體部位的膠片,但確定我需要為它們構建特定的檢測器。
從更廣泛得角度來查看CXR14數據,沒有太多的圖像誤差。美國國立衛生研究院團隊(NIH team)可能相當好地管理了他們的數據。在醫療數據集中情況並非總是如此,如果要構建高性能醫療AI系統,制定有效的方法來處理來自將臨床基礎設施用於研究任務的雜訊是非常重要的。
更進一步
截至目前,我們已經解決了一些非常簡單的挑戰,但這並不意味著我們在醫學成像方面遇到的問題都如此簡單。我們的團隊在構建一個大型髖骨骨折數據集時,應用到了這些技術。特別是,我們排除了其他身體區域的圖像,也排除了植入金屬(如髖關節置換)的病例,並且我們放大了髖關節區域,同時捨棄了與我們的問題無關的圖像區域(髖部骨折不會發生在臀部以外)。
排除金屬是通過自動文本挖掘過程實現的。因為這些假體在出現時幾乎總是被報道,因此我們找到了與植入相關的關鍵詞。這些標記僅花費了10分鐘左右的時間就被創建了出來。
在軀體部分檢測(body part detection)和邊界框預測(bounding box prediction)錯誤的情況下,無法自動生成標記。所以我自己做了。即使是像邊界框預測那樣複雜的事物(這實際上是解剖學中里程碑式的識別任務),我們也僅需要約750個案例。每個數據集僅需要1小時左右的時間即可完成。
在這種情況下,我們使用手工創建的測試集來量化結果。(參見我們的一篇論文:https://arxiv.org/abs/1711.06504)
相比於實際標記骨折需要幾個月的時間,額外標記一小時或兩小時以獲得清晰的數據集是非常小的代價。特別是因為該系統目前可以接收任何臨床圖像,並且據我們所知,它可以自動排除無關或低質量膠片。這正是AI系統需要在「自然環境」中進行操作的方式,除非你想要付費給某人讓其手工整理它分析的所有圖像。
結論
我們都認同一個觀點,那就是在數據充足的前提下,深度神經網路在解決視覺問題方面的能力,與人類水平相差無幾。同樣顯而易見卻少有人提及的一點是,「數據充足」在很大程度上依賴於任務的難易程度。
對於醫學圖像分析問題的一個子集(這也是我們在構建醫學數據集時經常要解決的問題)而言,其任務是非常簡單的,這使得問題很容易用少量的數據來解決。一般而言,僅用不到一個小時的時間即可完成對圖像組的識別,但同樣的任務,醫生需要花費數小時的時間進行手工處理才可完成。
為了證明這一方法,同時感謝你的閱讀,我提供了一組約含有430張標記為不良的圖像,以將其從CXR14數據集中排除(同時建議你排除約1400名10歲以下的兒童,除非你明確知道為什麼要保留他們)。這不會改變任何論文的任何結果,但對於這些數據集而言,圖像越清晰越好。
我在本文中所探討的內容,沒有涵蓋任何開創性技術,這也是我為什麼不寫一篇正式論文的原因。但對於我們這些正在構建新數據集的人,特別是那些沒有大量深度學習經驗的醫生而言,我希望本文能引發他們關於軟體2.0是如何憑藉比人工方法更低的成本解決數據問題的些許思考。
注釋:解釋我的示例審查/標記過程
我在Windows文件瀏覽器中查閱所有圖像。
我在本文末的實際工作空間,用於旋轉檢測器的預測
我只需將我想要查看的案例轉移到一個新的文件夾,然後打開該文件夾(以「特大號圖標」作為試圖模式)。這種尺寸的圖像大約是你屏幕高度的四分之一,而且在大多數現實屏幕上都足夠大,可以檢測到諸如旋轉這樣的明顯異常。當我標記具有明顯異常的圖像時,我只需按住Ctrl鍵並單擊文件夾中的所有樣本,然後將它們剪切/粘貼到新文件夾中。這樣我每小時能篩選出1000張圖像。
儘管這一系統非常簡陋,但它比我從網上回購或自己編碼中嘗試的大多數事物要好很多。
用於移動文件的python代碼非常簡單,但是在構建數據時,它是我最常使用的代碼之一,所以我認為我應該收錄它:
然後我可以去那個文件夾瀏覽一下。如果我做了一些人為處理,並且想要重新讀取圖像,那麼這非常簡單:
原文鏈接:https://lukeoakdenrayner.wordpress.com/2018/04/30/the-unreasonable-usefulness-of-deep-learning-in-medical-image-datasets/amp/?__twitter_impression=true
※如何看圖說話?Facebook提出全新的基於圖像實體的圖像字幕框架
※從Big Dog到Spot Mini:波士頓動力四足機器人進化史概覽
TAG:雷克世界 |