練集構(gòu)建到高精度模型實(shí)戰(zhàn))
簡介本資源是面向醫(yī)學(xué)AI研究者、計(jì)算機(jī)視覺初學(xué)者及高校課程實(shí)踐者的高精度乳腺癌病理圖像分類訓(xùn)練集專為構(gòu)建可落地的智能輔助診斷模型而設(shè)計(jì)。數(shù)據(jù)集包含691個(gè)文件689張經(jīng)專業(yè)醫(yī)生復(fù)核標(biāo)注的256×256 JPG病理圖像涵蓋cancer與normal二分類、1個(gè)開箱即用的Python可視化腳本支持類別分布、樣本網(wǎng)格、尺寸統(tǒng)計(jì)等分析以及1個(gè)結(jié)構(gòu)清晰的JSON標(biāo)簽映射文件壓縮包僅8.79MB輕量高效。目前已有68人學(xué)習(xí)下載適用于學(xué)術(shù)論文實(shí)驗(yàn)、Kaggle式課程項(xiàng)目或初創(chuàng)企業(yè)原型開發(fā)。目錄嚴(yán)格按訓(xùn)練集/驗(yàn)證集分層同類圖像歸入同一子目錄兼容PyTorch、TensorFlow及YOLO系列框架附贈(zèng)腳本可一鍵探查數(shù)據(jù)質(zhì)量顯著提升數(shù)據(jù)增強(qiáng)策略制定與模型調(diào)優(yōu)效率。1. 項(xiàng)目起源為什么聚焦乳腺癌病理圖像分類1.1 粉紅絲帶背后尚未被滿足的真實(shí)需求第一次接觸粉紅絲帶項(xiàng)目時(shí)我正在做醫(yī)學(xué)圖像方向的算法調(diào)研。團(tuán)隊(duì)討論的初始目標(biāo)很直接構(gòu)建一套高精度的乳腺癌病理圖像分類訓(xùn)練集配合AI模型完成輔助診斷。后來真的跑起來才發(fā)現(xiàn)這個(gè)問題的難度遠(yuǎn)超自然圖像分類。先說一個(gè)背景粉紅絲帶是全球乳腺癌防治的公認(rèn)標(biāo)志。很多城市每年10月都會(huì)開展公益活動(dòng)呼吁女性定期篩查。大眾對乳腺癌的認(rèn)知往往停留在拍個(gè)鉬靶、做個(gè)超聲但實(shí)際上病理檢查才是確診的金標(biāo)準(zhǔn)。病理醫(yī)生拿到組織切片在顯微鏡下觀察細(xì)胞形態(tài)、排列方式、核異型性然后給出良惡性判斷、分級(jí)分型。這個(gè)過程依賴高倍鏡下的觀察經(jīng)驗(yàn)工作量大、主觀性強(qiáng)不同醫(yī)生之間的判讀一致性也不是百分之百。AI能切入的正是這個(gè)環(huán)節(jié)。我的定位很明確不做臨床診斷本身而是把數(shù)字化病理切片WSI全切片圖像切成可訓(xùn)練的patch構(gòu)建一個(gè)標(biāo)注準(zhǔn)確、分布合理、能支撐高精度分類模型的訓(xùn)練集。這套訓(xùn)練集既要解決能不能分的問題也要解決分得準(zhǔn)、分得穩(wěn)的問題。1.2 病理圖像分類為什么比自然圖像難得多很多人一開始以為病理圖像分類就是把圖像丟進(jìn)ResNet跑一下這個(gè)想法在CIFAR-10上沒錯(cuò)但在病理圖像上會(huì)撞得頭破血流。第一圖像尺寸極其巨大。一張標(biāo)準(zhǔn)的WSI在40倍放大下可能達(dá)到100000×80000像素單張切片上百GB都是常事。而正常模型輸入是224×224或256×256的patch。這意味著你必須先把大圖切成小圖再?zèng)Q定哪些小圖進(jìn)入訓(xùn)練。這引出了后面要重點(diǎn)講的patch選取策略。第二語義粒度非常細(xì)。正常細(xì)胞和癌細(xì)胞之間的差異很多時(shí)候只是細(xì)胞核大小、核質(zhì)比、染色質(zhì)分布這些非常微觀的差別。拿自然圖像的分類經(jīng)驗(yàn)套上去模型容易學(xué)到染色背景的分布而不是真正的病理形態(tài)。第三類不平衡極其嚴(yán)重。一個(gè)切片中可能99%的區(qū)域是正常組織只有1%是癌變區(qū)域。如果把所有patch均勻采樣訓(xùn)練集里會(huì)堆滿無意義的正常patch模型看到的有效信息極少。第四標(biāo)注成本極高。標(biāo)注病理圖像需要專業(yè)的病理醫(yī)生不能靠眾包也不能靠沒有醫(yī)學(xué)背景的人隨便框框。這意味著訓(xùn)練集的規(guī)模和精度之間必須做現(xiàn)實(shí)取舍。1.3 一個(gè)訓(xùn)練集項(xiàng)目真正要解決的三件事我在推進(jìn)這個(gè)項(xiàng)目時(shí)把需求抽象成了三個(gè)核心問題后續(xù)所有技術(shù)選型都圍繞這三個(gè)問題展開數(shù)據(jù)從哪來、怎么獲得合法合規(guī)的使用授權(quán)標(biāo)注怎么做才既保證質(zhì)量、又不過度消耗病理醫(yī)生的時(shí)間模型訓(xùn)練和評估怎么做才能證明訓(xùn)練集是真的高精度而不是只在某個(gè)測試集上自嗨。后面幾章的思路完全按這三條線展開。如果你也是做醫(yī)學(xué)圖像、或者自己整理訓(xùn)練集訓(xùn)練模型這條路線可以照搬。2. 訓(xùn)練集構(gòu)建從原始切片到高質(zhì)量標(biāo)注2.1 數(shù)據(jù)來源、倫理與合規(guī)這個(gè)環(huán)節(jié)不能省醫(yī)學(xué)圖像和網(wǎng)上爬蟲抓來的貓狗圖片完全不同涉及患者隱私、機(jī)構(gòu)倫理、數(shù)據(jù)安全。我這邊走的路徑是合作醫(yī)院提供脫敏后的切片數(shù)據(jù)簽署了科研合作協(xié)議。切片在導(dǎo)出前已經(jīng)在醫(yī)院內(nèi)部完成了患者姓名、病歷號(hào)等敏感信息的清除只保留影像本身和對應(yīng)的病理診斷結(jié)論。這里有一個(gè)很容易踩的坑脫敏不只是刪掉文件名里的名字這么簡單。WSI文件內(nèi)部可能包含元數(shù)據(jù)比如掃描儀型號(hào)、掃描時(shí)間、操作員工號(hào)。這些字段看起來不起眼但按嚴(yán)格的數(shù)據(jù)合規(guī)要求都屬于需要處理的信息。我們在數(shù)據(jù)清洗階段專門寫腳本檢查了WSI的元數(shù)據(jù)字段把非必要信息全部抹掉只保留圖像和必要的掃描參數(shù)。如果你是自己做類似的醫(yī)學(xué)圖像數(shù)據(jù)集我強(qiáng)烈建議先找所在機(jī)構(gòu)的倫理委員會(huì)或者法務(wù)確認(rèn)項(xiàng)目是否涉及人類受試者研究、是否需要倫理審批。哪怕只是用公開數(shù)據(jù)集做實(shí)驗(yàn)也要讀清楚數(shù)據(jù)的使用條款。公開數(shù)據(jù)集的License限制差別很大有的允許商用有的只允許科研有的要求不重新分發(fā)。不要等論文都寫完了一審才發(fā)現(xiàn)數(shù)據(jù)授權(quán)有問題那種返工是最痛苦的。2.2 標(biāo)注流程設(shè)計(jì)讓病理醫(yī)生和算法工程師高效配合標(biāo)注是整個(gè)訓(xùn)練集構(gòu)建中最耗時(shí)、也最影響模型上限的環(huán)節(jié)。我們采用的是粗篩精標(biāo)復(fù)核三層流程而不是直接讓醫(yī)生從零開始框選。第一步粗篩。用預(yù)訓(xùn)練的CNN模型對全切片做初步預(yù)測把預(yù)測為可疑的區(qū)域提前框選出來作為候選patch推薦給醫(yī)生。這么做不是為了替代醫(yī)生而是把醫(yī)生的注意力集中到真正有判讀價(jià)值的位置減少醫(yī)生在正常組織上翻找的時(shí)間。實(shí)際測試下來這一步能減少大約一半的標(biāo)注工作量。第二步精標(biāo)。醫(yī)生在推薦框的基礎(chǔ)上對每個(gè)patch做二分類或多分類標(biāo)注。我建議用多分類而不是簡單的良惡性二分。在乳腺病理里常見的類別包括正常/良性病變、非典型增生、原位癌、浸潤性癌等。多分類的好處是模型訓(xùn)練時(shí)可以利用更豐富的監(jiān)督信號(hào)實(shí)際部署時(shí)也能按不同類別設(shè)置不同的下游策略。第三步復(fù)核。隨機(jī)抽取10%的已標(biāo)注patch交給第二位醫(yī)生獨(dú)立盲審計(jì)算兩位醫(yī)生之間的一致性指標(biāo)比如Kappa系數(shù)。如果Kappa低于0.8說明標(biāo)注標(biāo)準(zhǔn)模糊需要回到第二步重新校準(zhǔn)標(biāo)準(zhǔn)。這是很多團(tuán)隊(duì)會(huì)省略的環(huán)節(jié)但我建議一定保留因?yàn)闃?biāo)注一致性直接決定了訓(xùn)練集的噪聲水平而噪聲水平的容忍度在病理場景里很低。2.3 類不平衡與patch選取策略這一步是訓(xùn)練集構(gòu)建的技術(shù)核心也是真正拉開差距的地方。我最終采用的策略是將WSI按20倍放大倍率切成224×224的patch然后對每個(gè)patch做篩選。篩選規(guī)則包括組織覆蓋率必須大于閾值比如80%排除大面積的背景和雜質(zhì)同時(shí)根據(jù)標(biāo)注密度控制采樣比例。在類別分布上我會(huì)刻意做類別的混合采樣而不是讓模型直接面對原始分布。具體的采樣比例通過一個(gè)簡單的公式控制每個(gè)batch中正樣本基數(shù)為基準(zhǔn)負(fù)樣本按設(shè)定比例下采樣。這樣模型每個(gè)batch都能看到足夠數(shù)量的癌變patch避免在小類別上欠擬合。同時(shí)我還會(huì)控制同一個(gè)患者來源的patch不要同時(shí)落到訓(xùn)練集和測試集。醫(yī)學(xué)圖像里有一個(gè)常見bug如果把同一個(gè)病人的不同patch隨機(jī)劃分模型相當(dāng)于見過了正確答案的一部分測試指標(biāo)會(huì)虛高。這種泄漏在跨病人泛化測試中會(huì)暴露得一干二凈。所以劃分時(shí)必須以患者為最小單位而不是以patch為單位。這也是很多人做醫(yī)學(xué)圖像時(shí)忽略的細(xì)節(jié)。2.4 數(shù)據(jù)劃分訓(xùn)練集、驗(yàn)證集、測試集各司其職訓(xùn)練集和測試集的作用經(jīng)常被人混淆。我習(xí)慣用一句話來解釋它們的區(qū)別訓(xùn)練集是學(xué)生平時(shí)做的練習(xí)冊測試集是考試卷驗(yàn)證集是考前模擬卷。訓(xùn)練集讓模型學(xué)習(xí)參數(shù)驗(yàn)證集用來調(diào)整超參和選擇模型測試集只能用一次用來估計(jì)模型在真實(shí)場景中的最終水平。在比例選擇上我目前的配置是約70%訓(xùn)練集、15%驗(yàn)證集、15%測試集。如果數(shù)據(jù)量非常少可以考慮用交叉驗(yàn)證替代固定劃分K折交叉驗(yàn)證的K一般取5把K-1折用于訓(xùn)練、1折用于驗(yàn)證輪流進(jìn)行最終指標(biāo)取K次的平均。但要注意交叉驗(yàn)證的訓(xùn)練時(shí)間會(huì)成倍增加在大規(guī)模WSI場景下未必劃算。另外一個(gè)關(guān)鍵點(diǎn)劃分時(shí)要考慮標(biāo)簽分布均衡。不能出現(xiàn)在訓(xùn)練集中良性病例占90%、測試集中惡性病例占90%這種極端情況。我通常用分層采樣stratified sampling來確保每個(gè)子集的類別比例與原數(shù)據(jù)集大致一致。sklearn里面有個(gè)StratifiedShuffleSplit可以直接用省得手寫。3. 模型選型與訓(xùn)練細(xì)節(jié)把數(shù)據(jù)集的價(jià)值榨干3.1 Backbone選型ResNet、EfficientNet還是Vision Transformer訓(xùn)練集的質(zhì)量是上限但模型選擇決定你能不能逼近這個(gè)上限。我在這個(gè)項(xiàng)目里前后對比過ResNet-50、EfficientNet-B3/B4和ViT-Small簡單說一下選型結(jié)論。ResNet-50最大的優(yōu)點(diǎn)是穩(wěn)定、資源消耗小、社區(qū)資料多適合作為基線模型快速驗(yàn)證數(shù)據(jù)和標(biāo)注的質(zhì)量。但遇到細(xì)粒度識(shí)別任務(wù)它的精度提升空間有限。EfficientNet-B3/B4是我最終選擇的折中方案。同樣的精度目標(biāo)下EfficientNet的計(jì)算量比ResNet小得益于它的復(fù)合縮放策略。實(shí)際測試中EfficientNet-B4在patch分類上的AUC比ResNet-50高1.5%到2%推理耗時(shí)增加的幅度在我能接受的范圍內(nèi)。Vision TransformerViT在小規(guī)模醫(yī)學(xué)圖像數(shù)據(jù)集上并不一定占優(yōu)因?yàn)閂iT需要更多數(shù)據(jù)來學(xué)習(xí)歸納偏置。這個(gè)項(xiàng)目的數(shù)據(jù)量還沒到能讓ViT發(fā)揮優(yōu)勢的水平。如果你用的是幾十萬甚至上百萬patch的規(guī)??梢栽囋嘨iT但做好調(diào)參的心理準(zhǔn)備。我的建議是不要一開始就上最復(fù)雜的模型先拿ResNet跑通Pipeline確認(rèn)訓(xùn)練集的分布、標(biāo)注質(zhì)量、loss曲線都正常再換EfficientNet或ViT做精度提升。模型換血前先保證流程是通的這能省掉大量排查問題的時(shí)間。3.2 損失函數(shù)設(shè)計(jì)的醫(yī)學(xué)動(dòng)機(jī)二分類場景下交叉熵?fù)p失CrossEntropyLoss是默認(rèn)選擇但醫(yī)學(xué)圖像分類里類不平衡問題太嚴(yán)重因此我會(huì)優(yōu)先考慮加權(quán)的交叉熵或Focal Loss。Focal Loss的核心思想是用一個(gè)調(diào)制因子降低易分類樣本的權(quán)重讓模型訓(xùn)練時(shí)更關(guān)注難分類樣本。具體公式是FL(p_t) -α_t(1 - p_t)^γ log(p_t)。其中γ是聚焦參數(shù)通常設(shè)為1.5到2.0α_t是類別權(quán)重用來調(diào)整正負(fù)樣本的比例。在病理場景里γ取2.0時(shí)模型對罕見癌變patch的敏感度明顯提升。這里有個(gè)心得損失函數(shù)的不平衡處理和采樣策略的不平衡處理是雙保險(xiǎn)不能只依賴一個(gè)。采樣能保證每個(gè)batch的類別比例合理損失函數(shù)能進(jìn)一步懲罰模型對難例的忽視。兩者配合效果才穩(wěn)定。另外在訓(xùn)練多類別分類時(shí)我建議直接在輸出層做多類softmax而不是訓(xùn)練多個(gè)二分類器。多類softmax能強(qiáng)制類別之間互相競爭讓特征表示更有判別力。3.3 數(shù)據(jù)增強(qiáng)與訓(xùn)練策略穩(wěn)定復(fù)現(xiàn)更關(guān)鍵病理圖像的數(shù)據(jù)增強(qiáng)我保持相對克制。隨機(jī)水平翻轉(zhuǎn)、垂直翻轉(zhuǎn)、隨機(jī)旋轉(zhuǎn)90度、隨機(jī)裁剪這些幾何增強(qiáng)可以放心用。顏色增強(qiáng)要非常小心因?yàn)椴±砬衅娜旧桨副热鏗E染色有標(biāo)準(zhǔn)流程如果顏色抖動(dòng)幅度太大模型會(huì)學(xué)到對染色響應(yīng)的錯(cuò)誤不變性導(dǎo)致?lián)Q了一個(gè)掃描儀之后性能驟降。我之前踩過一個(gè)坑用了過強(qiáng)的色彩抖動(dòng)在原始掃描儀數(shù)據(jù)的測試集上表現(xiàn)還行但換了一臺(tái)不同品牌掃描儀采集的數(shù)據(jù)AUC直接從0.96掉到0.88。后來重新調(diào)整了色彩增強(qiáng)的范圍把亮度、對比度、飽和度的擾動(dòng)幅度減小后跨掃描儀的魯棒性才恢復(fù)到接近0.94。訓(xùn)練策略上我采用兩階段先在ImageNet預(yù)訓(xùn)練權(quán)重基礎(chǔ)上凍結(jié)backbone只訓(xùn)練分類頭幾個(gè)epoch然后解凍全部參數(shù)做細(xì)調(diào)finetune。這個(gè)做法的好處是避免了訓(xùn)練一開始就大范圍破壞預(yù)訓(xùn)練特征。學(xué)習(xí)率用余弦退火調(diào)度初始學(xué)習(xí)率從1e-4起步batch size 64。別的細(xì)節(jié)像AdamW優(yōu)化器、weight decay設(shè)1e-4這些是常規(guī)操作。真正要讓模型穩(wěn)定復(fù)現(xiàn)關(guān)鍵是固定隨機(jī)種子PyTorch里需要同時(shí)設(shè)置torch.manual_seed、np.random.seed如果用了CUDA還要設(shè)置torch.cuda.manual_seed_all。另外把cudnn.deterministic設(shè)為True否則即使種子一樣某些CUDA算子依然可能帶來非確定性差異。3.4 高精度評估不能只看Accuracy用準(zhǔn)確率評估醫(yī)學(xué)圖像分類模型是非常危險(xiǎn)的尤其在類別不平衡的場景里。舉個(gè)極端例子如果測試集里90%是良性那么一個(gè)全猜良性的模型準(zhǔn)確率也有90%實(shí)際卻完全沒用。醫(yī)學(xué)場景下我更關(guān)注的指標(biāo)是AUC、敏感度Sensitivity、特異度Specificity、F1-score。敏感度代表有病的人被查出來的比例臨床篩查寧可誤報(bào)也不能漏診所以敏感度是優(yōu)先保障的指標(biāo)。特異度代表沒病的人被正確排除的比例它決定過度診斷的程度。AUC綜合反映模型在所有閾值下的排序能力適合模型選型時(shí)做橫向?qū)Ρ鹊皇亲罱K部署指標(biāo)。部署時(shí)還需要根據(jù)臨床可接受的敏感度水平反推分類閾值。比如把決策閾值從默認(rèn)的0.5下調(diào)到0.3敏感度可能從0.88升到0.96但特異度會(huì)相應(yīng)下降。具體閾值怎么選要和臨床團(tuán)隊(duì)一起定不能算法工程師自己拍腦袋。我最終的評估報(bào)告里會(huì)同時(shí)給出多組閾值下敏感度-特異度的對應(yīng)表格方便決策方根據(jù)實(shí)際場景權(quán)衡。提示在做模型選擇時(shí)不要只比較最優(yōu)AUC一個(gè)數(shù)字。把模型的PR曲線Precision-Recall曲線畫出來看。在不平衡數(shù)據(jù)集上PR曲線比ROC曲線信息量更大。4. 實(shí)戰(zhàn)排坑標(biāo)注錯(cuò)誤、Loss不降與過擬合4.1 標(biāo)注錯(cuò)誤會(huì)導(dǎo)致訓(xùn)練集Loss降不下來嗎很多人在訓(xùn)練自己的數(shù)據(jù)集時(shí)都問過這個(gè)問題錯(cuò)誤標(biāo)注導(dǎo)致訓(xùn)練集loss降不下去到底是真的嗎我的結(jié)論錯(cuò)誤標(biāo)注確實(shí)會(huì)讓loss下降變慢、最終loss值偏高但不一定表現(xiàn)為完全降不下去。因?yàn)樯窠?jīng)網(wǎng)絡(luò)對單點(diǎn)噪聲有較高的容忍能力少量錯(cuò)誤標(biāo)注會(huì)被周圍大量正確標(biāo)注稀釋。但如果是系統(tǒng)性的錯(cuò)誤標(biāo)注——比如某一位醫(yī)生把非典型增生一律標(biāo)成了浸潤癌——模型就會(huì)學(xué)到錯(cuò)誤規(guī)律loss可能降到比較低的水平但測試集上表現(xiàn)很一般。這在病理AI里是最隱蔽的坑訓(xùn)練時(shí)一切正常測試時(shí)打回原形。所以發(fā)現(xiàn)問題不能只盯著loss曲線。定期做誤分類樣本的bad case分析更有效。我每周會(huì)抽出一些訓(xùn)練集中預(yù)測錯(cuò)誤且置信度很高的樣本請醫(yī)生重新復(fù)核。如果發(fā)現(xiàn)某類別的錯(cuò)誤率系統(tǒng)性偏高就很有可能是標(biāo)注標(biāo)準(zhǔn)出了問題。另外我還做了一版標(biāo)簽清洗的實(shí)驗(yàn)把訓(xùn)練集里被模型反復(fù)預(yù)測錯(cuò)誤、且醫(yī)生復(fù)核后確認(rèn)標(biāo)注有誤的樣本移除重新訓(xùn)練。結(jié)果很能說明問題模型在測試集上的AUC提升了1.1%。不要小看這1%在醫(yī)學(xué)場景里這可能是幾十個(gè)誤診病例的差異。4.2 Loss不收斂的排查清單如果你的模型訓(xùn)練集loss確實(shí)降不下來先從這幾個(gè)方向查不要一上來就調(diào)模型結(jié)構(gòu)學(xué)習(xí)率設(shè)置是否合理。學(xué)習(xí)率過大導(dǎo)致震蕩無法收斂過小導(dǎo)致收斂過慢。檢查每個(gè)step的loss變化幅度如果loss在初始幾步突然飆升大概率是學(xué)習(xí)率太大。數(shù)據(jù)預(yù)處理是否一致。訓(xùn)練和測試的尺寸resize、歸一化參數(shù)是否統(tǒng)一很多詭異問題都出在這里。標(biāo)簽是否有錯(cuò)誤或遺漏。隨機(jī)抽100個(gè)訓(xùn)練樣本人工核對一遍看看有沒有標(biāo)簽錯(cuò)位、文件路徑讀取錯(cuò)誤導(dǎo)致圖片和標(biāo)簽對不上。模型是否學(xué)到了有效特征。把中間層的feature map可視化或者把模型在簡單子集上的表現(xiàn)單獨(dú)測試。如果連最簡單的子集都擬合不了數(shù)據(jù)管線大概率有bug。我遇到過一個(gè)最難查的問題某個(gè)類別的圖片在讀取時(shí)出現(xiàn)了排bytes順序錯(cuò)誤導(dǎo)致圖像顏色通道錯(cuò)亂模型在訓(xùn)練集上始終到不了目標(biāo)精度。最后是用可視化batch的方式才發(fā)現(xiàn)的。所以建議你在訓(xùn)練啟動(dòng)后沒事就打印幾行batch圖像出來肉眼檢查這個(gè)習(xí)慣能幫你省很多排查時(shí)間。4.3 可解釋性讓模型像在看病理而不是猜答案病理醫(yī)生不會(huì)輕易信任一個(gè)只報(bào)惡性概率0.93的模型。要讓這個(gè)訓(xùn)練集形成的模型真正被臨床接受可解釋性必須跟上。我最常用的工具是Grad-CAM熱力圖。把模型最后一層卷積的梯度傳到輸入圖像生成高亮區(qū)域疊加到原patch上。一個(gè)合理的模型熱力高亮區(qū)域應(yīng)該集中在細(xì)胞核密集、核異型性明顯的區(qū)域如果模型高亮的區(qū)域全是染色背景或組織間隙那基本可以斷定模型學(xué)到了偽相關(guān)。更進(jìn)一步的方案是用基于Patch的決策融合。我把整個(gè)WSI切成多個(gè)patch分別預(yù)測再把預(yù)測結(jié)果映射回全切片坐標(biāo)形成熱力圖。醫(yī)生能直觀看到哪塊組織被模型判為高風(fēng)險(xiǎn)。這種做法比單獨(dú)給patch熱力圖更符合病理醫(yī)生的工作習(xí)慣也更容易建立信任。可解釋性還有一個(gè)加分項(xiàng)記錄模型在不同放大倍率下的預(yù)測一致性。惡性病變在高倍鏡下往往有比較明顯的異型性如果模型在低倍率下判惡性、高倍率下判良性說明可能受到了某些低倍率下的干擾因素影響這類樣本需要人工復(fù)核。4.4 模型壓縮與部署的取舍訓(xùn)練集和模型跑到一定精度以后就要考慮部署場景了。病理AI最終要嵌入到醫(yī)院的病理信息系統(tǒng)PACS或者輔助診斷工作流里對推理速度有硬性要求。我試驗(yàn)了幾種壓縮方案簡單說下結(jié)論。模型權(quán)重量化到INT8后推理速度提升約3倍內(nèi)存占用下降75%但AUC下滑約0.8%在敏感度優(yōu)先的場景下有點(diǎn)難受。知識(shí)蒸餾是一個(gè)更值得嘗試的方案用EfficientNet-B4當(dāng)teacher蒸餾到一個(gè)較小的EfficientNet-B0可以做到只損失0.3%的AUC換來接近2.5倍的推理加速。部署時(shí)還要考慮的一件事是GPU和CPU的選型。如果醫(yī)院已經(jīng)有NVIDIA的GPU工作站直接上TensorRT優(yōu)化是最高效的路徑。如果只有CPU環(huán)境那就得認(rèn)真考慮量化策略和模型規(guī)模。不要做那種我們模型精度特別高但部署要一臺(tái)四卡A100的方案臨床環(huán)境沒那么慷慨。5. 常見問題速查按從數(shù)據(jù)到部署的順序排坑我整理了這份實(shí)操中反復(fù)出現(xiàn)的問答速查表覆蓋從訓(xùn)練集構(gòu)建到部署的完整鏈路供直接參考。常見問題排查方向推薦處理方式訓(xùn)練集loss降不下來學(xué)習(xí)率、數(shù)據(jù)管線、標(biāo)簽錯(cuò)誤先可視化和核對數(shù)據(jù)再調(diào)整學(xué)習(xí)率用簡易子集驗(yàn)證訓(xùn)練集loss降了但測試集AUC低過擬合、數(shù)據(jù)泄漏、標(biāo)注系統(tǒng)性錯(cuò)誤檢查數(shù)據(jù)劃分是否按患者分組做bad case分析同一患者patch被同時(shí)分到訓(xùn)練集和測試集數(shù)據(jù)劃分時(shí)以patch為單位隨機(jī)劃分改成按患者ID進(jìn)行分組劃分訓(xùn)練集類別嚴(yán)重不平衡正負(fù)樣本比例失調(diào)混合采樣 Focal Loss/加權(quán)CE雙保險(xiǎn)換掃描儀之后性能暴跌顏色增強(qiáng)過強(qiáng)模型學(xué)到染色偏移調(diào)小色彩增強(qiáng)幅度加入多掃描儀數(shù)據(jù)模型高亮區(qū)域落在背景而不是細(xì)胞學(xué)習(xí)到了偽相關(guān)特征用Grad-CAM檢查清洗包含過多背景的patch部署后推理太慢模型太大、未做優(yōu)化嘗試量化、知識(shí)蒸餾、TensorRT加速醫(yī)生反饋模型結(jié)論無法解釋只輸出概率沒有可視化依據(jù)輸出patch級(jí)的空間熱力圖公開數(shù)據(jù)集licenses不一致項(xiàng)目存在分發(fā)或商用風(fēng)險(xiǎn)提前核查license必要時(shí)只做內(nèi)部科研除了上面的速查表再說幾個(gè)心得體會(huì)。第一標(biāo)注質(zhì)量比樣本數(shù)量更值錢。與其急著擴(kuò)到100萬patch不如先把1萬patch做到高一致性標(biāo)注。醫(yī)學(xué)標(biāo)注的邊際成本很高如果花大量人力標(biāo)注出來的數(shù)據(jù)里混入10%錯(cuò)誤標(biāo)簽對模型帶來的負(fù)面效果可能抵消新增樣本的收益。第二模型訓(xùn)練過程中要保留checkpoint。不要只留最終一版。用驗(yàn)證集評估AUC找到驗(yàn)證集AUC最高的那個(gè)epoch對應(yīng)的模型而不是最后一個(gè)epoch的模型。在醫(yī)學(xué)場景中早停幾乎總是比訓(xùn)到底好因?yàn)橛?xùn)練后期的模型容易開始記住訓(xùn)練數(shù)據(jù)中的噪聲。第三數(shù)據(jù)版本管理必須做。訓(xùn)練集、驗(yàn)證集、測試集的劃分一旦確定就要用hash或版本號(hào)固化下來。后續(xù)跑實(shí)驗(yàn)時(shí)任何數(shù)據(jù)變更都要生成新版本不然會(huì)出現(xiàn)兩個(gè)實(shí)驗(yàn)用的數(shù)據(jù)根本不一樣卻還以為是算法差異的尷尬情況。5.1 給新手的建議從一個(gè)小規(guī)模可復(fù)現(xiàn)項(xiàng)目開始如果你第一次做醫(yī)學(xué)圖像分類我真心建議不要一上來就搞幾千張WSI。先把目標(biāo)縮小找到一個(gè)幾百patch的小數(shù)據(jù)集跑通完整流程確認(rèn)每個(gè)環(huán)節(jié)的輸出都是預(yù)期中的再逐步擴(kuò)大。小規(guī)模項(xiàng)目的好處是你可以在有限時(shí)間內(nèi)人工檢查每個(gè)環(huán)節(jié)搞清楚我的數(shù)據(jù)標(biāo)注長什么樣模型看到的batch是什么loss下降到多少算正常哪些樣本是難例。這些感知一旦建立后面做大項(xiàng)目就有參照了。工具鏈上我推薦把PyTorch、TensorBoard、Weights Biases三者結(jié)合起來用。尤其要用TensorBoard或WB定期查看訓(xùn)練圖像和預(yù)測結(jié)果不要只盯loss曲線。圖像是你了解模型訓(xùn)練的眼睛loss只是體溫計(jì)。另外寫代碼時(shí)建議寫一個(gè)簡單清晰的config文件統(tǒng)一管理超參。病理圖像的實(shí)驗(yàn)周期長每個(gè)實(shí)驗(yàn)跑起來要幾個(gè)小時(shí)甚至幾天如果超參靠手工改代碼記錄和復(fù)現(xiàn)都會(huì)非常痛苦。用config管理參數(shù)配合實(shí)驗(yàn)日志能在長期迭代中保留大量可回溯的歷史記錄。5.2 關(guān)于這個(gè)訓(xùn)練集項(xiàng)目后續(xù)可以擴(kuò)展的方向這套訓(xùn)練集在完成良惡性分類這個(gè)基礎(chǔ)目標(biāo)之外還可以往幾個(gè)方向擴(kuò)展。第一個(gè)方向是分子分型預(yù)測。乳腺癌有Luminal A、Luminal B、HER2陽性和三陰性等不同分子分型不同分型的治療策略差異很大?,F(xiàn)有研究表明部分分子分型在組織形態(tài)學(xué)上有一定的特征信號(hào)但肉眼未必能穩(wěn)定捕捉。用AI訓(xùn)練集在這些亞型上做預(yù)測是一個(gè)有價(jià)值的研究方向。第二個(gè)方向是多模態(tài)融合。把病理圖像和影像學(xué)圖像比如鉬靶、磁共振、基因組數(shù)據(jù)結(jié)合用多模態(tài)模型做綜合預(yù)后判斷。這個(gè)方向?qū)?shù)據(jù)整合能力的要求更高但也是臨床真正需要的。第三個(gè)方向是跨中心泛化。同樣的訓(xùn)練集在這個(gè)醫(yī)院訓(xùn)練得很好換到另一家醫(yī)院、另一個(gè)掃描設(shè)備上表現(xiàn)是否穩(wěn)定是需要專項(xiàng)驗(yàn)證的。要把數(shù)據(jù)按醫(yī)院或設(shè)備分組做外部隊(duì)列測試反復(fù)迭代模型和數(shù)據(jù)增強(qiáng)策略。我在實(shí)際項(xiàng)目中最深的體會(huì)是訓(xùn)練集的價(jià)值不在于量大而在于干凈且分布合理。做到了這一點(diǎn)哪怕模型結(jié)構(gòu)不是最前沿的也能在真實(shí)場景中取得不錯(cuò)的成績。沒做到這一點(diǎn)再花哨的模型方案都會(huì)在臨床數(shù)據(jù)面前現(xiàn)出原形。本文還有配套的精品資源點(diǎn)擊獲取