)
之前在做病理圖像分類項目時最頭疼的不是模型結構怎么選而是數(shù)據根本不夠用。醫(yī)院病理科收集的切片數(shù)據本身就需要專家逐張標注標注一塊 Tiles 往往就要耗費大量時間再加上罕見病樣本稀缺、患者隱私保護嚴格想湊齊一個類別均衡的訓練集非常困難。后來我們在方案里引入了條件擴散模型Conditional Diffusion Model做合成組織病理學圖像生成把類別標簽當成生成條件成功補充了低樣本類別下游模型效果也有明顯提升。這篇文章就把這套評估流程完整記錄下來包含原理講解、可運行代碼、量化評估方法和常見踩坑總結希望對做病理AI、醫(yī)學圖像生成的朋友有幫助。1. 為什么需要生成合成組織病理學圖像1.1 病理AI的數(shù)據瓶頸組織病理學圖像是病理醫(yī)生診斷腫瘤類型、分級、判斷預后最重要的依據。在進行全玻片掃描成像WSI后一張切片往往能達到數(shù)萬像素甚至十億像素級別直接訓練深度學習模型并不現(xiàn)實常規(guī)做法是先將其切分為 256×256 或 512×512 的 Tiles再針對這些 Tiles 做分類、分割或特征提取。但數(shù)據層面存在幾個難以繞開的瓶頸。首先是隱私合規(guī)病理圖像涉及患者診斷信息直接跨機構共享樣本需要經過嚴格的倫理審批和數(shù)據脫敏流程。其次是標注成本病理結構與自然圖像差異極大判定一個組織區(qū)域是良性、惡性還是腫瘤浸潤前沿往往需要多年經驗的病理醫(yī)生參與標注費用高、周期長。第三是類別不均衡某些罕見病變類型在真實臨床數(shù)據里占比很低模型在訓練時很容易被多數(shù)類主導對少樣本類別幾乎學不到有效特征。合成圖像生成技術成為緩解上述問題的關鍵手段。通過生成模型構造符合目標類別分布的新樣本可以在不直接復用患者原始數(shù)據的前提下擴充訓練集為分類、分割、檢測等下游任務提供額外樣本。這類合成樣本不是簡單的裁剪、翻轉、顏色抖動而是從數(shù)據分布層面產生了全新圖像對提升模型泛化能力更有價值。1.2 為什么是條件擴散模型過去幾年生成對抗網絡GAN是醫(yī)學圖像生成的主流方案尤其是 StyleGAN 系列在人臉和自然圖像上取得了很好的效果。但在病理圖像場景中GAN 存在訓練不穩(wěn)定、模式坍塌、生成圖像紋理重復等明顯問題。組織病理圖像有極強的形態(tài)學特征比如腺管結構、核異型性、間質纖維化一旦模型坍塌到少數(shù)幾種模式生成結果對整個訓練集的補充意義就非常有限。擴散模型Diffusion Model提供了一個更穩(wěn)定的生成范式。它的思路不是像 GAN 那樣直接讓生成器與判別器對抗而是先給真實圖像逐步加入高斯噪聲直到圖像幾乎完全變成噪聲再訓練一個神經網絡學習逐步去噪從而恢復原始圖像。這個過程可以看作從目標數(shù)據分布驅動的噪聲還原訓練過程相對穩(wěn)定生成質量也更容易通過增加去噪步數(shù)來提升。無條件擴散模型雖然能生成逼真圖像但無法控制生成類別這在醫(yī)學場景中很難直接用。條件擴散模型則在噪聲預測網絡中引入額外條件信息比如類別標簽、文本描述、圖像引導等。它解決了病理 AI 中非常核心的訴求我們不僅需要生成一張圖像更需要生成一張指定類別、指定病理特征的圖像。這也就是為什么在合成組織病理學圖像生成任務中條件擴散模型逐步成為主流研究方向。1.3 本文評估方案與閱讀路線本文圍繞條件擴散模型在組織病理學圖像生成中的評估展開完整流程包括核心原理、數(shù)據預處理、基于 Diffusers 庫的最小實現(xiàn)、FID、IS、MS-SSIM 評估方法以及訓練穩(wěn)定性和工程落地建議。如果你是剛開始接觸擴散模型建議先完整閱讀第 3 章原理部分再對照代碼運行。如果已經跑過相關實驗可以直接跳到第 5 章看評估指標再對照第 6 章常見問題排查。整篇文章的代碼以 PyTorch 生態(tài)為基礎可以按你自己的數(shù)據集替換數(shù)據路徑和類別配置。2. 環(huán)境準備與實驗設計2.1 硬件與依賴環(huán)境訓練擴散模型對算力有一定要求。本文示例使用 128×128 分辨率和較淺的 UNet顯存占用約 6GB 到 12GB一張 NVIDIA GTX 3060 或更高顯存的顯卡可以完成訓練。如果只有普通 CPU 環(huán)境也可以通過減小圖像尺寸、降低 batch size 跑通流程但生成質量會受限制??缭O備訓練時建議使用顯存 16GB 以上的 GPU或使用云 GPU 平臺。軟件環(huán)境以 Python 3.9 以上版本為基準依賴庫包括 PyTorch、Diffusers、Torchvision、Accelerate、Tqdm、Pillow、Scikit-learn、OpenCV、Pytorch-FID 和 Torchmetrics。這里不固定具體版本號因為 PyTorch 和 Diffusers 迭代較快建議安裝時使用當前穩(wěn)定版本。以下命令可以創(chuàng)建基礎環(huán)境pip install torch torchvision diffusers accelerate tqdm pillow pip install scikit-learn opencv-python pytorch-fid torchmetrics實際項目中版本需要根據你的項目環(huán)境調整。如果使用 Conda也可以先創(chuàng)建虛擬環(huán)境再安裝依賴避免與系統(tǒng) Python 環(huán)境沖突。2.2 項目結構設計開始寫代碼前先把項目結構規(guī)劃清楚。本文采用以下結構histo_diffusion_eval/ ├── config.py # 全局配置數(shù)據路徑、訓練輪數(shù)、圖像尺寸 ├── dataset.py # 病理 Tiles 數(shù)據集加載與增強 ├── model.py # 條件 UNet 構建 ├── train.py # 訓練入口 ├── sample.py # 條件生成采樣 └── evaluate.py # 評估腳本FID、IS、MS-SSIM這種按功能拆分的結構便于復現(xiàn)實驗也方便后續(xù)更換數(shù)據集或調整模型。配置集中在config.py中可以避免在多個文件里硬編碼參數(shù)。3. 條件擴散模型原理與條件注入方式3.1 擴散模型的核心過程擴散模型由前向過程和逆向過程組成。前向過程是一個固定的加噪過程每一時間步都向圖像中添加少量高斯噪聲經過足夠多步之后圖像近似變成標準高斯噪聲。若用 T 表示總時間步數(shù)通常取 1000則前向過程可以寫成從原始圖像 x? 出發(fā)逐步得到 x?, x?, ..., x_T。訓練階段并不需要逐步迭代采樣擴散模型的數(shù)學性質允許直接根據任意時間步 t 計算出帶噪圖像。設 α?_t 是噪聲調度器的累計系數(shù)隨機噪聲為 ε則帶噪圖像 x_t 可以表示為x_t sqrt(α?_t) * x_0 sqrt(1 - α?_t) * ε神經網絡的任務是預測噪聲 ε。只要模型能準確預測出當前時刻添加的噪聲逆向過程就可以從 x_t 中減去預測噪聲逐步得到更接近原始圖像的 x_{t-1}最終從純噪聲中還原出清晰圖像。這個方法被驗證為穩(wěn)定的生成方案也是近年擴散模型在圖像生成領域快速發(fā)展的基礎。3.2 條件信息的三種注入方式條件擴散模型與無條件擴散模型最大的區(qū)別在于去噪網絡需要額外接收條件信息。不同任務的數(shù)據形態(tài)不同條件注入方式也有區(qū)別。第一類是類別條件最典型的做法是把類別標簽通過nn.Embedding映射成類別嵌入向量再在 UNet 的殘差塊中與時間嵌入向量相加引導每個特征層在去噪時保持對應類別的語義。本文后續(xù)代碼使用的UNet2DModel支持通過class_labels參數(shù)傳入類別標簽屬于這一類。第二類是圖像條件常用于圖像修復、超分辨率、分割引導等任務比如把低分辨率圖或掩碼圖與噪聲圖像在通道維度拼接或者通過交叉注意力機制讓網絡參考條件圖像的特征。這種方法在病理場景中也可以用于指定生成區(qū)域的形態(tài)結構。第三類是文本條件常見做法是使用 CLIP 文本編碼器提取文本特征再通過交叉注意力層與 UNet 內部圖像特征交互。這類方法在自然圖像生成中很流行但病理文本描述標注成本高因此目前醫(yī)學圖像生成研究中使用類別條件和圖像條件的場景更多。本文的病理圖像生成屬于多類別組織分類場景適合使用類別條件。實際項目中如果數(shù)據集中包含病變區(qū)域分割掩碼也可以進一步改成圖像條件讓模型生成指定區(qū)域的病理結構。3.3 訓練目標與采樣要點條件擴散模型的訓練目標非常簡潔。給定干凈圖像 x?、類別標簽 c、隨機時間步 t 和噪聲 ε模型輸出其對噪聲的預測 ε_θ(x_t, t, c)損失函數(shù)采用噪聲預測與真實噪聲的均方誤差L E[ || ε - ε_θ(x_t, t, c) ||2 ]這個目標函數(shù)不依賴對抗訓練因此訓練過程相對穩(wěn)定。需要注意的是時間步 t 應該隨機均勻采樣讓模型學會在所有噪聲強度下都能正確去噪而不是只擅長某幾個時間步。條件信息在訓練時也不能總是參與否則模型會過度依賴條件導致無條件采樣時效果明顯退化。采樣階段可以使用 DDPM 調度器逐步去噪。DDPM 的采樣步數(shù)與訓練步數(shù)一致速度較慢如果需要更快生成可以使用 DDIM 采樣器用更少的采樣步數(shù)達到接近的效果。實際項目中我通常先用 DDPM 完整采樣確認質量再調整為 DDIM 加速實驗迭代。4. 完整實戰(zhàn)條件擴散模型生成病理圖像4.1 數(shù)據集準備與預處理本文代碼假設數(shù)據集目錄按類別組織每個類別一個子文件夾文件夾內是已經切好的病理 Tiles。Camelyon16、TCGA 等公開組織病理數(shù)據集都可以作為實驗來源但使用時需要核對數(shù)據授權協(xié)議按自己的科研或業(yè)務場景合規(guī)使用。切塊預處理通常包含以下幾個步驟從 WSI 中讀取組織區(qū)域過濾掉純白色背景和玻璃雜質區(qū)域將有效組織區(qū)域切分為固定尺寸的 Tiles最后人工或基于已有標簽完成類別標注。對于快速復現(xiàn)實驗可以先收集每類 200 到 500 張 Tiles數(shù)量不多但足夠驗證完整流程。dataset.py中實現(xiàn)一個讀取本地病理 Tiles 數(shù)據集的Dataset類。它掃描根目錄下的子文件夾把類別名稱轉換成數(shù)字標簽并返回圖像和標簽。數(shù)據增強部分使用了隨機水平和垂直翻轉保持病理圖像的結構語義不變。import os from PIL import Image import torch from torch.utils.data import Dataset from torchvision import transforms class HistologyTileDataset(Dataset): def __init__(self, root_dir, image_size128): self.image_paths [] self.labels [] self.class_names sorted(os.listdir(root_dir)) self.class_to_idx {name: i for i, name in enumerate(self.class_names)} for cls_name in self.class_names: cls_dir os.path.join(root_dir, cls_name) if not os.path.isdir(cls_dir): continue for fname in os.listdir(cls_dir): if fname.lower().endswith((.png, .jpg, .jpeg)): self.image_paths.append(os.path.join(cls_dir, fname)) self.labels.append(self.class_to_idx[cls_name]) self.transform transforms.Compose([ transforms.Resize((image_size, image_size)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), ]) def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img Image.open(self.image_paths[idx]).convert(RGB) label self.labels[idx] img self.transform(img) return img, label這里把圖像像素歸一化到 -1 到 1 范圍與擴散模型噪聲調度器的輸出范圍保持一致。如果你的數(shù)據集圖像不是正方形Resize會統(tǒng)一拉伸到指定尺寸實際項目中也可以考慮中心裁剪后再縮放減少形變影響。4.2 構建條件UNet模型部分直接使用 Hugging Face Diffusers 庫提供的UNet2DModel它內部已經實現(xiàn)了時間嵌入、類別嵌入、殘差塊、注意力機制和上下采樣路徑。這樣可以在保持代碼簡潔的同時使用經過大規(guī)模實驗驗證的模型結構。model.py中的構建函數(shù)接收Config對象返回一個支持類別條件的 UNet。num_class_embeds對應類別數(shù)量block_out_channels控制每一層的通道數(shù)sample_size需要與數(shù)據集中圖像尺寸一致。from diffusers import UNet2DModel def build_unet(config): return UNet2DModel( sample_sizeconfig.image_size, in_channels3, out_channels3, layers_per_block2, block_out_channelsconfig.block_out_channels, num_class_embedsconfig.num_class_embeds, dropout0.1, )如果想更深入理解條件注入機制可以在UNet2DModel的源碼中看到它把類別標簽映射為嵌入向量并在多個殘差塊中與時間嵌入相加。這種做法可以有效引導生成過程讓不同類別的圖像在去噪階段逐漸分離開來。config.py中統(tǒng)一管理所有參數(shù)這里給出一個可運行的默認配置import torch class Config: # 數(shù)據 data_dir data/tiles image_size 128 num_classes 2 class_names [benign, malignant] # 訓練 batch_size 16 num_epochs 100 lr 2e-4 weight_decay 1e-4 grad_clip 1.0 ema_decay 0.995 device cuda if torch.cuda.is_available() else cpu # 模型 block_out_channels (64, 128, 128, 256) time_emb_dim 256 class_emb_dim 128 num_class_embeds 2 # 擴散 timesteps 1000 beta_start 1e-4 beta_end 0.02 # 采樣與評估 ddim_steps 100 sample_batch_size 16 ckpt_dir checkpoints4.3 訓練循環(huán)配置訓練過程包括加噪、噪聲預測、損失計算和參數(shù)更新四個核心步驟。train.py使用DDPMScheduler管理噪聲調度調用add_noise方法一步生成帶噪圖像然后用模型預測噪聲計算 MSE 損失。import os import torch import torch.nn.functional as F from torch.utils.data import DataLoader from torchvision import transforms from diffusers import DDPMScheduler from tqdm.auto import tqdm from config import Config from dataset import HistologyTileDataset from model import build_unet def train(config): device torch.device(config.device) dataset HistologyTileDataset(config.data_dir, config.image_size) loader DataLoader( dataset, batch_sizeconfig.batch_size, shuffleTrue, num_workers4, drop_lastTrue, ) noise_scheduler DDPMScheduler( num_train_timestepsconfig.timesteps, beta_startconfig.beta_start, beta_endconfig.beta_end, ) model build_unet(config).to(device) optimizer torch.optim.AdamW(model.parameters(), lrconfig.lr, weight_decayconfig.weight_decay) lr_scheduler torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, T_maxlen(loader) * config.num_epochs ) os.makedirs(config.ckpt_dir, exist_okTrue) global_step 0 for epoch in range(config.num_epochs): model.train() pbar tqdm(loader, descfEpoch {epoch 1}/{config.num_epochs}) for images, labels in pbar: images images.to(device) labels labels.to(device) noise torch.randn_like(images) timesteps torch.randint( 0, config.timesteps, (images.shape[0],), devicedevice ).long() noisy_images noise_scheduler.add_noise(images, noise, timesteps) noise_pred model(noisy_images, timesteps, class_labelslabels).sample loss F.mse_loss(noise_pred, noise) loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), config.grad_clip) optimizer.step() lr_scheduler.step() optimizer.zero_grad() global_step 1 pbar.set_postfix(lossloss.item()) # 每個 epoch 結束后保存一次 torch.save(model.state_dict(), os.path.join(config.ckpt_dir, fmodel_epoch{epoch 1}.pt)) if __name__ __main__: train(Config())訓練中同時使用了余弦退火學習率調度和梯度裁剪這兩項對穩(wěn)定訓練很有幫助。noise_scheduler.add_noise的第三個參數(shù)是隨機采樣的時間步不要固定成一個值。模型輸出的.sample字段才是預測噪聲這一點在使用UNet2DModel時需要注意。如果顯存較小可以調低image_size到 64 或 96或者減小batch_size。如果 GPU 利用率過低可以增加num_workers來加速數(shù)據加載。4.4 生成采樣與保存模型訓練完成后使用DDPMScheduler的timesteps從 T 到 0 逐步去噪。每步將當前時刻的帶噪圖像和類別標簽輸入模型得到預測噪聲再調用調度器的step方法獲取去噪后的prev_sample。循環(huán)結束后即可得到生成圖像。import os import torch from torchvision.utils import save_image from diffusers import DDPMScheduler from tqdm.auto import tqdm from config import Config from model import build_unet def sample(config, class_label0, ckpt_namemodel_epoch100.pt): device torch.device(config.device) noise_scheduler DDPMScheduler( num_train_timestepsconfig.timesteps, beta_startconfig.beta_start, beta_endconfig.beta_end, ) model build_unet(config).to(device) ckpt_path os.path.join(config.ckpt_dir, ckpt_name) model.load_state_dict(torch.load(ckpt_path, map_locationdevice)) model.eval() labels torch.full( (config.sample_batch_size,), fill_valueclass_label, dtypetorch.long, devicedevice, ) x torch.randn( config.sample_batch_size, 3, config.image_size, config.image_size, devicedevice, ) for t in tqdm(noise_scheduler.timesteps): with torch.no_grad(): noise_pred model(x, t, class_labelslabels).sample x noise_scheduler.step(noise_pred, t, x).prev_sample # 從 [-1, 1] 轉回 [0, 1] 并保存 x (x 1) / 2 x torch.clamp(x, 0.0, 1.0) save_image(x, fgenerated_class{class_label}.png, nrow4) return x if __name__ __main__: config Config() sample(config, class_label0)生成的圖像可以保存為一個網格圖片肉眼檢查生成結果是否具備目標類別的基本組織形態(tài)。后續(xù)定量評估時則需要把生成圖像批量導出到文件夾中作為 FID 等指標的輸入。5. 量化評估與對比分析5.1 FID評估FIDFréchet Inception Distance是圖像生成任務中最常用的評估指標之一。它先使用特征提取網絡提取真實圖像和生成圖像的高維特征再計算兩個特征分布之間的 Wasserstein-2 距離。FID 越低說明生成圖像與真實圖像的分布越接近。對于病理圖像直接用 ImageNet 預訓練的 InceptionV3 提取特征并不是最優(yōu)選擇因為 ImageNet 的自然圖像特征與病理圖像的形態(tài)特征差異很大。更合理的做法是使用病理圖像預訓練模型作為特征提取器例如在 WSI 數(shù)據上訓練的病理基礎模型。如果只是為了橫向對比不同生成模型的相對好壞使用通用的pytorch_fid實現(xiàn)也能得到一個有效的參考指標。from pytorch_fid import fid_score real_dir data/real_images_class0 gen_dir data/generated_images_class0 fid_value fid_score.calculate_fid_given_paths( [real_dir, gen_dir], batch_size32, devicecuda, dims2048, ) print(fFID: {fid_value:.4f})計算 FID 時真實圖像和生成圖像最好保持相同的數(shù)量和預處理方式避免因分辨率不一致導致指標偏差。生成圖像數(shù)量太少會帶來較大方差實際評估時建議每類生成 1000 張以上。5.2 IS評估ISInception Score從兩個維度衡量生成質量清晰度和多樣性。它使用 InceptionV3 對生成圖像進行分類如果每張圖像的類別預測置信度很高同時整體預測分布足夠分散IS 就高。IS 并不需要真實圖像作為參考因此計算簡單但它對病理圖像的指導意義有限。病理圖像類別的定義與 ImageNet 類別完全不同高 IS 只能說明生成圖像在自然圖像特征空間中可分和清晰不能說明其病理學特征是否真實。所以建議在病理場景中將 IS 作為輔助指標重點仍然看 FID 和下游任務性能。使用torchmetrics可以快速計算 ISimport torch from torchmetrics.image.inception import InceptionScore inception InceptionScore(splits10) # gen_tensors 是歸一化到 [0, 1] 的生成圖像 Tensor形狀為 [N, C, H, W] inception.update(gen_tensors) score, std inception.compute() print(fIS: {score:.4f} ± {std:.4f})5.3 MS-SSIM與下游任務評估FID 和 IS 主要從感知分布上評估生成質量無法直接反映生成圖像內部結構是否合理。組織病理圖像有腺管、細胞核、間質等結構特征因此結構相似性指標也有一定參考價值。MS-SSIMMulti-Scale Structural Similarity Index Measure通過多尺度比較亮度、對比度和結構信息衡量生成圖像與真實圖像之間的結構相似程度。需要強調MS-SSIM 衡量的是兩幅圖像逐像素級別的結構相似性它天然適合圖像修復、超分辨率類任務。在無條件生成任務中生成圖像和真實圖像本來就不應該完全一致因此 MS-SSIM 更適合作為生成樣本與真實樣本之間是否出現(xiàn)大面積結構崩壞的參考而不能作為唯一的生成效果指標。實際使用建議分兩類分別計算比如良性和惡性 Tiles 各自比較避免混合類別導致指標失真。更貼近業(yè)務價值的評估方式是下游任務評估。將真實數(shù)據加上生成數(shù)據混合訓練一個病理圖像分類模型在獨立測試集上評估分類準確率或 AUC。如果加入合成數(shù)據后分類效果有提升說明生成樣本確實能夠補充有效信息。這也是很多醫(yī)學圖像生成論文使用的評估思路。最終評估報告建議同時包含生成質量指標和下游任務指標結論更有說服力。6. 常見問題與排查清單6.1 高頻問題匯總條件擴散模型訓練和評估過程中會遇到一些高頻問題下面整理成表格方便對照排查。問題現(xiàn)象常見原因解決思路訓練損失不下降學習率過大或過小、數(shù)據歸一化不一致調整學習率檢查圖像是否歸一化到 [-1,1]生成圖像模糊訓練輪數(shù)不足、模型容量偏小增加訓練輪數(shù)適當增大 UNet 通道數(shù)類別條件失效生成結果與標簽無關標簽沒有傳入模型、類別嵌入維度過大導致過擬合檢查class_labels參數(shù)考慮類別條件 dropout顯存溢出batch size 過大、圖像分辨率過高減小 batch size降低分辨率使用梯度累積FID 偏高生成數(shù)據量少、評估特征提取器不匹配增加采樣量使用病理預訓練特征提取器采樣時出現(xiàn) NaN學習率過高導致模型發(fā)散降低學習率使用梯度裁剪檢查 beta 配置訓練速度非常慢UNet 注意力層計算量大使用小分辨率跑通減少block_out_channels6.2 訓練不穩(wěn)定排查訓練不穩(wěn)定是擴散模型最需要注意的問題。如果損失曲線出現(xiàn)劇烈抖動先檢查學習率。擴散模型一般使用 1e-4 到 3e-4 的 AdamW 學習率過大會導致噪聲預測目標震蕩。其次是檢查beta_start和beta_end配置是否合理默認值適合絕大多數(shù)自然圖像任務自定義數(shù)據集也可以適當調整。另一個常見問題是條件信息在訓練時分布過分集中。病理數(shù)據往往類別樣本量差異很大如果某個類別只有幾十張圖模型很難學會該類別的條件映射。一個簡單做法是在訓練時以一定概率比如 10%將類別標簽隨機替換成其他類別或者使用條件 dropout讓模型即使丟掉條件信息也能保持一定生成能力這也有助于避免類別條件過擬合。采樣階段如果發(fā)現(xiàn)生成圖像中混有非目標類別的結構可以檢查采樣時傳入的class_labels是否與訓練時的標簽編號一致。num_class_embeds的編號是從 0 開始的類別名稱排序過后的索引必須保持一致否則會生成錯誤類別。7. 最佳實踐與工程建議7.1 數(shù)據工程建議病理圖像生成首先要重視數(shù)據質量。原始 WSI 中大量區(qū)域是背景、玻璃、氣泡或邊緣陰影這些區(qū)域如果進入訓練集模型會把無意義紋理當作病理結構生成圖像就會包含大量無用區(qū)域。預處理時建議先分割組織區(qū)域過濾低對比度的空白 Tiles再用顏色歸一化降低不同染色方案帶來的色彩差異。類別劃分需要基于真實病理標注不能只靠文件名約定。如果使用弱標簽數(shù)據還需要額外處理標簽噪聲。擴展樣本時要避免同一張 WSI 的近鄰 Tiles 同時出現(xiàn)在訓練集和測試集防止數(shù)據泄漏導致評估虛高。對于小數(shù)據集先不要追求分辨率??梢杂?64×64 跑通流程確認模型能夠擬合訓練集后再逐步提高到 128×128 或 256×256。過早使用高分辨率不僅訓練慢排查問題也會更困難