1. 程式人生 > >GitChat·人工智慧 | 腫瘤醫療影像 AI 識別技術實踐

GitChat·人工智慧 | 腫瘤醫療影像 AI 識別技術實踐

GitChat 作者:王曉明
更多IT技術分享,盡在微信公眾號:GitChat

前言

醫學影像與人工智慧的結合,是數字醫療領域較新的分支和產業熱點。醫學影像的解讀需要長時間專業經驗的積累,醫生的培養週期相對較長,很多程度上,深度學習和醫生的學習過程是一樣的,通過海量知識的學習理解和應用,而人工智慧在對影象的檢測效率和精度兩個方面,可以做得比專業醫生更快。

大資料與人工智慧等前沿技術在醫療領域應用已經成為一種趨勢,將大資料驅動的人工智慧應用於癌症診斷中,無疑為患者僻出一線生機,不僅可以挽救無數患者的生命,而且對於緩解醫療資源和醫患矛盾也有重大意義。

一、醫學影像的簡要介紹

醫學影像是指為了醫療或醫學研究,對人體或人體某部分,以非侵入方式取得內部組織影像的技術與處理過程。它包含以下兩個相對獨立的研究方向:醫學成像系統(medical imaging system)和醫學影象處理(medical image processing)。前者是指影象行成的過程,包括對成像機理、成像裝置、成像系統分析等問題的研究;後者是指對已經獲得的影象作進一步的處理,其目的是或者是使原來不夠清晰的影象復原,或者是為了突出影象中的某些特徵資訊,或者是對影象做模式分類等等。

現代醫學影像學的高速發展,醫學影像技術已經由傳統單一普通X線加血管造影檢查形成包括UI、CT、CR、DR、MRI、PET、PET-CT、數字減影血管造影以及PACS等多種技術組成的醫學影像學體系。影像成像技術的不斷豐富使醫學影像從“輔助檢查手段”變為現代醫學最重要的臨床診斷和鑑別診斷方法。接下來醫學影像將向三個方向發展:(1)由單一形態學影像檢查裝置向“形態+功能”的融合型影像發展;(2)由大型裝置轉向小型、簡便的床邊化儀器,未來將越來越多地投入應用到重症監護、家庭醫療、預防保健等領域;(3)現代醫學影像技術與放射治療手段結合,使診斷與治療一體化。我們認為,更先進和便利的影像診斷裝置將使臨床診療將更加依賴於影像檢查,帶來影像需求增多,迴圈促進影像裝置領域的發展。

大資料人工智慧分析技術使得醫學影像診斷軟硬體變得更智慧化。用深度學習技術分析醫學影像和視訊是一個新的研究方向。通過已訓練好的卷積神經網路,能很快地搭建並訓練自己的深度學習系統。

二、用 Python 進行影象處理的基礎

用於影象處理的庫有很多,其中 OpenCV(Open computer vision) 比較主流,基於C/C++,支援Linux/Windows/MacOS/Android/iOS,並提供了Python,Matlab和Java等語言的介面,因為其豐富的介面,優秀的效能和商業友好的使用許可,不管是學術界還是業界中都非常受歡迎。作為當前非常流行的動態語言之一,Python不僅使用非常簡單,而且功能強大。通過Python來學習OpenCV框架,可以讓你很快理解計算機視覺的基本概念以及重要演算法。

安裝時,既可以用 pip install opencv-python,也可以從 opencv.org 下載原始碼。本文簡單介紹pip安裝的方式。

pip install --upgrade setuptools

pip install numpy Matplotlib

pip install opencv-python

enter image description here
圖2-1 載入胃部病歷切片的Python程式碼示例

三、用於影象識別的神經網路

1943年,心理學家W.S.McCulloch和數理邏輯學家W.Pitts建立了神經網路和數學模型,稱為MP模型。他們通過MP模型提出了神經元的形式化數學描述和網路結構方法,證明了單個神經元能執行邏輯功能,從而開創了人工神經網路研究的時代。

卷積神經網路是對人工神經網路的進一步改進,是一種專門為了識別二維影象而設 計的一種能夠自動提取影象特徵的特殊的多層感知器。原始影象不需要太多的預處理就 可以較好的學習到影象的不變性特徵。目前,典型的卷積神經網路是一個多層的、可訓練的體系結構。包括輸入、卷積層(區域性連線層)、抽樣層、歸一化層、全連線層、邏輯迴歸層和輸出層等等。如何提高卷積神經網路對影象的識別效果,需要識別的資料集 如何找到最合適的網路結構和引數配置,以及對於不同的資料集都具有一定相容性的網路結構成為現在研究的熱點。

典型的卷積神經網路的概念模型如圖 3-1 所示。每一層是由多個二維平面組成。網路中包括卷積層和池化層,分別表示為 C 層和 S 層。網路中間還包含著一些隱藏層,它們在全連線層。在網路體系結構中,輸入層只有一個,它直接接收二維物件,對於樣本的特徵提取過程是巢狀在卷積和池化過程中。在全連線層內包含多個隱含層,主要實現分類的過程。

enter image description here
圖3-1 卷積神經網路通用模型

圖3-2中顯示了卷積層神經網路結構中最重要的部分,這個部分被稱之為過濾器(filter)或者核心(kernel)。因為TensorFlow文件中將這個結構稱之為過濾器(filter),所以我們將統稱這個結構為過濾器。如圖4所示,過濾器可以將當前層神經網路上的一個子節點矩陣轉化為下一層神經網路上的一個單位節點矩陣。單位節點矩陣指的是一個長和寬都為1,但深度不限的節點矩陣。

enter image description here
圖3-2 卷積層過濾器(filter)結構示意圖

在一個卷積層中,過濾器所處理的節點矩陣的長和寬都是由人工指定的,這個節點矩陣的尺寸也被稱之為過濾器的尺寸。常用的過濾器尺寸有3×3或5×5。因為過濾器處理的矩陣深度和當前層神經網路節點矩陣的深度是一致的,所以雖然節點矩陣是三維的,但過濾器的尺寸只需要指定兩個維度。過濾器中另外一個需要人工指定的設定是處理得到的單位節點矩陣的深度,這個設定稱為過濾器的深度。注意過濾器的尺寸指的是一個過濾器輸入節點矩陣的大小,而深度指的是輸出單位節點矩陣的深度。如圖3-2所示,左側小矩陣的尺寸為過濾器的尺寸,而右側單位矩陣的深度為過濾器的深度。

TensorFlow對卷積神經網路提供了非常好的支援,下面的程式實現了一個卷積層的前向傳播過程。從以下程式碼可以看出,通過TensorFlow實現卷積層是非常方便的。

    # 通過tf.get_variable的方式建立過濾器的權重變數和偏置項變數。上面介紹了卷積層
    # 的引數個數只和過濾器的尺寸、深度以及當前層節點矩陣的深度有關,所以這裡宣告的引數變
    # 量是一個四維矩陣,前面兩個維度代表了過濾器的尺寸,第三個維度表示當前層的深度,第四
    # 個維度表示過濾器的深度。
    filter_weight = tf.get_variable(
        'weights', [5, 5, 3, 16], 
        initializer=tf.truncated_normal_initializer(stddev=0.1))
    # 和卷積層的權重類似,當前層矩陣上不同位置的偏置項也是共享的,所以總共有下一層深度個不
    # 同的偏置項。本樣例程式碼中16為過濾器的深度,也是神經網路中下一層節點矩陣的深度。
    biases = tf.get_variable(
        'biases', [16], initializer=tf.constant_initializer(0.1))

    # tf.nn.conv2d提供了一個非常方便的函式來實現卷積層前向傳播的演算法。這個函式的第一個輸
    # 入為當前層的節點矩陣。注意這個矩陣是一個四維矩陣,後面三個維度對應一個節點矩陣,第一
    # 維對應一個輸入batch。比如在輸入層,input[0,:,:,:]表示第一張圖片,input[1,:,:,:] 
    # 表示第二張圖片,以此類推。tf.nn.conv2d第二個引數提供了卷積層的權重,第三個引數為不
    # 同維度上的步長。雖然第三個引數提供的是一個長度為4的陣列,但是第一維和最後一維的數字
    # 要求一定是1。這是因為卷積層的步長只對矩陣的長和寬有效。最後一個引數是填充(padding)
    # 的方法,TensorFlow中提供SAME或是VALID兩種選擇。其中SAME表示新增全0填充,
    # “VALID”表示不新增。
    conv = tf.nn.conv2d(
        input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')

    # tf.nn.bias_add提供了一個方便的函式給每一個節點加上偏置項。注意這裡不能直接使用加
    # 法,因為矩陣上不同位置上的節點都需要加上同樣的偏置項。雖然下一層神經網路的大小為
    # 2×2,但是偏置項只有一個數(因為深度為1),而2×2矩陣中的每一個值都需要加上這個
    # 偏置項。
    bias = tf.nn.bias_add(conv, biases)
    # 將計算結果通過ReLU啟用函式完成去線性化。
    actived_conv = tf.nn.relu(bias)

在卷積神經網路中,卷積層之間往往會加上一個池化層(pooling layer)。池化層可以非常有效地縮小矩陣的尺寸,從而減少最後全連線層中的引數。使用池化層既可以加快計算速度也有防止過擬合問題的作用。和卷積層類似,池化層前向傳播的過程也是通過移動一個類似過濾器的結構完成的。不過池化層過濾器中的計算不是節點的加權和,而是採用更加簡單的最大值或者平均值運算。使用最大值操作的池化層被稱之為最大池化層(max pooling),這是被使用得最多的池化層結構。使用平均值操作的池化層被稱之為平均池化層(average pooling)。

    # tf.nn. max_pool實現了最大池化層的前向傳播過程,它的引數和tf.nn.conv2d函式類似。
    # ksize提供了過濾器的尺寸,strides提供了步長資訊,padding提供了是否使用全0填充。
    pool = tf.nn.max_pool(actived_conv, ksize=[1, 3, 3, 1], 
                              strides=[1, 2, 2, 1], padding='SAME')

我們通過一個影象分類問題介紹卷積神經網路是如何工作的。下面是卷積神經網路判斷一個圖片是否包含“兒童”的過程,包括四個步驟:影象輸入(InputImage)→卷積(Convolution)→最大池化(MaxPooling)→全連線神經網路(Fully-ConnectedNeural Network)計算。

enter image description here
圖3-3 神經網路判斷一個圖片是否包含“兒童”的過程

首先將圖片分割成如下圖的重疊的獨立小塊。接下來將每一個獨立小塊輸入小的神經網路;這個小的神經網路已經被訓練用來判斷一個圖片是否屬於“兒童”類別,它輸出的是一個特徵陣列。 標準的數碼相機有紅、綠、藍三個通道(Channels),每一種顏色的畫素值在0-255之間,構成三個堆疊的二維矩陣;灰度影象則只有一個通道,可以用一個二維矩陣來表示。

將所有的獨立小塊輸入小的神經網路後,再將每一個輸出的特徵陣列按照第一步時77個獨立小塊的相對位置做排布,得到一個新陣列。

第二步中,這個小的神經網路對這77張大小相同的小圖片都進行同樣的計算,也稱權重共享(SharedWeights)。這樣做是因為,第一,對影象等陣列資料來說,區域性陣列的值經常是高度相關的,可以形成容易被探測到的獨特的區域性特徵;第二,影象和其它訊號的區域性統計特徵與其位置是不太相關的,如果特徵圖能在圖片的一個部分出現,也能出現在任何地方。所以不同位置的單元共享同樣的權重,並在陣列的不同部分探測相同的模式。數學上,這種由一個特徵圖執行的過濾操作是一個離散的卷積,卷積神經網路由此得名。

卷積步驟完成後,再使用MaxPooling演算法來縮減畫素取樣陣列,按照2×2來分割特徵矩陣,分出的每一個網格中只保留最大值陣列,丟棄其它陣列,得到最大池化陣列(Max-PooledArray)。 接下來將最大池化陣列作為另一個神經網路的輸入,這個全連線神經網路會最終計算出此圖是否符合預期的判斷。

在實際應用時,卷積、最大池化和全連線神經網路計算,這幾步中的每一步都可以多次重複進行,總思路是將大圖片不斷壓縮,直到輸出單一的值。使用更多卷積步驟,神經網路就可以處理和學習更多的特徵。

四、胃癌病理切片的識別

在醫學影像領域,病理圖片向來是醫療領域的“金標準”,病理診斷是對疾病下最終判斷的環節。人工讀片會有:主觀性高、重複性低、定量及資訊利用度不足、耗時及勞動強度和知識經驗的傳承困難等問題。而人工智慧病理切片識別系統的優勢在於能自動分析、分割、檢測感興趣區域、能夠定量地評估病變區域的變異程度,結果具有可重複性。

enter image description here
圖4-1 胃癌病理切片

圖4-1被橙色曲線所標註的區域是為此圖中可見的部分癌巢(細胞發生癌變的區域);癌巢與正常區域看起來十分不同,幾個藍色方框選取的區域即是正常區域的示例。這些不同主要是由於癌細胞的形態學特徵和相互間的排列分佈,與正常區域的細胞截然不同而造成的。

胃癌病理切片識別的目標是利於深度卷積神經網路技術,使計算機能夠自動地將胃癌數字組織病理切片的區域性視野中的癌巢快速精準地標識出來。

選取胃癌病理切片,為常規HE染色,放大倍數20×,圖片大小為2048×2048畫素,tiff 格式。選取200個病人案例(80%癌症、20%非癌症),共計2000張病理切片圖片,訓練集數量1500張,測試集數量500張。

資料標註:

病理專家將資料標記(雙盲評估+驗證)為有無癌症,並用線條畫出腫瘤區域輪廓,提供知識圖譜說明。

關於胃癌病理切片AI識別其實是2017中國大資料人工智慧創新創業大賽的一個賽題。大賽官網:http://www.datadreams.org/race-race-3.html 我是2016年上海BOT大賽聊天機器人的參賽者,這裡算是免費給他們打個廣告,有興趣的同學可以找我組團打比賽。

五、AI 技術在醫療領域的前景分析

人工智慧的最大特點就是高效的計算和精準的分析與決策,這一點剛好擊中現在的醫療痛點,或能從根本上解決醫療資源供不應求的局面。醫學影像的識別是人工智慧切入醫療行業的一個切入點,因為病理科,放射科醫生讀片是醫療領域的一個明顯的痛點。未來醫療一定是向精準個性化醫療的方向發展,但是發展路途上也有很多障礙,比如電子病歷資料分散在各家醫院,資料的收集整理工作是一個漫長而艱難的任務。分析病歷文字的NLP技術目前也不是很成熟,在構建醫療知識圖譜的過程中,需要大量專業醫生的參與等等。人工智慧+醫療,一定是需要人工智慧人才+醫生通力合作才能研發出適合醫生的智慧輔助診斷系統。

這裡寫圖片描述