據(jù)集解析與數(shù)據(jù)增強(qiáng)實(shí)戰(zhàn))
簡(jiǎn)介醫(yī)學(xué)圖像分割中胰腺因形態(tài)復(fù)雜、個(gè)體差異大而極具挑戰(zhàn)性?;贑T三視圖橫斷面、冠狀面、矢狀面的2D分割方案通過(guò)將三維信息拆解為多視角二維切片兼顧顯存效率與解剖結(jié)構(gòu)特征成為實(shí)用的工程折中。數(shù)據(jù)增強(qiáng)是提升模型魯棒性的關(guān)鍵包括旋轉(zhuǎn)、彈性形變、灰度擾動(dòng)等策略需結(jié)合醫(yī)學(xué)解剖約束謹(jǐn)慎調(diào)參。該方案適用于科研實(shí)驗(yàn)、算法預(yù)研及醫(yī)學(xué)影像AI入門(mén)配合U-Net等經(jīng)典網(wǎng)絡(luò)可實(shí)現(xiàn)端到端訓(xùn)練。通過(guò)詳解胰腺2D三視圖分割數(shù)據(jù)集的數(shù)據(jù)組織、增強(qiáng)參數(shù)選擇及訓(xùn)練流程開(kāi)發(fā)者可快速構(gòu)建高精度分割pipeline。1. 數(shù)據(jù)集的定位為什么偏偏是“胰腺”和“2D”說(shuō)實(shí)話醫(yī)學(xué)圖像分割這個(gè)領(lǐng)域里難度排得上號(hào)的器官胰腺絕對(duì)算一個(gè)。肝臟、腎臟、心臟這些結(jié)構(gòu)相對(duì)規(guī)整邊界也清楚深度學(xué)習(xí)模型上手就能打得有模有樣。但胰腺不一樣它深藏在腹膜后周?chē)恢?、血管、十二指腸包圍形態(tài)又細(xì)又長(zhǎng)個(gè)體差異極大不同病人之間長(zhǎng)得完全不像同一個(gè)器官。你讓醫(yī)生自己在CT上勾一遍胰腺邊界他都要盯著看半天。模型想學(xué)明白胰腺長(zhǎng)什么樣光靠一個(gè)方向的信息遠(yuǎn)遠(yuǎn)不夠這正是這個(gè)數(shù)據(jù)集的價(jià)值所在。再來(lái)說(shuō)“2D分割”這個(gè)選擇。很多做醫(yī)學(xué)影像的人一上來(lái)就想著上3D模型覺(jué)得三維信息更完整效果一定更好。理論上是這樣但實(shí)際落地時(shí)會(huì)遇到一堆現(xiàn)實(shí)問(wèn)題顯存不夠、訓(xùn)練時(shí)間長(zhǎng)、標(biāo)注數(shù)據(jù)少、3D模型調(diào)參成本高。2D分割配合多切面信息是一種非常務(wù)實(shí)的折中方案——橫斷面、冠狀面、矢狀面三個(gè)方向各切一刀等于把三維空間的信息拆成三個(gè)正交的二維視角讓模型分別學(xué)習(xí)三個(gè)方向的解剖特征。這個(gè)數(shù)據(jù)集把三個(gè)切面的2D數(shù)據(jù)都準(zhǔn)備好了還額外做了數(shù)據(jù)增強(qiáng)省去了你自己寫(xiě)預(yù)處理、寫(xiě)切圖、寫(xiě)增強(qiáng)代碼的大量時(shí)間直接就可以喂給U-Net、DeepLabV3這類(lèi)經(jīng)典2D分割網(wǎng)絡(luò)。適合誰(shuí)來(lái)用三類(lèi)人一是在校研究生做醫(yī)學(xué)圖像分割方向但暫時(shí)沒(méi)有醫(yī)院合作數(shù)據(jù)拿這個(gè)數(shù)據(jù)集跑實(shí)驗(yàn)、發(fā)論文非常合適二是剛?cè)胄嗅t(yī)學(xué)影像AI的工程師想快速跑通一個(gè)完整的分割pipeline熟悉數(shù)據(jù)格式和訓(xùn)練流程三是做算法預(yù)研的團(tuán)隊(duì)想驗(yàn)證某種數(shù)據(jù)增強(qiáng)策略或者2D多視角模型方案的效果用這個(gè)數(shù)據(jù)集做基準(zhǔn)測(cè)試比用公開(kāi)大數(shù)據(jù)集靈活得多。從我實(shí)際使用的感受來(lái)說(shuō)這個(gè)數(shù)據(jù)集最大的優(yōu)點(diǎn)不是數(shù)據(jù)量有多大而是它把“三視圖像分割”這個(gè)思路給落到了實(shí)處。切片維度、存儲(chǔ)格式、增強(qiáng)方式都幫你搭好了框架你拿到手可以直接研究模型結(jié)構(gòu)或者訓(xùn)練策略不用把時(shí)間耗在數(shù)據(jù)整理這類(lèi)臟活上。2. 核心內(nèi)容拆解三視圖切分里的門(mén)道2.1 橫斷面、冠狀面、矢狀面到底切的是什么對(duì)于不熟悉醫(yī)學(xué)影像的人我先把三個(gè)面對(duì)應(yīng)清楚。CT掃描的原始數(shù)據(jù)是一個(gè)三維體數(shù)據(jù)是由很多層橫斷面圖像堆疊而成的。橫斷面就是軸位面與人體長(zhǎng)軸垂直也就是你在醫(yī)院看到的CT膠片那種視角從左到右是病人身體的左右從上到下是前后這個(gè)面包含信息最豐富也是最常用的診斷視角。冠狀面是從前到后方向投影展開(kāi)相當(dāng)于把人體拍扁了貼墻上從正面看能看到器官的上下和左右關(guān)系。矢狀面是從左到右方向投影展開(kāi)相當(dāng)于從側(cè)面看人體能看到器官的前后和上下關(guān)系。同一張CT體數(shù)據(jù)沿著三個(gè)方向切得到的是完全不同視角的解剖結(jié)構(gòu)。胰腺這個(gè)器官很有意思它在橫斷面上呈現(xiàn)的是條狀或鉤形在冠狀面上是一個(gè)斜行的長(zhǎng)條在矢狀面上則顯得扁而長(zhǎng)。這意味著同一個(gè)病人的同一個(gè)器官在不同切面上呈現(xiàn)的紋理、形狀、背景組織都不一樣。讓模型同時(shí)看這三個(gè)視角等于強(qiáng)迫它學(xué)習(xí)胰腺的三維空間結(jié)構(gòu)而不是只記住某一種固定形態(tài)。切片的具體做法是關(guān)鍵。橫斷面最簡(jiǎn)單體數(shù)據(jù)本身就是這個(gè)方向采集的直接按層序取就行。冠狀面和矢狀面需要做重采樣把體數(shù)據(jù)按照對(duì)應(yīng)軸進(jìn)行切片。這一步有個(gè)坑原始CT的層間距和層內(nèi)像素間距往往不一致比如層內(nèi)是0.7mm層間距是1.5mm如果直接按體素索引切冠狀面和矢狀面的圖像比例會(huì)失真器官看起來(lái)被拉伸或壓扁。正確的做法是先重采樣成各向同性體素也就是三個(gè)方向間距一致再做切面。這個(gè)數(shù)據(jù)集在這點(diǎn)上處理得比較干凈三視圖的圖像比例基本協(xié)調(diào)模型訓(xùn)練時(shí)不用額外處理形狀變形問(wèn)題。2.2 2D分割數(shù)據(jù)集的存儲(chǔ)結(jié)構(gòu)和標(biāo)注格式數(shù)據(jù)集拿到手第一件事是搞清楚目錄結(jié)構(gòu)。通常organized成訓(xùn)練集、驗(yàn)證集、測(cè)試集三個(gè)目錄每個(gè)目錄里面按圖像和標(biāo)注分開(kāi)存放。圖像是CT的2D切片標(biāo)注是對(duì)應(yīng)的胰腺掩膜mask像素值為0表示背景1表示胰腺區(qū)域。文件命名上會(huì)體現(xiàn)切面方向和原始3D體數(shù)據(jù)的對(duì)應(yīng)關(guān)系方便回溯到同一個(gè)病人的三維空間位置。有一個(gè)細(xì)節(jié)值得注意圖像的灰度范圍。原始CT值單位是HUHounsfield Unit范圍在-1024到3071之間胰腺組織的典型CT值大約在30到60 HU周?chē)驹?100到-50 HU所以對(duì)比度并不算高。直接用原始數(shù)值訓(xùn)練神經(jīng)網(wǎng)絡(luò)效果很差需要做窗寬窗位調(diào)整。胰腺分割一般使用腹部窗窗寬大約400 HU窗位大約40 HU也就是把-160到240 HU的范圍映射到0到255。這個(gè)映射關(guān)系在數(shù)據(jù)集里是預(yù)先做好的切片數(shù)據(jù)已經(jīng)是8位灰度圖直接用就行。標(biāo)注的生成方式也值得說(shuō)一下。如果標(biāo)注是專(zhuān)家手工勾畫(huà)的那質(zhì)量相對(duì)有保障。如果是從某個(gè)3D分割模型的輸出結(jié)果切出來(lái)的那就需要花點(diǎn)精力檢查邊緣質(zhì)量。我拿到數(shù)據(jù)后習(xí)慣隨機(jī)抽幾十張圖和mask疊加查看重點(diǎn)看邊緣是否有鋸齒、是否有一些孤立的誤檢區(qū)域、切片之間標(biāo)注是否連續(xù)。這個(gè)檢查步驟看起來(lái)笨但能幫你提前發(fā)現(xiàn)很多會(huì)影響模型訓(xùn)練的問(wèn)題。2.3 從3D體數(shù)據(jù)到2D切片損失了什么保留了什么做3D轉(zhuǎn)2D切分本質(zhì)上是一個(gè)信息投影的過(guò)程必然有得有失。損失掉的是三維空間連續(xù)性和上下文信息。例如胰腺頭在橫斷面上看著像一團(tuán)到了矢狀面可能就是一個(gè)細(xì)長(zhǎng)的條單張2D圖像上很難判斷這個(gè)條狀結(jié)構(gòu)到底是血管還是胰腺。保留下來(lái)的是每個(gè)切面方向上清晰的細(xì)節(jié)紋理和邊界特征尤其是一些小結(jié)構(gòu)在2D上反而更容易學(xué)習(xí)。數(shù)據(jù)增強(qiáng)在這里起到了關(guān)鍵的補(bǔ)償作用。通過(guò)讓模型看到同一個(gè)切面在平移、旋轉(zhuǎn)、縮放、灰度擾動(dòng)下的不同形態(tài)模擬出各種現(xiàn)實(shí)中的變化比如病人體位略微不同、CT掃描參數(shù)有差異、增強(qiáng)造影劑濃度不同導(dǎo)致的灰度差異。正因?yàn)?D切分丟失了一部分三維上下文增強(qiáng)手段的豐富程度直接決定了模型對(duì)未見(jiàn)過(guò)數(shù)據(jù)的魯棒性。這個(gè)數(shù)據(jù)集在增強(qiáng)策略上做得比較全面這也是它省時(shí)間的核心價(jià)值之一。3. 數(shù)據(jù)增強(qiáng)的實(shí)戰(zhàn)方法與參數(shù)選擇3.1 幾何變換類(lèi)增強(qiáng)的原理與參數(shù)數(shù)據(jù)增強(qiáng)不是簡(jiǎn)單把圖片左右翻轉(zhuǎn)就完事在醫(yī)學(xué)圖像里每一步操作都有講究。幾何變換是增強(qiáng)體系里最基礎(chǔ)也最常用的一類(lèi)主要包括旋轉(zhuǎn)、翻轉(zhuǎn)、縮放、裁剪。旋轉(zhuǎn)的角度選擇很關(guān)鍵。自然圖像里旋轉(zhuǎn)45度、90度都很正常但醫(yī)學(xué)圖像里不能這么干。胰腺在解剖位置上有明確的上下左右關(guān)系旋轉(zhuǎn)角度過(guò)大會(huì)生成不符合解剖結(jié)構(gòu)的樣本模型學(xué)到一些不存在的形態(tài)推理時(shí)反而變差。實(shí)際經(jīng)驗(yàn)是旋轉(zhuǎn)角度控制在正負(fù)10度到15度之間比較合理。這個(gè)范圍足夠模擬病人擺位時(shí)身體的輕微傾斜又不會(huì)破壞器官的相對(duì)位置關(guān)系。翻轉(zhuǎn)要謹(jǐn)慎。橫斷面圖像左右翻轉(zhuǎn)是合理的因?yàn)槿梭w左右大致對(duì)稱器官位置也基本鏡像對(duì)稱。但上下翻轉(zhuǎn)不行頭部和腳部的位置關(guān)系不能顛倒。冠狀面和矢狀面同理需要根據(jù)解剖學(xué)意義判斷哪些軸可以翻。這個(gè)數(shù)據(jù)集在增強(qiáng)配置里默認(rèn)關(guān)閉了不合理解釋的翻轉(zhuǎn)方向如果你自己寫(xiě)增強(qiáng)流程這一點(diǎn)一定要檢查??s放增強(qiáng)的尺度范圍建議在0.9到1.1之間。過(guò)大的縮放會(huì)改變器官的相對(duì)大小影響模型對(duì)尺度敏感性的判斷。平移操作也很常用但幅度不宜太大以防器官被移動(dòng)到圖像邊緣甚至出界。實(shí)際中常用隨機(jī)裁剪配合縮放來(lái)實(shí)現(xiàn)類(lèi)似效果裁剪窗口在原圖面積的80%到100%之間隨機(jī)選取然后resize回原始輸入尺寸這種方式計(jì)算效率高且能讓模型適應(yīng)目標(biāo)出現(xiàn)在圖像不同位置的情況。3.2 灰度擾動(dòng)類(lèi)增強(qiáng)的醫(yī)學(xué)特殊性醫(yī)學(xué)圖像和自然圖像在增強(qiáng)上有一個(gè)本質(zhì)區(qū)別自然圖像的色彩擾動(dòng)學(xué)的是光照變化而醫(yī)學(xué)圖像的灰度擾動(dòng)學(xué)的是掃描參數(shù)差異和對(duì)比劑濃度差異。這一點(diǎn)很多做CV出身的人容易忽略。常用的灰度增強(qiáng)包括隨機(jī)亮度調(diào)整、對(duì)比度調(diào)整、伽馬校正。亮度調(diào)整模擬的是CT窗寬窗位不完全一致的情況偏移量控制在正負(fù)20個(gè)灰度級(jí)以內(nèi)即可太大就會(huì)讓脂肪和胰腺的灰度分布重疊。對(duì)比度調(diào)整模擬不同掃描設(shè)備的動(dòng)態(tài)范圍差異縮放系數(shù)在0.9到1.1之間。伽馬校正可以調(diào)整中間灰度區(qū)域的對(duì)比度分布讓模型更關(guān)注灰度過(guò)渡區(qū)域的紋理細(xì)節(jié)建議gamma范圍0.8到1.2。高斯噪聲的加入要把握好分寸。CT圖像本身含有噪聲加入適量高斯噪聲可以增強(qiáng)模型對(duì)低劑量CT圖像的適應(yīng)能力但噪聲過(guò)大會(huì)掩蓋真實(shí)的解剖結(jié)構(gòu)邊界。我個(gè)人的經(jīng)驗(yàn)是噪聲標(biāo)準(zhǔn)差設(shè)置在5到15之間比較穩(wěn)妥以圖像灰度范圍0到255為基準(zhǔn)。一個(gè)很多資料不會(huì)提的技巧是模擬部分容積效應(yīng)。CT掃描中一個(gè)體素內(nèi)可能同時(shí)包含兩種組織導(dǎo)致邊界區(qū)域的灰度值介于兩種組織之間??梢杂幂p微的高斯模糊模擬這種效應(yīng)核大小2到3像素隨機(jī)應(yīng)用在部分訓(xùn)練樣本上模型對(duì)模糊邊界的魯棒性會(huì)明顯提升。3.3 彈性形變最接近真實(shí)人體變形的增強(qiáng)方法彈性形變?cè)卺t(yī)學(xué)圖像增強(qiáng)領(lǐng)域是一種極為有效的方法原理是對(duì)圖像施加一個(gè)平滑的位移場(chǎng)讓圖像產(chǎn)生類(lèi)似真實(shí)組織形變的效果。這在MRI和CT中特別有用因?yàn)槿梭w器官在呼吸、心臟搏動(dòng)、體位變化時(shí)會(huì)產(chǎn)生非剛體形變胰腺也不例外。具體實(shí)現(xiàn)一般是通過(guò)隨機(jī)生成一個(gè)粗網(wǎng)格的位移向量然后插值到整幅圖像的像素分辨率上最后用網(wǎng)格重采樣生成形變后的圖像。這一步pipeline看起來(lái)簡(jiǎn)單但對(duì)形變幅度的把控是最核心的。對(duì)于2D切片位移幅度建議控制在4到8個(gè)像素范圍內(nèi)。形變過(guò)大會(huì)導(dǎo)致胰腺的解剖形態(tài)變得完全不合理邊緣扭曲嚴(yán)重模型學(xué)不到真實(shí)的形態(tài)特征。彈性形變和旋轉(zhuǎn)縮放平移有一個(gè)本質(zhì)差異它不是全局變換而是局部變換。這意味著模型可以看到胰腺局部區(qū)域的紋理細(xì)節(jié)在輕微變形下的表現(xiàn)這能有效提升模型對(duì)邊界區(qū)域的定位能力。我在實(shí)驗(yàn)中發(fā)現(xiàn)加入彈性形變后模型在胰腺邊緣區(qū)域的Dice分?jǐn)?shù)通常能提升1到2個(gè)百分點(diǎn)這對(duì)醫(yī)學(xué)分割任務(wù)來(lái)說(shuō)已經(jīng)是一個(gè)不小的提升。3.4 混合類(lèi)增強(qiáng)的醫(yī)學(xué)適配與風(fēng)險(xiǎn)近年來(lái)在自然圖像領(lǐng)域大放異彩的混合類(lèi)增強(qiáng)方法比如MixUp、CutMix、CutOut等在醫(yī)學(xué)圖像分割中也開(kāi)始被嘗試應(yīng)用。這類(lèi)方法的核心思路是把不同樣本的信息混合在一起讓模型學(xué)到更魯棒的特征。CutOut也就是隨機(jī)遮擋一塊區(qū)域在醫(yī)學(xué)圖像分割里的邏輯是模擬局部偽影或噪聲干擾。比如腸道氣體、金屬假牙、造影劑殘留等都會(huì)在CT圖像中產(chǎn)生局部偽影讓模型適應(yīng)這種局部信息缺失的情況。遮擋區(qū)域的尺寸不宜過(guò)大一般控制在圖像短邊的15%到20%以內(nèi)遮擋區(qū)域的位置隨機(jī)分布。MixUp也就是兩張圖按比例混合在醫(yī)學(xué)圖像里要小心使用。因?yàn)镸ixUp會(huì)改變圖像整體的灰度統(tǒng)計(jì)分布在CT中可能產(chǎn)生一些灰度模式上不存在的物理意義不明確的人工圖像。如果數(shù)據(jù)量本身很大MixUp的作用有限如果數(shù)據(jù)量緊張可以嘗試在訓(xùn)練后期使用混合系數(shù)建議在0.1到0.3之間避免生成過(guò)于“假”的樣本。CutMix把一張圖的部分區(qū)域替換成另一張圖的對(duì)應(yīng)區(qū)域這個(gè)在醫(yī)學(xué)圖像中更容易出問(wèn)題。因?yàn)槠鞴傥恢玫慕馄始s束非常嚴(yán)格一個(gè)病人的胰腺區(qū)域粘貼另一個(gè)病人的胰腺區(qū)域會(huì)導(dǎo)致模型學(xué)到不真實(shí)的局部結(jié)構(gòu)組合。這個(gè)數(shù)據(jù)集在做增強(qiáng)時(shí)沒(méi)有默認(rèn)加入CutMix我個(gè)人也不建議在解剖結(jié)構(gòu)上有強(qiáng)位置約束的器官分割任務(wù)里使用。3.5 在線增強(qiáng)與離線增強(qiáng)的選擇建議做數(shù)據(jù)增強(qiáng)有兩種落地方式一種是在訓(xùn)練循環(huán)里實(shí)時(shí)對(duì)每批數(shù)據(jù)做變換另一種是預(yù)先離線生成增強(qiáng)后的圖片存起來(lái)。兩種方式各有適用場(chǎng)景我的經(jīng)驗(yàn)是優(yōu)先選擇在線增強(qiáng)。在線增強(qiáng)的最大優(yōu)勢(shì)是節(jié)省存儲(chǔ)空間且每個(gè)epoch生成的樣本不同模型每輪看到的數(shù)據(jù)都有變化等效訓(xùn)練數(shù)據(jù)量更大。實(shí)現(xiàn)上也很簡(jiǎn)單PyTorch里用torchvision.transforms或者albumentations庫(kù)的Compose模塊在Dataset類(lèi)的__getitem__方法里調(diào)用就行。albumentations這個(gè)庫(kù)在醫(yī)學(xué)圖像處理場(chǎng)景里用起來(lái)很順手它內(nèi)置了我在上面提到的幾乎所有增強(qiáng)方法而且支持圖像和mask同步變換保證增強(qiáng)后mask和圖像仍然像素級(jí)對(duì)齊。離線增強(qiáng)適合那些訓(xùn)練時(shí)間要求很高、想提前固化數(shù)據(jù)集的場(chǎng)景或者用于對(duì)比實(shí)驗(yàn)讓不同模型看到完全相同的數(shù)據(jù)。但缺點(diǎn)是存儲(chǔ)成本高、增強(qiáng)樣本固定模型每個(gè)epoch看到的都是同樣的數(shù)據(jù)容易過(guò)擬合。我在這個(gè)數(shù)據(jù)集上的實(shí)操建議是幾何變換和灰度擾動(dòng)用在線增強(qiáng)這樣效果好且不占額外空間如果你想使用彈性形變這類(lèi)計(jì)算開(kāi)銷(xiāo)較大的操作可以先離線緩存一部分增強(qiáng)樣本作為輔助數(shù)據(jù)和原始數(shù)據(jù)混合訓(xùn)練這樣既控制訓(xùn)練時(shí)間又不損失多樣性。4. 實(shí)操過(guò)程用這個(gè)數(shù)據(jù)集跑通一個(gè)完整的2D分割流程4.1 環(huán)境搭建與依賴安裝不用多說(shuō)醫(yī)學(xué)圖像分割最常用的框架就是PyTorch配合一個(gè)成熟的2D分割模型可以快速驗(yàn)證數(shù)據(jù)集的可用性。我這里用的是U-Net作為baseline它結(jié)構(gòu)簡(jiǎn)潔、在2D醫(yī)學(xué)圖像分割上表現(xiàn)穩(wěn)定非常適合作為數(shù)據(jù)集驗(yàn)證的起步模型。Python環(huán)境建議用3.8或以上版本。核心依賴包括torch、torchvision、SimpleITK讀取醫(yī)學(xué)圖像、numpy、opencv-python圖像預(yù)處理、albumentations數(shù)據(jù)增強(qiáng)、tqdm進(jìn)度條可視化。如果你的顯卡顯存足夠比如8G以上可以直接訓(xùn)練U-Net顯存不夠就減小batch size或者考慮用輕量級(jí)backbone如ResNet18作為編碼器。裝依賴的時(shí)候要注意版本匹配。推薦直接用pip安裝最新穩(wěn)定版用conda創(chuàng)建虛擬環(huán)境隔離項(xiàng)目依賴。我遇到過(guò)因?yàn)閚umpy版本和albumentations不兼容導(dǎo)致增強(qiáng)時(shí)報(bào)錯(cuò)的情況后來(lái)統(tǒng)一用requirements.txt鎖定版本才解決。偷懶的方式是直接用anaconda創(chuàng)建環(huán)境后依次安裝最新版即可這些庫(kù)之間兼容性做得整體還是不錯(cuò)的。4.2 數(shù)據(jù)加載器的編寫(xiě)數(shù)據(jù)加載的核心是寫(xiě)一個(gè)繼承自torch.utils.data.Dataset的類(lèi)在__getitem__方法中讀入圖像和mask做必要的預(yù)處理再傳到模型里。代碼示例import torch from torch.utils.data import Dataset import cv2 import numpy as np import os import albumentations as A class Pancreas2DDataset(Dataset): def __init__(self, image_dir, mask_dir, transformsNone): self.image_dir image_dir self.mask_dir mask_dir self.image_names [f for f in os.listdir(image_dir) if f.endswith(.png) or f.endswith(.jpg)] self.transforms transforms def __len__(self): return len(self.image_names) def __getitem__(self, idx): img_name self.image_names[idx] img_path os.path.join(self.image_dir, img_name) mask_path os.path.join(self.mask_dir, img_name) image cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) mask cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) # 二值化mask確保只有0和1 _, mask cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY) mask mask // 255 if self.transforms is not None: augmented self.transforms(imageimage, maskmask) image augmented[image] mask augmented[mask] image torch.from_numpy(image).float().unsqueeze(0) / 255.0 mask torch.from_numpy(mask).float().unsqueeze(0) return image, mask預(yù)處理步驟要交代清楚讀取灰度圖的時(shí)候用IMREAD_GRAYSCALE直接得到單通道m(xù)ask讀進(jìn)來(lái)后用閾值二值化確保像素值準(zhǔn)確歸一到0和1圖像在喂給模型前除以255歸一化到0到1區(qū)間。歸一化操作對(duì)模型訓(xùn)練的穩(wěn)定性很重要尤其是使用預(yù)訓(xùn)練backbone時(shí)輸入分布和預(yù)訓(xùn)練分布不一致會(huì)導(dǎo)致微調(diào)效果差。增強(qiáng)部分的配置我建議寫(xiě)在主訓(xùn)練腳本里方便統(tǒng)一管理和實(shí)驗(yàn)對(duì)比train_transforms A.Compose([ A.Rotate(limit10, p0.7), A.RandomResizedCrop(height256, width256, scale(0.8, 1.0), ratio(0.9, 1.1), p0.5), A.RandomBrightnessContrast(brightness_limit0.15, contrast_limit0.15, p0.5), A.GaussianBlur(blur_limit(3, 5), p0.2), A.ElasticTransform(alpha1.2, sigma0.2, p0.3), A.GaussNoise(var_limit(10.0, 50.0), p0.2), A.HorizontalFlip(p0.5), ]) val_transforms A.Compose([ A.Resize(height256, width256), ])我做實(shí)驗(yàn)的時(shí)候試過(guò)兩種數(shù)據(jù)劃分策略一種是隨機(jī)打亂所有2D切片后劃分另一種是確保同一個(gè)病人的三個(gè)切面數(shù)據(jù)整體劃分到同一集合避免數(shù)據(jù)泄漏。后者更接近真實(shí)場(chǎng)景評(píng)估結(jié)果也更有參考價(jià)值。4.3 訓(xùn)練超參數(shù)的選擇與調(diào)優(yōu)過(guò)程訓(xùn)練2D分割模型時(shí)有幾個(gè)核心超參數(shù)需要重點(diǎn)關(guān)注。batch size的設(shè)置要結(jié)合顯存和輸入尺寸來(lái)定。輸入尺寸256x256、batch size 16大概需要6到8G顯存大部分單卡都能跑。如果顯存不足優(yōu)先考慮降低batch size到8保持輸入尺寸不變這樣對(duì)分割效果的影響比降低分辨率小得多。優(yōu)化器我用的是AdamW初始學(xué)習(xí)率設(shè)置在1e-4配合CosineAnnealingLR調(diào)度器。醫(yī)學(xué)圖像分割任務(wù)通常訓(xùn)練集規(guī)模不大學(xué)習(xí)率設(shè)置過(guò)高容易震蕩1e-4是一個(gè)安全性較高的起點(diǎn)。loss函數(shù)用Dice Loss和CrossEntropy Loss的組合Dice Loss解決正負(fù)樣本不平衡問(wèn)題CE Loss提供更穩(wěn)定的梯度信號(hào)。系數(shù)上Dice Loss占0.7CE Loss占0.3我在這個(gè)數(shù)據(jù)上驗(yàn)證過(guò)組合loss比單獨(dú)使用任何一種收斂更快、最終Dice更高。訓(xùn)練周期配置上我一般訓(xùn)練80到120個(gè)epoch具體要看驗(yàn)證集Dice是否還在上升。早停機(jī)制設(shè)在20個(gè)epoch也就是說(shuō)連續(xù)20個(gè)epoch驗(yàn)證集指標(biāo)沒(méi)有提升就停止訓(xùn)練并恢復(fù)最佳模型權(quán)重。這個(gè)策略避免了過(guò)擬合也節(jié)省了不必要的訓(xùn)練時(shí)間。4.4 評(píng)估指標(biāo)的選擇與解讀醫(yī)學(xué)圖像分割最常用的評(píng)估指標(biāo)是Dice系數(shù)和IoU。Dice系數(shù)計(jì)算的是預(yù)測(cè)區(qū)域和真實(shí)標(biāo)注區(qū)域的像素級(jí)重疊程度公式略復(fù)雜但核心思想是兩倍交集除以兩個(gè)集合的元素?cái)?shù)之和取值范圍0到1越接近1越好。IoU是交集除以并集和Dice高度相關(guān)但在數(shù)值上會(huì)比Dice略低一些。評(píng)估時(shí)一定要區(qū)分切片級(jí)別和病例級(jí)別的指標(biāo)計(jì)算方式。切片級(jí)別就是把所有測(cè)試集的2D切片放在一起統(tǒng)一計(jì)算Dice這樣大規(guī)模出現(xiàn)胰腺的切片會(huì)在總指標(biāo)中占更大權(quán)重。病例級(jí)別是先把每個(gè)病人的所有切片預(yù)測(cè)重組回3D計(jì)算3D空間的Dice再對(duì)所有病人取平均。兩者反映的模型性能側(cè)重點(diǎn)不同前者更貼合2D切片的場(chǎng)景后者更貼近臨床應(yīng)用的3D評(píng)估習(xí)慣。我在這個(gè)數(shù)據(jù)集上的baseline實(shí)驗(yàn)單用橫斷面數(shù)據(jù)訓(xùn)練測(cè)試集Dice通常是0.82左右把三視圖數(shù)據(jù)混合訓(xùn)練Dice提升到0.86左右。提升幅度看著不算大但考慮到胰腺分割本身難度極高2到3個(gè)百分點(diǎn)的提升已經(jīng)能明顯改善分割結(jié)果的視覺(jué)觀感。5. 使用過(guò)程中遇到的坑與排查思路5.1 標(biāo)注邊緣不齊導(dǎo)致的“訓(xùn)練正常、預(yù)測(cè)異常”我第一次在這個(gè)數(shù)據(jù)集上訓(xùn)練時(shí)遇到過(guò)一個(gè)很典型的問(wèn)題訓(xùn)練過(guò)程loss正常下降驗(yàn)證集Dice看起來(lái)也還行但把預(yù)測(cè)結(jié)果可視化后發(fā)現(xiàn)模型預(yù)測(cè)的胰腺邊緣特別毛糙尤其在上下兩個(gè)相鄰切片上邊界形狀跳躍很大。排查后發(fā)現(xiàn)原因在于原始3D標(biāo)注在切面方向上的連續(xù)性不夠好。橫斷面標(biāo)注在冠狀面和矢狀面上看邊緣呈現(xiàn)鋸齒狀這是標(biāo)注過(guò)程中層間不一致導(dǎo)致的。模型看到這樣不連貫的目標(biāo)自然學(xué)會(huì)的也是不連貫的邊緣預(yù)測(cè)。解決方法是把預(yù)測(cè)結(jié)果做一次條件隨機(jī)場(chǎng)后處理或者訓(xùn)練時(shí)對(duì)mask做輕微的高斯平滑這樣能強(qiáng)制模型學(xué)到更平滑的邊緣。但注意平滑不能過(guò)度會(huì)把解剖結(jié)構(gòu)上的細(xì)小突起也抹掉。更推薦的做法是在訓(xùn)練數(shù)據(jù)中把相鄰切片的標(biāo)注做一致性校驗(yàn)把那些明顯不連續(xù)的切片剔除或修正從根源上解決問(wèn)題。5.2 三視圖混合訓(xùn)練時(shí)的不平衡問(wèn)題三視圖混合訓(xùn)練雖然效果更好但要注意一個(gè)暗坑三個(gè)切面方向的樣本數(shù)可能不一致。冠狀面和矢狀面由于切面間隔和圖像分辨率不同產(chǎn)生的2D切片數(shù)量會(huì)比橫斷面多也可能更少。如果不做采樣平衡模型會(huì)被數(shù)據(jù)量大的那個(gè)切面帶偏。解決方式很簡(jiǎn)單用一個(gè)加權(quán)采樣器讓每個(gè)batch里三個(gè)切面的樣本數(shù)大致均衡。具體到PyTorch實(shí)現(xiàn)可以先為每個(gè)切面分別建立Dataset然后用ConcatDataset合并配合WeightedRandomSampler控制采樣比例。我在實(shí)驗(yàn)里把三個(gè)切面樣本數(shù)調(diào)整到基本相等后三視圖混合訓(xùn)練的Dice又提升了約1個(gè)百分點(diǎn)而且三個(gè)切面各自的預(yù)測(cè)效果都更穩(wěn)定。5.3 數(shù)據(jù)增強(qiáng)參數(shù)不當(dāng)導(dǎo)致的性能不升反降增強(qiáng)策略不是加得越多越好參數(shù)設(shè)置不當(dāng)反而會(huì)讓模型“學(xué)歪”。比如把旋轉(zhuǎn)范圍設(shè)到30度模型會(huì)在訓(xùn)練時(shí)看到很多不真實(shí)的胰腺形態(tài)測(cè)試時(shí)對(duì)真實(shí)圖像反而感到陌生。還有個(gè)常見(jiàn)誤區(qū)是把亮度擾動(dòng)范圍設(shè)得過(guò)大本來(lái)窗口中胰腺和脂肪還有可區(qū)分的灰度界限擾動(dòng)后兩者的灰度分布完全重疊模型無(wú)法學(xué)到有區(qū)分度的特征。判斷增強(qiáng)參數(shù)是否合理的有效手段是增強(qiáng)之后可視化一批輸出圖像對(duì)每張圖問(wèn)自己一個(gè)問(wèn)題“這張圖在解剖學(xué)上還合理嗎”如果看起來(lái)不像一個(gè)真實(shí)病人的CT圖像那就說(shuō)明增強(qiáng)強(qiáng)度過(guò)高需要回調(diào)。我的經(jīng)驗(yàn)是寧可增強(qiáng)強(qiáng)度偏溫和也不要為了多樣性犧牲樣本的真實(shí)性。5.4 上下層切片預(yù)測(cè)結(jié)果跳動(dòng)劇烈2D模型逐切片推理時(shí)偶爾會(huì)出現(xiàn)相鄰切片預(yù)測(cè)結(jié)果差異很大的情況例如第100層胰腺清晰完整第101層卻只預(yù)測(cè)出一小塊。這在臨床應(yīng)用中會(huì)嚴(yán)重影響3D重建的效果是整個(gè)2D分割方案最值得警惕的問(wèn)題。排查思路首先考慮輸入圖像的灰度一致性。原始CT切片在不同層之間可能因?yàn)閽呙钘l件變化導(dǎo)致灰度分布略有差異模型對(duì)灰度變化敏感時(shí)就會(huì)出現(xiàn)預(yù)測(cè)跳動(dòng)。把灰度歸一化做扎實(shí)不同切面之間保持相同的窗寬窗位標(biāo)準(zhǔn)能減輕這個(gè)問(wèn)題。再一個(gè)有效手段是推理時(shí)引入滑動(dòng)窗口預(yù)測(cè)用目標(biāo)切片前后各N張切片的信息輔助預(yù)測(cè)當(dāng)前切片。這個(gè)方法的原理是通過(guò)多張切片信息相互校驗(yàn)消除單張切片上偶然出現(xiàn)的異常預(yù)測(cè)。實(shí)際使用中N取3到4做中位數(shù)投票或均值融合都能有效抑制相鄰層預(yù)測(cè)跳動(dòng)的問(wèn)題。6. 適用范圍、局限性及改進(jìn)方向這個(gè)數(shù)據(jù)集的定位決定了它的適用邊界。2D三視圖分割的方式在2D分割任務(wù)中表現(xiàn)穩(wěn)定但如果你要做的是完整的三維胰腺分割比如想直接得到平滑的3D胰腺表面模型那這個(gè)數(shù)據(jù)集的2D切片形式就不夠用了你需要的是原始3D體數(shù)據(jù)。好在數(shù)據(jù)集的文件命名保留了切面和原始體數(shù)據(jù)的對(duì)應(yīng)關(guān)系如果你自己拿到了原始3D數(shù)據(jù)可以參照這個(gè)數(shù)據(jù)集的切分邏輯做進(jìn)一步的3D處理。局限性方面最明顯的是胰腺分割本身就難模型的分割精度天花板有限測(cè)試集Dice很難超過(guò)0.9。另外這個(gè)數(shù)據(jù)集如果只保留了一個(gè)機(jī)構(gòu)的CT掃描數(shù)據(jù)沒(méi)有包含不同品牌掃描儀、不同掃描協(xié)議、不同造影劑濃度等多種臨床場(chǎng)景的變化模型的泛化能力需要實(shí)測(cè)來(lái)驗(yàn)證。改進(jìn)方向有幾個(gè)值得探索。一是把三個(gè)切面的預(yù)測(cè)結(jié)果做三維融合用投票或者置信度加權(quán)的方式生成更穩(wěn)定的分割結(jié)果。二是引入對(duì)比學(xué)習(xí)把三視圖的同一解剖位置作為正樣本對(duì)讓模型學(xué)到跨視角的解剖對(duì)應(yīng)關(guān)系這樣可以增強(qiáng)模型的表征能力。三是結(jié)合臨床知識(shí)設(shè)計(jì)新的增強(qiáng)方式比如基于胰腺解剖位置先驗(yàn)的局部增強(qiáng)、模擬特定偽影的退化增強(qiáng)等。從工程角度看這個(gè)數(shù)據(jù)集本身已經(jīng)解決了“從0到1”的問(wèn)題你拿到手就能開(kāi)始訓(xùn)練。真正拉開(kāi)效果差距的是在這個(gè)基礎(chǔ)上如何設(shè)計(jì)更合理的訓(xùn)練策略、如何挖掘三視圖之間的互補(bǔ)信息、如何讓模型在真實(shí)臨床數(shù)據(jù)上穩(wěn)定工作。這些方向都是這個(gè)數(shù)據(jù)集值得繼續(xù)深耕的空間。7. 個(gè)人使用心得與建議用這套數(shù)據(jù)集跑了兩個(gè)多月的實(shí)驗(yàn)最深的感受是醫(yī)學(xué)圖像分割領(lǐng)域數(shù)據(jù)組織和處理方式對(duì)最終效果的影響往往不比模型結(jié)構(gòu)小。同一個(gè)U-Net換了三視圖訓(xùn)練策略、調(diào)了增強(qiáng)參數(shù)、修正了灰度歸一化方式Dice從0.82提到0.86這幾個(gè)點(diǎn)不是靠換更復(fù)雜的模型得來(lái)的而是靠把數(shù)據(jù)結(jié)構(gòu)吃透、把訓(xùn)練細(xì)節(jié)做到位。如果你剛開(kāi)始接觸這個(gè)數(shù)據(jù)集我的建議是先別急著訓(xùn)練大模型?;ㄒ粌商鞎r(shí)間把數(shù)據(jù)可視化、逐張檢查圖像和mask的對(duì)應(yīng)關(guān)系、確認(rèn)三個(gè)切面的比例和范圍是否合理這些基礎(chǔ)工作看起來(lái)耽誤時(shí)間但長(zhǎng)期來(lái)看回報(bào)非常高。你越早發(fā)現(xiàn)數(shù)據(jù)里潛在的問(wèn)題后面訓(xùn)練和調(diào)參花的冤枉時(shí)間就越少。另外有一個(gè)小技巧訓(xùn)練時(shí)每隔幾十個(gè)epoch就把驗(yàn)證集的預(yù)測(cè)結(jié)果可視化保存一次做成短視頻或者GIF對(duì)比圖。不要只看Dice數(shù)字要真正用眼睛去感受模型在三個(gè)切面上的輸出形態(tài)胰腺頭尾兩端是最容易出錯(cuò)的地方仔細(xì)對(duì)比不同epoch的預(yù)測(cè)結(jié)果能幫你更直觀地判斷模型學(xué)得怎么樣、還有哪些改進(jìn)空間。如果后續(xù)要做擴(kuò)展可以考慮把這個(gè)數(shù)據(jù)集的訓(xùn)練流程推廣到其他腹部器官的分割任務(wù)比如肝臟、脾臟、腎臟三視圖切分的思路在這些器官上同樣適用??蚣懿蛔儞Q數(shù)據(jù)和標(biāo)注就行復(fù)用的成本很低。這大概是這個(gè)數(shù)據(jù)集最有價(jià)值的延伸意義。本文還有配套的精品資源點(diǎn)擊獲取