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