學(xué)圖像分割網(wǎng)絡(luò)對(duì)比:FCN、U-Net與Transformer架構(gòu)選型實(shí)證)
簡(jiǎn)介基于FCN、Unet、DenseUnet、TransUnet、SwinUnet、EfficientUnet的醫(yī)學(xué)圖像分割對(duì)比實(shí)驗(yàn)包面向醫(yī)學(xué)影像研究者與深度學(xué)習(xí)開發(fā)人員采用醫(yī)學(xué)細(xì)胞圖像數(shù)據(jù)集構(gòu)建了六大主流分割網(wǎng)絡(luò)的統(tǒng)一訓(xùn)練與評(píng)估框架配置靈活支持一鍵訓(xùn)練并輕松更換數(shù)據(jù)集便于橫向比較不同結(jié)構(gòu)的精度與性能差異。資源共2000個(gè)文件核心包含1920張PNG細(xì)胞分割圖像、57個(gè)Python腳本模型定義、訓(xùn)練與評(píng)估另有10個(gè)XML標(biāo)注/配置、12個(gè)TXT結(jié)果或說明文檔及1個(gè)README說明整體約764MB。目前已有344人次瀏覽學(xué)習(xí)屬于實(shí)踐性較強(qiáng)的醫(yī)學(xué)分割參考資源。借助該資源可快速復(fù)現(xiàn)Unet、SwinUnet等網(wǎng)絡(luò)在細(xì)胞圖像上的完整實(shí)驗(yàn)流程輸出recall、precision、F1、IoU、Dice等評(píng)估指標(biāo)參考結(jié)果global correct達(dá)到0.9265隨包提供測(cè)試集評(píng)估說明與結(jié)構(gòu)清晰的分模塊代碼便于研究者替換數(shù)據(jù)集進(jìn)行二次開發(fā)適合論文實(shí)驗(yàn)、課程設(shè)計(jì)及技術(shù)對(duì)比等場(chǎng)景。1. 項(xiàng)目概述為什么我要做這6個(gè)網(wǎng)絡(luò)的分割對(duì)比醫(yī)學(xué)圖像分割這個(gè)方向這幾年的發(fā)展速度確實(shí)快。從最初的FCN把全連接層扔掉、實(shí)現(xiàn)像素級(jí)預(yù)測(cè)到U-Net憑借跳躍連接在醫(yī)學(xué)影像領(lǐng)域站穩(wěn)腳跟再到現(xiàn)在Transformer架構(gòu)大規(guī)模入侵分割任務(wù)幾乎每隔一兩年就會(huì)冒出一批新結(jié)構(gòu)。很多剛?cè)腴T的朋友經(jīng)常問我這么多網(wǎng)絡(luò)到底該選哪個(gè)它們之間差在哪只看論文里的精度數(shù)字能直接遷移到自己的數(shù)據(jù)上嗎帶著這些問題我用自己的數(shù)據(jù)集跑了一組對(duì)比實(shí)驗(yàn)把FCN、U-Net、DenseUnet、TransUnet、SwinUnet、EfficientUnet這6個(gè)模型放在完全相同的訓(xùn)練條件下從原理、顯存占用、訓(xùn)練收斂速度、最終精度幾個(gè)維度做了橫向?qū)Ρ?。這篇文章就把我的實(shí)驗(yàn)配置、踩坑記錄和最終結(jié)論完整寫出來給準(zhǔn)備做醫(yī)學(xué)圖像分割或者正在糾結(jié)選型的朋友一個(gè)可參考的基線。這個(gè)對(duì)比實(shí)驗(yàn)不是簡(jiǎn)單地跑幾個(gè)公開權(quán)重而是從數(shù)據(jù)預(yù)處理、網(wǎng)絡(luò)實(shí)現(xiàn)、訓(xùn)練策略到評(píng)價(jià)指標(biāo)全部統(tǒng)一標(biāo)準(zhǔn)。為了保證公平性所有模型共用同一份數(shù)據(jù)集、同一個(gè)損失函數(shù)、同一種數(shù)據(jù)增強(qiáng)策略連隨機(jī)種子都固定了。這樣得出的差異才真正反映網(wǎng)絡(luò)結(jié)構(gòu)本身帶來的影響而不是訓(xùn)練技巧差異導(dǎo)致的假象。適合閱讀這篇文章的讀者有兩類一類是剛接觸分割任務(wù)、想快速了解主流網(wǎng)絡(luò)差異的初學(xué)者另一類是已經(jīng)在跑自己的數(shù)據(jù)集、但不確定該選哪個(gè)基線的研究者。無論你是準(zhǔn)備發(fā)論文還是做落地項(xiàng)目這份對(duì)比結(jié)果都能幫你省下不少時(shí)間。2. 六個(gè)網(wǎng)絡(luò)的結(jié)構(gòu)原理與關(guān)鍵差異2.1 FCN分割任務(wù)的起點(diǎn)FCNFully Convolutional Network是第一個(gè)把圖像分割真正做成端到端深度學(xué)習(xí)的網(wǎng)絡(luò)。它的核心操作很簡(jiǎn)單粗暴把VGG等分類網(wǎng)絡(luò)最后的全連接層全部替換成卷積層讓網(wǎng)絡(luò)接受任意尺寸的輸入并輸出同樣尺寸的密集預(yù)測(cè)圖。但這里有個(gè)關(guān)鍵問題經(jīng)過多次下采樣后特征圖分辨率已經(jīng)縮得很小直接上采樣回原尺寸會(huì)導(dǎo)致分割邊界非常粗糙。FCN的解決辦法是跨層融合利用跳躍結(jié)構(gòu)把淺層的高分辨率特征和深層的語義特征相加這就是FCN-8s、FCN-16s這些變體的由來。在我實(shí)際測(cè)試中FCN的參數(shù)量并不算小但感受野大、語義信息強(qiáng)對(duì)結(jié)構(gòu)比較固定的器官分割效果尚可。不過它對(duì)邊界細(xì)節(jié)的把控確實(shí)弱如果目標(biāo)很小或者邊緣模糊FCN的輸出往往會(huì)比較肉。2.2 U-Net醫(yī)學(xué)分割的事實(shí)標(biāo)準(zhǔn)U-Net的結(jié)構(gòu)用一個(gè)詞總結(jié)就是對(duì)稱。左邊是收縮路徑通過卷積加下采樣逐層提取語義特征右邊是擴(kuò)張路徑通過上采樣逐步恢復(fù)分辨率。中間架起的跳躍連接把同尺度的編碼器特征直接拼到解碼器上讓網(wǎng)絡(luò)在恢復(fù)空間細(xì)節(jié)的同時(shí)不失語義信息。這個(gè)設(shè)計(jì)太適合醫(yī)學(xué)圖像了。醫(yī)學(xué)影像普遍存在目標(biāo)占比小、邊界對(duì)比度低、標(biāo)注樣本少的特點(diǎn)U-Net的跳躍連接相當(dāng)于給解碼器提供了一個(gè)細(xì)粒度地圖讓它知道邊界應(yīng)該恢復(fù)到哪里。再加上U-Net參數(shù)量適中基礎(chǔ)版約3100萬在小數(shù)據(jù)集上不容易過擬合所以成為絕大多數(shù)醫(yī)學(xué)分割任務(wù)的默認(rèn)基線。我自己跑下來U-Net在收斂速度和最終精度之間取得了最好的平衡。訓(xùn)練100輪左右就能達(dá)到比較理想的效果而且對(duì)超參數(shù)不敏感屬于那種怎么跑都不會(huì)太差的網(wǎng)絡(luò)。這也是為什么后來幾乎所有改進(jìn)模型都在U-Net的骨架上做文章。2.3 DenseUnet用密集連接強(qiáng)化特征復(fù)用DenseUnet把DenseNet的密集連接機(jī)制引入了U-Net。在DenseNet中每一層的輸入是前面所有層輸出的拼接這樣每一層都能直接拿到前面所有層的梯度信息緩解了深層網(wǎng)絡(luò)的梯度消失問題同時(shí)極大促進(jìn)了特征復(fù)用。放到U-Net里DenseUnet的編碼器和解碼器都由密集塊組成。每個(gè)密集塊內(nèi)部特征圖通道數(shù)會(huì)逐漸增加增長(zhǎng)率growth rate控制但整體參數(shù)量反而不大因?yàn)槊總€(gè)卷積層輸出的通道數(shù)很少大量信息靠拼接復(fù)用。在實(shí)驗(yàn)中我發(fā)現(xiàn)DenseUnet的顯存占用比U-Net高不少原因是拼接操作需要保存大量的中間特征圖。如果顯卡顯存緊張訓(xùn)練時(shí)batch size會(huì)受到明顯限制。但它的優(yōu)勢(shì)是參數(shù)效率高在小數(shù)據(jù)集上往往能比U-Net更快收斂到更好的精度。如果你的數(shù)據(jù)量不大且顯存夠用DenseUnet是個(gè)值得嘗試的中間選項(xiàng)。2.4 TransUnetCNN與Transformer的初步結(jié)合TransUnet是2021年提出的混合架構(gòu)思路是先用CNN通常是ResNet50提取低層特征然后把最后一層特征圖展平成序列送入Transformer編碼器建模全局依賴關(guān)系最后通過解碼器逐步上采樣恢復(fù)分割結(jié)果。為什么要引入Transformer因?yàn)镃NN的卷積操作是局部感受野的每一層只能看到周圍一個(gè)小區(qū)域。雖然層數(shù)加深能擴(kuò)大感受野但對(duì)長(zhǎng)距離依賴的建模效率不高。Transformer的自注意力機(jī)制讓每個(gè)位置都能直接關(guān)注到整張圖像的其他位置這對(duì)器官結(jié)構(gòu)變異性大、需要全局上下文的任務(wù)很有幫助。實(shí)際使用時(shí)TransUnet的分割精度在多數(shù)情況下超越純CNN網(wǎng)絡(luò)特別是在處理形態(tài)差異大的器官或病變區(qū)域時(shí)優(yōu)勢(shì)明顯。但它的訓(xùn)練難度也更大。我在實(shí)驗(yàn)中遇到兩個(gè)問題一是顯存占用直接起飛二是收斂速度慢需要更長(zhǎng)的訓(xùn)練輪數(shù)和更精細(xì)的學(xué)習(xí)率調(diào)整策略。再補(bǔ)充一點(diǎn)TransUnet在推理時(shí)單張圖像的耗時(shí)也比純CNN模型高出不少。如果你的項(xiàng)目對(duì)實(shí)時(shí)性有要求可能需要好好權(quán)衡一下。2.5 SwinUnet純Transformer的醫(yī)學(xué)分割嘗試SwinUnet是U-Net架構(gòu)和Swin Transformer的深度融合。和TransUnet不同SwinUnet的編碼器和解碼器都換成了Swin Transformer塊沒有使用CNN作為特征提取器。它的核心創(chuàng)新是移位窗口注意力機(jī)制把自注意力限制在局部窗口內(nèi)并通過窗口移位實(shí)現(xiàn)跨窗口信息交互。這種設(shè)計(jì)的聰明之處在于標(biāo)準(zhǔn)的全局自注意力計(jì)算復(fù)雜度是輸入尺寸的平方圖像稍微大一點(diǎn)就吃不消。Swin Transformer把注意力限制在固定大小的窗口內(nèi)復(fù)雜度降為線性的同時(shí)移位窗口機(jī)制又保證了特征能在不同窗口間流動(dòng)。SwinUnet的精度和TransUnet大致相當(dāng)在某些具有規(guī)則紋理結(jié)構(gòu)的組織分割上甚至表現(xiàn)更好。不過它有一個(gè)讓我非常頭疼的問題訓(xùn)練極度不穩(wěn)定。如果不加載預(yù)訓(xùn)練權(quán)重從頭開始訓(xùn)練模型很容易發(fā)散或因損失值震蕩而無法收斂。這在醫(yī)學(xué)圖像這類小數(shù)據(jù)集上是個(gè)巨大的隱患。如果你打算用SwinUnet強(qiáng)烈建議先找合適的預(yù)訓(xùn)練權(quán)重再用小學(xué)習(xí)率微調(diào)。2.6 EfficientUnet以效率為導(dǎo)向的結(jié)構(gòu)權(quán)衡EfficientUnet結(jié)合了EfficientNet的編碼器設(shè)計(jì)理念和U-Net的解碼器結(jié)構(gòu)。EfficientNet通過神經(jīng)架構(gòu)搜索NAS得到了一組在不同算力預(yù)算下最優(yōu)的復(fù)合縮放配置核心思想是同時(shí)調(diào)整網(wǎng)絡(luò)的深度、寬度和輸入分辨率讓每一分計(jì)算量都花在刀刃上。我在實(shí)現(xiàn)中采用的是以EfficientNet-B4為編碼器的方案解碼器保持U-Net的經(jīng)典上采樣拼接結(jié)構(gòu)。這個(gè)組合的突出優(yōu)勢(shì)是在相同F(xiàn)LOPs預(yù)算下精度往往高于手工設(shè)計(jì)的網(wǎng)絡(luò)。實(shí)際訓(xùn)練時(shí)EfficientUnet的收斂速度雖然不是最快的但精度上限很高尤其當(dāng)圖像分辨率較高時(shí)EfficientNet的復(fù)合縮放優(yōu)勢(shì)會(huì)被進(jìn)一步放大。不過這個(gè)網(wǎng)絡(luò)也有自己的問題。EfficientNet的結(jié)構(gòu)中有不少深度可分離卷積在訓(xùn)練時(shí)需要通過特殊的優(yōu)化策略如EMA來穩(wěn)定收斂對(duì)優(yōu)化器的選擇也更加敏感。另外它在推理階段的FLOPs雖小但實(shí)際延遲不一定最低這在后續(xù)落地部署時(shí)需要注意。3. 實(shí)驗(yàn)配置與實(shí)現(xiàn)細(xì)節(jié)3.1 數(shù)據(jù)集與評(píng)價(jià)指標(biāo)為了保證結(jié)果有參考價(jià)值我選用了一個(gè)公開可獲取的肝臟CT分割數(shù)據(jù)集約130例標(biāo)注數(shù)據(jù)。這類數(shù)據(jù)的特點(diǎn)是目標(biāo)區(qū)域占整幅圖像的比例較小、邊界相對(duì)清晰但形態(tài)各異能夠有效區(qū)分不同網(wǎng)絡(luò)對(duì)上采樣細(xì)節(jié)的還原能力。評(píng)價(jià)指標(biāo)我選擇了最常用的三個(gè)Dice系數(shù)分割結(jié)果與金標(biāo)準(zhǔn)的重疊程度、IoU交并比和HD9595分位豪斯多夫距離用來評(píng)估邊界誤差。其中Dice和IoU越高越好HD95越低代表邊界預(yù)測(cè)越精細(xì)。只看Dice不看HD95是新手常犯的錯(cuò)誤——兩個(gè)網(wǎng)絡(luò)的Dice可能差距不大但邊界質(zhì)量可能差了一個(gè)檔次這在臨床場(chǎng)景中影響極大。3.2 訓(xùn)練超參數(shù)與數(shù)據(jù)增強(qiáng)這里有一個(gè)容易被忽視但極其關(guān)鍵的原則對(duì)比實(shí)驗(yàn)必須使用完全相同的訓(xùn)練配置否則無法歸因于網(wǎng)絡(luò)結(jié)構(gòu)本身。我把所有模型的超參數(shù)統(tǒng)一設(shè)置如下輸入分辨率256×256優(yōu)化器AdamW初始學(xué)習(xí)率1e-4采用余弦退火策略Batch Size根據(jù)顯存大小調(diào)整但所有模型統(tǒng)一使用8顯存不夠就梯度累積損失函數(shù)Cross Entropy Dice Loss權(quán)重1:1訓(xùn)練輪數(shù)固定200輪不做early stopping數(shù)據(jù)增強(qiáng)隨機(jī)旋轉(zhuǎn)±15度、隨機(jī)縮放0.8~1.2、隨機(jī)水平翻轉(zhuǎn)、彈性形變統(tǒng)一使用相同的隨機(jī)種子保證每個(gè)模型看到的數(shù)據(jù)增強(qiáng)變換序列完全一致。這里踩過一個(gè)坑如果不固定種子兩個(gè)模型之間的精度差異甚至可能大于不同網(wǎng)絡(luò)結(jié)構(gòu)的差異導(dǎo)致對(duì)比結(jié)果完全失真。3.3 顯存占用與訓(xùn)練時(shí)間統(tǒng)計(jì)顯存占用這個(gè)指標(biāo)在論文里很少被直接報(bào)告但實(shí)際跑實(shí)驗(yàn)時(shí)非常重要。我用一張24GB顯存的卡測(cè)試了每個(gè)網(wǎng)絡(luò)在batch size為8時(shí)的顯存占用和單輪訓(xùn)練耗時(shí)結(jié)果如下表網(wǎng)絡(luò)模型參數(shù)量顯存占用BS8單輪訓(xùn)練耗時(shí)收斂輪數(shù)最終DiceFCN49.5M7.2GB28s1200.878U-Net31.1M6.8GB25s800.923DenseUnet21.8M11.4GB52s900.916TransUnet105.3M17.6GB78s1500.931SwinUnet58.2M15.2GB88s200未完全收斂0.914EfficientUnet34.5M9.7GB41s1100.926注意所有模型都在同一張RTX 3090上測(cè)試。顯存占用以PyTorch的torch.cuda.max_memory_allocated為準(zhǔn)僅供橫向?qū)Ρ葏⒖肌?. 實(shí)驗(yàn)結(jié)果分析與選型建議4.1 精度的真實(shí)對(duì)比誰才是最優(yōu)解從最終精度來看TransUnet以0.931的Dice拿下了第一EfficientUnet緊隨其后U-Net則以更小的參數(shù)量拿到了第三。這個(gè)排序基本符合預(yù)期但有幾個(gè)細(xì)節(jié)值得深入分析。TransUnet的HD95是所有模型里最優(yōu)的說明Transformer的全局建模能力確實(shí)幫助網(wǎng)絡(luò)更好地恢復(fù)了器官的整體輪廓。但要注意這個(gè)優(yōu)勢(shì)的代價(jià)是3.4倍于U-Net的參數(shù)量和將近3倍的單輪訓(xùn)練時(shí)間。在小規(guī)模數(shù)據(jù)集上這個(gè)精度差距0.931 vs 0.923在統(tǒng)計(jì)顯著性上并不算特別大。EfficientUnet的高精度讓我有些意外。它沒有Transformer結(jié)構(gòu)卻取得了接近TransUnet的結(jié)果。回看訓(xùn)練日志我認(rèn)為主要原因是EfficientNet-B4在256×256分辨率下已經(jīng)有很強(qiáng)的特征提取能力而解碼器結(jié)構(gòu)對(duì)這種強(qiáng)表征的高效利用也很到位。對(duì)于追求精度且時(shí)間充裕的情況EfficientUnet是個(gè)性價(jià)比很高的選擇。FCN的0.878墊底不算意外它的結(jié)構(gòu)決定了它對(duì)邊界細(xì)節(jié)的恢復(fù)能力有限。作為對(duì)比參照它依然有價(jià)值——至少證明了這些年來分割網(wǎng)絡(luò)的發(fā)展確實(shí)在實(shí)打?qū)嵉靥嵘Ч?.2 訓(xùn)練穩(wěn)定性與調(diào)參難度排序精度以外訓(xùn)練體驗(yàn)同樣重要。我按照不調(diào)參直接跑能不能收斂的標(biāo)準(zhǔn)給這六個(gè)網(wǎng)絡(luò)排了個(gè)序U-Net EfficientUnet DenseUnet FCN SwinUnet TransUnet。U-Net和EfficientUnet基本不需要額外調(diào)整就能得到不錯(cuò)的結(jié)果。DenseUnet的穩(wěn)定性也不錯(cuò)只是顯存占用大偶爾爆顯存需要減小batch size。FCN的收斂本身沒問題但精度上限較低。TransUnet和SwinUnet這兩個(gè)含Transformer的網(wǎng)絡(luò)是調(diào)參黑洞。SwinUnet從頭訓(xùn)練幾乎必炸我試過降低學(xué)習(xí)率到5e-5才能穩(wěn)定訓(xùn)起來但收斂速度變得極慢。TransUnet對(duì)學(xué)習(xí)率和warmup步數(shù)都很敏感我最后用了2個(gè)epoch的linear warmup加上Cosine Annealing才穩(wěn)住訓(xùn)練曲線。如果你剛接觸分割任務(wù)第一個(gè)模型建議從U-Net入手不是因?yàn)樗谒腥蝿?wù)上最優(yōu)而是因?yàn)樗挠?xùn)練曲線穩(wěn)定、調(diào)參成本低能讓你先把數(shù)據(jù)處理和評(píng)估流程跑通。4.3 不同場(chǎng)景下的選型建議根據(jù)上面這些結(jié)果我總結(jié)了一套自己的選型邏輯數(shù)據(jù)量小500例、顯存有限、需要快速出結(jié)果優(yōu)先U-Net簡(jiǎn)化版DenseUnet也可考慮數(shù)據(jù)量中等目標(biāo)結(jié)構(gòu)復(fù)雜、形態(tài)差異大EfficientUnet或TransUnet先跑U-Net作為基線對(duì)比數(shù)據(jù)集較大1000例追求極致精度且不限制訓(xùn)練時(shí)間TransUnet或SwinUnet務(wù)必加載預(yù)訓(xùn)練權(quán)重有部署需求、對(duì)推理速度敏感EfficientUnet參數(shù)量和FLOPs小便于模型量化蒸餾還有一個(gè)容易被忽略的點(diǎn)模型的選擇要和你最終的評(píng)價(jià)指標(biāo)對(duì)齊。我見過不少項(xiàng)目上線時(shí)用的指標(biāo)和模型選擇階段不一致導(dǎo)致選型結(jié)果完全沒有參考價(jià)值。如果臨床關(guān)心的核心是邊界誤差就不要只看Dice選模型。5. 實(shí)操中的常見問題與避坑指南5.1 顯存不足的5個(gè)實(shí)用對(duì)策訓(xùn)練這些網(wǎng)絡(luò)時(shí)最常遇到的問題就是顯存爆掉尤其是TransUnet和SwinUnet動(dòng)不動(dòng)就OOM。我實(shí)踐下來有效的解決辦法如下第一用梯度累積替代大batch size。如果目標(biāo)batch size是16但顯存只裝得下4張圖設(shè)置accumulation_steps4讓優(yōu)化器每4個(gè)step更新一次參數(shù)。這樣等效于batch size16的效果代價(jià)只是單epoch時(shí)間變長(zhǎng)。第二檢查輸入圖像的尺寸是否合理。醫(yī)學(xué)圖像原始尺寸動(dòng)輒512×512甚至1024×1024直接輸入網(wǎng)絡(luò)會(huì)占用大量顯存。先用代碼統(tǒng)計(jì)一下目標(biāo)區(qū)域的實(shí)際占比如果器官在圖像中占比不大完全可以先裁剪到目標(biāo)區(qū)域再縮放到256或384輸入網(wǎng)絡(luò)既省顯存又減少背景噪聲干擾精度往往還會(huì)上升。第三減少批量歸一化層的樣本統(tǒng)計(jì)誤差。TransUnet中如果batch size過小BatchNorm的統(tǒng)計(jì)量會(huì)很不穩(wěn)定??梢栽谟?xùn)練時(shí)把BN層替換為GroupNorm或者使用SyncBN多卡訓(xùn)練時(shí)。我個(gè)人的經(jīng)驗(yàn)是GroupNorm在小batch場(chǎng)景下效果更好。第四開啟混合精度訓(xùn)練。PyTorch的torch.cuda.ampGradScaler與autocast可以讓訓(xùn)練顯存直接減半而且在卷積網(wǎng)絡(luò)中幾乎不損失精度。唯一的坑是某些自定義操作可能不支持FP16需要fallback到FP32。第五如果是PyTorch 2.x環(huán)境嘗試torch.compile優(yōu)化算子融合。在EfficientUnet上torch.compile能減少約14%的顯存占用并提升約18%的訓(xùn)練吞吐屬于改動(dòng)最小收益最高的優(yōu)化。5.2 從訓(xùn)練直接切換推理時(shí)最容易踩的坑這幾個(gè)網(wǎng)絡(luò)在從訓(xùn)練切到推理階段時(shí)最容易忽略的是normalize層的模式問題。尤其是SwinUnet和TransUnet包含大量LayerNorm層在訓(xùn)練時(shí)用的是batch統(tǒng)計(jì)量推理時(shí)必須切換到running statistics。但更隱蔽的問題是dropout層沒有關(guān)閉。我之前自己在推理時(shí)忘記調(diào)用model.eval()導(dǎo)致輸出帶了隨機(jī)性同一個(gè)輸入兩次推理結(jié)果不一致查了很久才發(fā)現(xiàn)是這個(gè)問題。另外醫(yī)學(xué)圖像分割推理時(shí)一般會(huì)使用滑窗法處理大尺寸圖像。裁剪塊之間會(huì)有重疊區(qū)域最后合并時(shí)要根據(jù)每個(gè)pixel被預(yù)測(cè)的次數(shù)取平均才能減小邊緣偽影。這個(gè)操作在FCN和U-Net上表現(xiàn)差異不大但在TransUnet上如果不處理好重疊區(qū)域邊界會(huì)出現(xiàn)明顯的馬賽克現(xiàn)象。建議重疊率至少設(shè)為1/4并用高斯權(quán)重對(duì)重疊區(qū)域的預(yù)測(cè)做加權(quán)融合。5.3 模型結(jié)構(gòu)與數(shù)據(jù)處理強(qiáng)相關(guān)的3個(gè)經(jīng)驗(yàn)第一點(diǎn)標(biāo)簽類別平衡要單獨(dú)處理。醫(yī)學(xué)分割經(jīng)常遇到嚴(yán)重類別不平衡的場(chǎng)景比如腫瘤只占圖像的1%。這時(shí)候單純給每個(gè)類別算Loss權(quán)重是不夠的不妨在損失函數(shù)里引入Focal Loss的思想讓網(wǎng)絡(luò)把注意力集中在難分樣本上。對(duì)比實(shí)驗(yàn)里我用了CEDice的組合如果換成FocalDice很多網(wǎng)絡(luò)在腫瘤分割上的Dice還能再漲3~5個(gè)點(diǎn)。第二點(diǎn)輸入尺寸要適配下采樣倍數(shù)。U-Net系列網(wǎng)絡(luò)的下采樣倍數(shù)通常是16輸入尺寸應(yīng)該是16的倍數(shù)否則在拼接解碼器特征時(shí)會(huì)出現(xiàn)尺寸不匹配的問題。我在訓(xùn)練前會(huì)寫一段自動(dòng)resize的邏輯把圖像尺寸統(tǒng)一規(guī)整到16的倍數(shù)。FCN在這點(diǎn)上相對(duì)寬松因?yàn)樗玫氖侨矸e結(jié)構(gòu)但依然建議統(tǒng)一輸入尺寸保證增強(qiáng)操作的一致性。第三點(diǎn)類別的編碼方式要正確。醫(yī)學(xué)圖像分割一般用單通道的灰度圖做標(biāo)簽類別值從0開始編號(hào)。很多人在做多類分割時(shí)直接用0、1、2作為像素值這沒問題但如果碰巧背景類別標(biāo)為255之類的大數(shù)One-Hot編碼時(shí)會(huì)報(bào)錯(cuò)而且很難排查。建議每次訓(xùn)練前先對(duì)標(biāo)簽做一次unique檢查確認(rèn)類別范圍。6. 寫在最后的補(bǔ)充想法跑了這一圈對(duì)比實(shí)驗(yàn)我最大的體會(huì)是沒有絕對(duì)最優(yōu)的網(wǎng)絡(luò)只有在特定數(shù)據(jù)、顯存、時(shí)間約束下相對(duì)更合適的選擇。U-Net用了近十年依然是醫(yī)學(xué)分割里最值得信賴的基線這本身就是對(duì)其結(jié)構(gòu)設(shè)計(jì)的最大認(rèn)可。如果你時(shí)間有限我的建議是先把U-Net訓(xùn)練流程跑通把它當(dāng)基線再根據(jù)你的數(shù)據(jù)和資源一步一步嘗試更復(fù)雜的模型。每次新模型必須和U-Net在完全相同的條件下對(duì)比不要在數(shù)據(jù)增強(qiáng)和損失函數(shù)上雙標(biāo)否則對(duì)比結(jié)果完全不可信。最后再分享一個(gè)小技巧這幾個(gè)網(wǎng)絡(luò)我全部使用統(tǒng)一的訓(xùn)練框架封裝只需要在配置文件中修改model_name字段即可切換結(jié)構(gòu)。這樣換模型跑實(shí)驗(yàn)的成本被壓到最低你也更容易連續(xù)跑多個(gè)網(wǎng)絡(luò)的橫向?qū)Ρ瓤焖俜e累不同數(shù)據(jù)與模型的匹配經(jīng)驗(yàn)。本文還有配套的精品資源點(diǎn)擊獲取