DLTK,即醫學成像的深度學習工具包,擴展了TensorFlow,使針對生物醫學影像的深度學習成為可能。此工具包提供了專用運算與函數、模型實現、教程(如本博客中所用)和典型應用的代碼示例。
本篇博文對生物醫學影像深度學習進行了簡要介紹,我們將圍繞當前工程難點指出一些問題和解決方案,并展示如何針對您的問題啟動和運行原型。
網站:https://dltk.github.io;
來源:https://github.com/DLTK/DLTK;
概述
什么是生物醫學影像分析?為什么需要這種分析?
生物醫學影像是在不同尺度(即微觀、宏觀等)下對人體進行的測量。它們具有多種成像模式(如 CT 掃描儀、超聲機等)并測量人體的物理特性(如放射強度、對 X 射線的不透明度)。這些影像由臨床任務(如診斷)的領域專家(如放射科醫師)解釋并對醫生的決策具有重大影響。
醫學影像示例(從左上方到右下方):多序列腦部 MRI:T1 加權、T1 反轉恢復和 T2 FLAIR 通道;全身拼接 MRI;平面心臟超聲;胸部 X 光片;心臟電影 MRI
生物醫學影像通常為體積影像 (3D),有時還會加上時間維度 (4D) 和/或多個通道 (4-5D)(如多序列 MR 影像)。生物醫學影像中的差異與自然影像(如照片)中的差異完全不同,因為臨床方案的目的是對影像的采集方式進行分層(例如,患者平躺、頭部保持正直,等等)。在影像分析過程中,我們的目標是發現細微差異(即一些小區域表明發現異常)。
長期以來,計算機視覺方法一直用于自動分析生物醫學影像。近年來,隨著深度學習的出現,許多其他機器學習方法被取代,因為深度學習免去了創建手工工程特征的必要,從過程中消除了一個關鍵的誤差來源。此外,完全采用 GPU 加速的網絡可以實現快速推斷,讓分析的數據量得到前所未有的增加(例如,10? 個受試者影像)。
我們能否直接使用深度學習庫進行生物醫學成像?為什么要創建 DLTK?
之所以要創建DLTK,是因為要提供開箱即用并特定于該領域的專業工具。盡管許多深度學習庫向開發者公開了低級運算(如張量乘法等),但許多用于體積影像的較高級別專用運算卻并未公開(例如,可區分的 3D 上采樣層等),并且由于影像的其他空間維度,我們可能會遇到內存問題(例如,假設影像尺寸為 512x512x256 體素,那么以 float32 格式存儲包含 1000 個 CT 影像的數據庫的單個副本將需要大約 268 GB)。由于采集的性質不同,一些影像需要特殊的預處理(例如,強度歸一化、偏置場校正、去噪、空間歸一化/配準等)。
文件格式、頭和讀取影像
雖然許多成像模式供應商都按照DICOM標準格式制作影像并在一系列 2D 切片中保存卷,許多分析庫還是依賴于更適合計算和與醫學影像連接的格式。我們使用的是NifTI(或 .nii 格式),這種格式最初開發用于腦部成像,但廣泛用于DLTK和本教程中的大多數其他體積影像。這種格式和其他格式保存的內容是重建影像容器并將其在物理空間中定位的必要信息。
為此,它需要專用頭信息,我們將對用于深度學習的一些屬性進行介紹:
尺寸和大小存儲有關如何重建影像的信息(例如,使用大小向量將體積分解為三維)
數據類型
體素間距(也是體素的物理尺寸,通常以毫米為單位)
物理坐標系原點
方向
為什么這些屬性很重要?網絡將在體素空間中進行訓練,這意味著我們將創建形狀和尺寸為 [batch_size, dx, dy, dz, channels/features] 的張量并將其提供給網絡。網絡將在該體素空間中進行訓練并假設所有影像(包括未見過的測試影像)在該空間中歸一化或者可能有需要泛化的問題。在該體素空間中,特征提取器(如卷積層)將假設體素尺寸各向同性(即,在每個維度中均相同)并且所有影像以相同的方式定向。
然而,由于大多數影像描述的都是物理空間,我們需要從該物理空間轉換為常見的體素空間:
如果所有影像均以相同的方式定向(有時我們需要進行配準以在空間內歸一化影像:請參見MIRTK),我們可以通過以下公式計算從物理空間到體素空間的縮放轉換:
phys_coords = origin + voxel_spacing * voxel_coord
所有上述信息均為 .nii 頭文件中存儲的向量。
讀取 .nii 影像:可通過一些庫讀取 .nii 文件并訪問和解析頭信息以獲得numpy陣列格式的重建影像容器。我們選擇的是SimpleITK,這是ITK庫的一種 python 包裝器,可用于導入額外的影像過濾器以進行預處理和其他任務。
數據 I/O 注意事項
根據訓練數據庫的大小,可通過幾種不同方法將 .nii 影像數據提供給網絡圖。每種方法在速度方面都有特定的權衡,并且在訓練期間可能成為瓶頸。我們將介紹并解釋以下三個選項:
在內存和饋送字典中:
我們可以創建一個指向網絡圖的tf.placeholder并在訓練期間通過 feed_dict 提供。我們從磁盤讀取所有 .nii 文件,在 python 中處理文件(參見load_data())并將所有訓練示例存儲在內存中,通過以下方式提供:
TLDR:此直接法通常速度最快且最容易實現,因為它避免了從磁盤連續讀取數據,但需要在內存中保留整個訓練示例(和驗證示例)數據庫,這對于較大的數據庫或影像文件并不可行。
使用TFRecords數據庫:
對于有關體積影像的大多數深度學習問題,訓練示例數據庫太大而無法存入內存。TFRecords格式允許序列化訓練示例并將其存儲在磁盤上,支持快速寫訪問(即并行數據讀取):
此格式可以直接與TensorFlow連接并且可以直接集成到 tf.graph 中的訓練循環中:
TLDR:TFRecords可快速訪問磁盤文件,但需要為整個訓練數據庫另外存儲一個副本。如果我們要使用幾 TB 大小的數據庫,這種方法可能會讓人望而卻步。
使用原生 python 生成器:
最后,我們可以使用 python 生成器創建一個read_fn()以直接加載影像數據…
并使用tf.data.Dataset.from_generator()將示例排隊:
TLDR:這種方法避免了額外創建影像數據庫副本,但速度要比TFRecords慢得多,因為生成器不能并行讀取和映射函數。
速度基準測試以及選擇方法:
我們運行了上述三種方法向TensorFlow讀取 .nii 文件,并比較了加載和提供固定大小的示例數據庫所需的時間。所有代碼和結果都可以在上文找到。
顯而易見,最快的方法是通過占位符從內存中提供,時間為 5.6 秒,其次是TFRecords,時間為 31.1 秒,最后是使用 python 生成器的未優化磁盤讀取,時間為 123.5 秒。然而,只要訓練期間的前向/后向傳遞是計算瓶頸,數據 I/O 的速度就可以忽略不計。
數據歸一化
與自然影像一樣,我們也可以對生物醫學影像數據進行歸一化,但方法可能略有不同。歸一化的目的是消除數據中的一些已知差異(例如,受試者姿勢或影像對比度不同等),從而簡化對我們感興趣的細微差異的檢測(例如,存在病變)。本文將介紹最常見的歸一化形式:
體素強度歸一化:
這種形式高度依賴于采集數據所用的成像模式。典型的零均值單位方差歸一化是定性影像的標準(例如,加權腦部 MR 影像,其中對比度高度依賴于采集參數,通常由專家設置)。如果我們采用這種統計方法,我們將使用完整單一卷的統計數據,而不是整個數據庫。
與此相反,定量成像測量物理量(例如,CT 成像中的放射強度,其中不同掃描儀的強度類似)并且受益于削波和/或重新縮放,如簡單范圍歸一化(例如 [-1,1])。
強度歸一化方法示例
空間歸一化:
通過使用影像方向歸一化,模型無需學習所有可能的方向,從而大大減少了所需的訓練影像的數量(請參見頭屬性的重要性,了解影像的方向)。此外,我們還考慮了體素間距,即使采集自同一掃描儀,影像之間也可能存在差異。可通過重新采樣為各向同性分辨率來實現這一點:
如果需要進一步歸一化,我們可以使用醫學影像配準包(例如MIRTK,等等)將影像配準到相同的空間中,使影像之間的體素位置彼此對應。分析結構性腦部 MR 影像(例如 T1 加權 MR 影像)的典型步驟是按參考標準配準訓練數據庫中的所有影像,例如平均圖集(如MNI 305圖集)。根據配準方法的自由度,也可以針對尺寸(仿射配準)或形狀(可變形配準)歸一化。這兩種變體很少使用,因為它們去除了影像中的一些信息(即形狀信息或尺寸信息),而這些信息可能對分析有著重要意義(例如,心臟較大可能預示有心臟病)。
數據增強
通常情況下,可用的數據量有限,并且未涵蓋某些差異。一些例子如下所示:
存在各種正常形狀的軟組織器官
形狀和位置存在顯著差異的病變,如癌變
可能有很多視圖的手動超聲影像
為了正確地泛化到未見過的測試用例,我們通過模擬待增強數據中的差異來增強訓練影像。與歸一化方法類似,我們對強度和空間增強加以區分:
強度增強示例:
向訓練影像添加噪聲以泛化為噪聲影像
添加隨機偏移或對比度以處理影像之間的差異
空間增強示例:
在需要對稱性的方向上翻轉影像張量(例如,在掃描腦部時左/右翻轉)
隨機變形(例如,用于模仿器官形狀的差異)
沿軸旋轉(例如,用于模擬超聲視角差異)
在塊上進行隨機裁剪和訓練
強度和空間增強技術示例
關于增強和數據 I/O 的重要說明:根據所需或有用的增強,某些操作僅在 python 中可用(例如,隨機變形),也就是說,如果采用使用原始TensorFlow(即TFRecords或tf.placeholder)的讀取方法,它們需要預先計算并存儲到磁盤中,因此大大增加了訓練數據庫的大小。
類平衡
基于醫學影像進行監督式學習期間,必須由領域專家解釋(如手動分割或疾病類別)。通常,影像級(如疾病類別)或體素級(即分割)標簽的比率不能相同,這意味著在訓練期間網絡不會從每個類看到相同數量的示例。如果類比率基本相似(例如,對于二元分類情況,比率為 30/70),則對準確性沒有太大影響。然而,由于大多數損失是整個批次的平均成本,因此網絡將首先學會正確預測最常見的類(例如,背景或正常情況,通常有更多可用的示例)。
如果訓練期間類不平衡,將對罕見現象(如影像分割中的小病變)產生較大影響,并在很大程度上影響測試的準確性。
為了避免這種情況,可通過兩種典型方法來解決數據集中的類不平衡問題:
通過采樣實現類平衡:我們此時的目標是更正采樣過程中已見過示例的頻率。可通過以下方式來完成:
a) 從每個類中抽取相等的量
b) 對出現過多的類進行欠采樣或
c) 對頻率較低的類進行過采樣。
在DLTK中,我們提供了針對方式 a 的實現,可點擊此處獲取。我們對影像卷中的隨機位置進行采樣,并考慮一個提取的示例(如果包含我們要尋找的類)。
注:此處 鏈接
https://github.com/DLTK/DLTK/blob/blog/dltk/io/augmentation.py#L120
通過損失函數實現類平衡:與典型的體素平均損失(如分類交叉熵、L2 等)相反,我們可以 a) 使用本質上平衡的損失函數(如平滑的 Dice 損失,即所有類的平均 Dice 系數)或 b)按類頻率將每個預測的損失重新加權(例如,中值頻率重新加權交叉熵)。
應用亮點示例
通過本博文中提供的所有基礎知識,我們現在可以使用TensorFlow著手構建用于醫學影像深度學習的完整應用。我們已經使用深度神經網絡實現了幾個典型應用,接下來將對其中一些進行介紹,讓您了解現在可以嘗試解決哪些問題。
注:這些示例應用學習了一些有意義的內容,但它們是為了演示而構建,而不是高性能的實現。
示例數據集
對于以下所有示例,我們均提供下載和預處理腳本。對于大多數情況(包括上面的演示),我們使用的是IXI大腦數據庫。對于影像分割,我們下載了MRBrainS13挑戰數據庫,您需要注冊才能下載。
多通道腦部 MR 影像的影像分割
多序列影像輸入、目標標簽和預測的 Tensorboard 可視化
此影像分割應用基于小型 (N=5)MRBrainS挑戰數據集根據多序列 MR 影像(T1 加權、T1 反轉恢復和 T2 FLAIR)學習預測腦組織和白質病變。它使用以殘差單位作為特征提取器的 3D U-Net 型網絡,并在TensorBoard中跟蹤每個標簽的 Dice 系數精度。
有關代碼和說明,請點擊此處。
注:此處鏈接
https://github.com/DLTK/DLTK/tree/master/examples/applications/MRBrainS13_tissue_segmentation
T1 加權腦部 MR 影像的年齡回歸和性別分類
用于回歸和分類的 T1 加權腦部 MR 影像輸入示例
采用可擴展 3D ResNet 架構的兩個類似應用基于IXI數據庫中的 T1 加權腦部 MR 圖像學習預測受試者的年齡(回歸)或受試者的性別(分類)。這兩個應用的主要區別在于損失函數:盡管我們訓練回歸網絡將年齡預測為具有 L2 損失的連續變量(預測年齡與實際年齡之間的均方差),但我們使用分類交叉熵損失來預測性別類別。
有關這些應用的代碼和說明,請點擊分類和回歸。
注:分類鏈接https://github.com/DLTK/DLTK/tree/master/examples/applications/IXI_HH_sex_classification_resnet
回歸鏈接
https://github.com/DLTK/DLTK/tree/master/examples/applications/IXI_HH_age_regression_resnet
3T 多通道腦部 MR 影像的表示學習
使用深度卷積自動編碼器網絡測試影像和重建
此處我們演示了深度卷積自動編碼器架構(一種強大的表示學習工具)的使用方法:網絡將多序列 MR 影像作為輸入,旨在對其進行重建。借此在其潛在變量中壓縮整個訓練數據庫的信息。訓練后的權重也可用于轉移學習或信息壓縮。請注意,重建的影像非常平滑:這可能是由于此應用使用 L2 損失函數或網絡太小而無法正確編碼詳細信息。
有關代碼和說明,請點擊此處。
注:此處鏈接
https://github.com/DLTK/DLTK/tree/master/examples/applications/IXI_HH_representation_learning_cae
T1w 腦部 MR 影像的簡單影像超分辨率
影像超分辨率:原始目標影像;下采樣輸入影像;線性上采樣影像;預測超分辨率;
單影像超分辨率旨在學習如何基于低分辨率輸入上采樣和重建高分辨率影像。這一簡單實現創建了低分辨率版本的影像,超分辨率網絡學習將影像上采樣為其原始分辨率(此處上采樣因子為 [4,4,4])。此外,我們還計算線性采樣版本以顯示與重建影像的差異。
最后
我們希望本教程能夠幫助您輕松開啟生物醫學圖像深度學習的探索之旅。如果您覺得這篇教程有用,敬請分享并關注 github 上的DLTK。如果您有類似問題需要幫助,請訪問我們的gitter.io聊天室并詢問。或許有一天我們可以在DLTKmodel zoo中托管您的應用。感謝您的閱讀!
-
醫學影像
+關注
關注
1文章
112瀏覽量
17533 -
計算機視覺
+關注
關注
9文章
1706瀏覽量
46563 -
深度學習
+關注
關注
73文章
5554瀏覽量
122468
原文標題:使用 TensorFlow 和 DLTK 進行生物醫學影像分析
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
駱文生物誠聘生物醫學人才
生物醫學工程, 想做一個基于單片機的畢業設計求大家給點兒建議
生物信號和生物醫學的圖像處理:以Matlab為基礎的應用程序

生物醫學石英晶體傳感器的研究動向
生物醫學電子學在生物醫學工程中的應用?
自驅動柔性生物醫學傳感器的定義
微軟團隊發布生物醫學領域NLP基準

開啟英特爾RISC-V探索之旅
開啟探索之旅丨軟通動力邀您共同見證華為開發者大會2023 ( Cloud )

功率放大器在生物醫學領域測試研究中的應用

評論