胞分類實戰(zhàn):從數(shù)據(jù)整理到雙閾值校驗)
簡介面向癌癥檢測與血細(xì)胞分類場景的醫(yī)療圖像數(shù)據(jù)集資源已按文件夾整理好 basophil、erythroblast、monocyte、myeloblast、seg_neutrophil 五個類別的真實血細(xì)胞圖片標(biāo)注質(zhì)量較高可直接用于 YOLO11cls 等目標(biāo)分類算法的訓(xùn)練與驗證同時附帶博主的一鍵訓(xùn)練腳本和訓(xùn)練結(jié)果日志適合醫(yī)療圖像分類項目開發(fā)者、算法學(xué)習(xí)者參考復(fù)現(xiàn)。資源包共 1 個 PDF 文件約 4.86MB因數(shù)據(jù)集整體較大已托管于百度網(wǎng)盤PDF 內(nèi)含數(shù)據(jù)集基本情況說明、類別示意圖及具體獲取方式方便下載前先了解數(shù)據(jù)組織與使用條件。目前已有 51 人學(xué)習(xí)下載對于需要快速獲取整理規(guī)范的醫(yī)療分類數(shù)據(jù)并跑通 YOLO 分類流程的讀者是一份實用的入門與實戰(zhàn)參考。 做這個項目之前我其實先踩了整整一周的數(shù)據(jù)坑。起因很簡單想用血細(xì)胞涂片圖像做癌癥早期篩查階段的輔助分類模型倒好選但數(shù)據(jù)該怎么整理、怎么喂給訓(xùn)練腳本網(wǎng)上教程各說各話。后來我把圖像按類別拆成文件夾配合YOLO11cls的分類模式寫了一個訓(xùn)練腳本跑完發(fā)現(xiàn)真正決定模型上限的不是哪行訓(xùn)練代碼而是數(shù)據(jù)組織方式。這個項目一共包含1000張真實血涂片圖像按形態(tài)學(xué)類別分好文件夾附帶一份在我自己的環(huán)境里實測可用的YOLO11cls一鍵訓(xùn)練腳本。無論你是剛接觸目標(biāo)分類的新手還是想快速驗證分類模型在血細(xì)胞乃至其他醫(yī)學(xué)圖像上的效果這套流程都能直接參考。1. 任務(wù)定位血細(xì)胞分類為什么不做目標(biāo)檢測而是選YOLO11cls1.1 “分類”不是“檢測”兩者在血細(xì)胞場景里的差別很多人一聽到Y(jié)OLO第一反應(yīng)就是畫框檢測。但YOLO從第五代開始就有獨(dú)立的分類分支在Ultralytics框架里對應(yīng)的就是yolo11-cls.pt這類權(quán)重。分類任務(wù)的核心是判別“這張圖是什么”不需要邊界框也不需要給出細(xì)胞的具體位置。放到血細(xì)胞場景里目標(biāo)檢測需要人工標(biāo)注每個細(xì)胞的框在細(xì)胞密集重疊的血涂片圖像上標(biāo)注成本非??鋸垺6诸惸J街恍枰衙總€細(xì)胞裁剪成單張圖像按類別放進(jìn)文件夾模型就能學(xué)會區(qū)分中性粒細(xì)胞、淋巴細(xì)胞、單核細(xì)胞等形態(tài)差異。癌癥檢測的早期篩查有一個現(xiàn)實邏輯醫(yī)生看血涂片時懷疑對象往往是少數(shù)形態(tài)異常的原始細(xì)胞。這類細(xì)胞和正常白細(xì)胞在外觀上高度相似人工鏡檢費(fèi)時且主觀。用分類模型先粗篩一遍把低置信度的樣本挑出來送人工復(fù)核比直接做目標(biāo)檢測更貼合實際流程。這也是我最后選擇YOLO11cls分類分支的原因少一套標(biāo)注少一層調(diào)試在“細(xì)胞已經(jīng)被裁剪好”的前提下分類分支的準(zhǔn)確率并不比檢測分支差。1.2 這個數(shù)據(jù)集的組成與采集邊界數(shù)據(jù)集總計1000張圖像全部來自真實血涂片染色圖像并以單細(xì)胞裁剪為主。為了貼近不同實驗室的染色差異我保留的圖像包含明場染色和部分帶色彩偏移的樣本沒有做統(tǒng)一的顏色校正這樣訓(xùn)練出來的模型更有魯棒性。類別設(shè)置上我按形態(tài)學(xué)慣例分成六個目錄對應(yīng)六類常見細(xì)胞文件夾名中文對應(yīng)在輔助篩查中的角色neutrophil中性粒細(xì)胞最常見白細(xì)胞形態(tài)成熟lymphocyte淋巴細(xì)胞正常但易與原始細(xì)胞混淆monocyte單核細(xì)胞體積較大核形不規(guī)則eosinophil嗜酸性粒細(xì)胞顆粒明顯較易區(qū)分basophil嗜堿性粒細(xì)胞數(shù)量少染色有特點blast原始細(xì)胞/幼稚細(xì)胞異常提示癌癥篩查重點對象這份數(shù)據(jù)的“癌癥檢測”定位準(zhǔn)確說是異常細(xì)胞識別的前置輔助而不是直接診斷。原始細(xì)胞比例異常是血液系統(tǒng)惡性疾病的重要線索但模型輸出只做提示最終判斷一定需要醫(yī)生復(fù)核。后面所有訓(xùn)練和評估我都圍繞“盡量減少漏掉blast”這個目標(biāo)來做而不是單純追求總體準(zhǔn)確率。2. 1000張圖的類別目錄YOLO11cls真正需要的長這樣2.1 目錄結(jié)構(gòu)一個文件夾就是一條標(biāo)簽YOLO11cls分類模式最省事的地方在于不需要額外的標(biāo)簽文件。它會自動把文件夾名稱當(dāng)作類別名讀取目錄下的所有圖片建立映射。數(shù)據(jù)集根目錄下需要兩套子集一個是train一個是val如果有獨(dú)立的test訓(xùn)練結(jié)束后單獨(dú)用來評估。我最終整理好的目錄長這樣data/ ├── train/ │ ├── neutrophil/ # 內(nèi)含250張 │ ├── lymphocyte/ # 內(nèi)含250張 │ ├── monocyte/ # 內(nèi)含200張 │ ├── eosinophil/ # 內(nèi)含120張 │ ├── basophil/ # 內(nèi)含80張 │ └── blast/ # 內(nèi)含100張 ├── val/ │ ├── neutrophil/ │ ├── lymphocyte/ │ ├── monocyte/ │ ├── eosinophil/ │ ├── basophil/ │ └── blast/ └── test/ ├── neutrophil/ ├── lymphocyte/ ├── monocyte/ ├── eosinophil/ ├── basophil/ └── blast/這里有個很多人第一次操作容易踩的坑文件夾名稱一定不要用中文盡量用簡短英文單詞。Ultralytics會把這些名稱直接寫進(jìn)類別映射和輸出日志里中文名稱在部分系統(tǒng)上會導(dǎo)致編碼問題后面可視化混淆矩陣時也會亂碼。另外類別名稱不要帶空格和特殊字符my_class可以my class就會出問題。2.2 從原始圖片到訓(xùn)練文件夾我踩過的分配坑1000張圖不是一股腦丟進(jìn)去就行。我先按類別統(tǒng)計了每類圖片數(shù)量再用分層抽樣的方式劃分訓(xùn)練集、驗證集和測試集比例是8:1:1。分層抽樣的意思是每個類別單獨(dú)按比例切分而不是把所有圖片混在一起隨機(jī)打亂再切。我最開始偷懶直接對全量圖片做隨機(jī)劃分結(jié)果數(shù)量最少的basophil在驗證集里只分到1張訓(xùn)練日志里的loss曲線看著還行混淆矩陣卻慘不忍睹。分享一個當(dāng)時整理的簡易分割邏輯核心是train_test_split做兩次import os import shutil from sklearn.model_selection import train_test_split root raw_cells out_root data for cls_name in os.listdir(root): cls_dir os.path.join(root, cls_name) imgs [os.path.join(cls_dir, f) for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png))] train_imgs, temp_imgs train_test_split(imgs, test_size0.2, random_state42) val_imgs, test_imgs train_test_split(temp_imgs, test_size0.5, random_state42) # 再分別復(fù)制到 data/train/classes、data/val/classes、data/test/classes這樣切完每個類別在三個子集中都有一定數(shù)量。另外訓(xùn)練前我統(tǒng)一做了圖片清洗把損壞的、純黑底的、明顯失焦的圖片全部過濾掉。清洗這一步不能省臟數(shù)據(jù)對深度模型的傷害比數(shù)據(jù)量少還要大。格式上我統(tǒng)一轉(zhuǎn)成RGB的JPG避免PNG帶透明通道在某些推理環(huán)境下報錯。YOLO訓(xùn)練時會對圖像做自適應(yīng)縮放原始圖不一定要正方形但分辨率還是建議統(tǒng)一在256像素以上太小的圖裁剪后細(xì)胞形態(tài)特征會丟失后面做224推理時細(xì)節(jié)也不夠。3. 一鍵訓(xùn)練腳本的核心參數(shù)每一行都值得較真3.1 既要“一鍵”也要在代碼里說明參數(shù)來源腳本本身不復(fù)雜把Ultralytics封裝成一個Python文件替換數(shù)據(jù)集路徑后直接運(yùn)行即可。我給的訓(xùn)練參數(shù)不是隨手寫的每一項都對應(yīng)這個數(shù)據(jù)集的具體情況from ultralytics import YOLO model YOLO(yolo11-cls.pt) # 加載預(yù)訓(xùn)練權(quán)重 model.train( datadata, epochs80, imgsz224, batch32, lr01e-3, patience10, seed42, cacheTrue, workers4, ampTrue, projectruns/classify, nameblood_cls, )imgsz用224是遷移學(xué)習(xí)最穩(wěn)妥的起點預(yù)訓(xùn)練分類權(quán)重原本就在這個分辨率下優(yōu)化過強(qiáng)行調(diào)到320或更高對于只有1000張圖的數(shù)據(jù)集很容易過擬合。epochs我設(shè)成80但patience10意味著驗證集指標(biāo)連續(xù)10輪不升就提前停掉。血細(xì)胞分類數(shù)據(jù)集小實際跑下來常常在40到50輪就收斂了沒必要機(jī)械跑滿80輪。cacheTrue會在第一次讀取時把圖片全部緩存進(jìn)內(nèi)存1000張圖占用不大但能明顯加速訓(xùn)練尤其是小尺寸圖片讀盤頻繁的時候。lr01e-3是經(jīng)驗值。如果是完全隨機(jī)初始化這個學(xué)習(xí)率會偏大但因為我們用了yolo11-cls.pt預(yù)訓(xùn)練權(quán)重骨干網(wǎng)絡(luò)的特征提取能力已經(jīng)很強(qiáng)只需用較小的學(xué)習(xí)率微調(diào)最后分類頭。如果訓(xùn)練過程中發(fā)現(xiàn)loss震蕩先把學(xué)習(xí)率降到5e-4而不是去調(diào)batch size。batch size選32是在訓(xùn)練速度和顯存占用之間的平衡點實測在RTX 3060 12G上能穩(wěn)定跑完再往上加到64也能跑但收益很小反而容易在驗證集上出現(xiàn)波動。3.2 針對血細(xì)胞圖像的增強(qiáng)調(diào)整不能照搬自然圖像Ultralytics默認(rèn)會開一些數(shù)據(jù)增強(qiáng)包括隨機(jī)翻轉(zhuǎn)、色彩抖動、透視變換等。對自然圖像這些增強(qiáng)很有效但血細(xì)胞圖像有它的特殊性。細(xì)胞核和細(xì)胞質(zhì)的染色強(qiáng)度是臨床判讀的重要依據(jù)過強(qiáng)的色彩抖動可能把嗜堿性顆粒的顏色直接改沒了導(dǎo)致模型學(xué)到錯誤的顏色關(guān)聯(lián)。我的做法是關(guān)掉高強(qiáng)度的透視和旋轉(zhuǎn)保留水平翻轉(zhuǎn)和輕微的縮放色彩抖動幅度調(diào)低。如果你用命令行跑可以這樣覆蓋默認(rèn)參數(shù)yolo classify train datadata modelyolo11-cls.pt epochs80 imgsz224 batch32 hsv_h0.01 hsv_s0.3 hsv_v0.2 degrees0 fliplr0.5fliplr0.5的水平翻轉(zhuǎn)對細(xì)胞形態(tài)沒有破壞性可以保留。degrees0是我特意關(guān)掉的血細(xì)胞本身沒有固定的方向性旋轉(zhuǎn)理論上無害但我實測旋轉(zhuǎn)增強(qiáng)在染色圖像上會帶來邊緣偽影對極細(xì)小的顆粒結(jié)構(gòu)不友好。如果你想打開建議設(shè)置成degrees45以內(nèi)不要給90度或180度的特殊角度。另外一個容易被忽略的問題是類別不平衡。這個數(shù)據(jù)集里basophil只有80張neutrophil有250張模型天然會偏向樣本多的類別。我在腳本里做了一步簡單過采樣把數(shù)量少的類別在訓(xùn)練目錄里復(fù)制幾份讓每類圖片數(shù)量大致接近。聽起來粗暴但對小數(shù)據(jù)集確實有效比改損失函數(shù)門檻低很多。過采樣只影響訓(xùn)練集驗證集和測試集保持原始比例這樣才能真實反映模型在自然分布下的表現(xiàn)。4. 訓(xùn)練完才是開始校驗、混淆矩陣與真實血涂片上的表現(xiàn)4.1 進(jìn)階看confusion matrix不要只盯acc訓(xùn)練結(jié)束后結(jié)果保存在runs/classify/blood_cls目錄下里面會有results.png、confusion_matrix.png、top1_acc.png、top5_acc.png這些文件。我一般先看top1準(zhǔn)確率如果驗證集總體準(zhǔn)確率達(dá)到90%以上算是一個不錯的起點。但只看這個數(shù)字會騙人當(dāng)blast等異常類別占比不高時模型哪怕把blast全部漏掉總體準(zhǔn)確率也可能很高。我的習(xí)慣是第一時間打開confusion_matrix.png重點看兩處。第一blast這一行有沒有被大量分到lymphocyte里第二basophil和lymphocyte之間是不是混得厲害。這兩個混淆方向在形態(tài)學(xué)上非常常見不成熟的淋巴細(xì)胞和原始細(xì)胞在染色圖像上本來就長得很像。如果混淆矩陣把大量blast判成lymphocyte那這個模型在輔助篩查里是危險的因為異常細(xì)胞會被當(dāng)成正常細(xì)胞放過去。4.2 雙置信度閾值我用它來消化回歸誤判模型推理走Ultralytics自帶的命令就行yolo classify predict modelruns/classify/blood_cls/weights/best.pt sourcetest/blast/img_001.jpg輸出結(jié)果會給出預(yù)測類別和置信度。但真實場景里單靠“取置信度最高的類別”不夠穩(wěn)。血涂片圖像受染色方案、光照、顯微鏡型號影響同一張blast在不同環(huán)境下很可能被低置信度分給lymphocyte。我在腳本外專門加了一個后處理邏輯不直接采用top-1結(jié)果而是設(shè)置兩個閾值預(yù)測情況處理方式最高置信度大于0.8直接采納預(yù)測類別最高置信度在0.5到0.8之間標(biāo)記為待復(fù)核輸出到獨(dú)立文件夾模型判斷為blast但置信度低于0.5強(qiáng)制標(biāo)記為高風(fēng)險因為漏掉異常比誤報正常更危險這套規(guī)則不能說多成熟但在只有1000張圖的數(shù)據(jù)上很實用。模型即使判斷錯了置信度往往也會在邊界區(qū)擺動我們把這個緩沖區(qū)留給人工復(fù)核比強(qiáng)行讓模型給一個確定答案要安全得多。我在測試集上數(shù)過大約8%左右的低置信度樣本會被當(dāng)成正常細(xì)胞但套上雙閾值之后真正“高置信度判錯”的樣本只剩不到1%這對異常細(xì)胞篩查是有意義的。4.3 外部圖像表現(xiàn)崩盤先查顏色歸一化做醫(yī)學(xué)圖像訓(xùn)練的人大概率遇到過這種情況模型在自己的驗證集上準(zhǔn)確率96%換到一批新拍的涂片圖上立刻掉到70%。我排查過一次發(fā)現(xiàn)不是模型結(jié)構(gòu)問題而是新的圖像整體偏藍(lán)調(diào)舊圖像偏粉紅調(diào)。細(xì)胞形狀一樣但顏色分布差異太大模型把顏色分布當(dāng)成重要特征了。解決思路是增加數(shù)據(jù)的色彩多樣性或者在推理前做顏色歸一化。我后來在腳本里加了一個輕量的白平衡處理步驟把每個推理圖像的RGB均值拉到訓(xùn)練集整體均值附近。這個方法不改變細(xì)胞形態(tài)只是讓色彩中心回到模型熟悉的區(qū)間。如果你想省事也可以直接在數(shù)據(jù)增強(qiáng)里把hsv_s和hsv_v稍微調(diào)大一點讓模型見過更多色彩變化但增強(qiáng)幅度過大的話容易把細(xì)胞核細(xì)節(jié)整糊需要自己權(quán)衡。5. 從這套數(shù)據(jù)出發(fā)還能往哪個方向擴(kuò)5.1 半自動標(biāo)注用小模型輔助整理新數(shù)據(jù)1000張圖只能算起步真實場景里新涂片是一直在產(chǎn)生的。更好的方式是訓(xùn)練好baseline模型后用它去預(yù)測新采集的未標(biāo)注圖像把高置信度樣本直接加入對應(yīng)類別文件夾低置信度樣本送給人工打標(biāo)。這個過程可以循環(huán)迭代模型會越用越強(qiáng)。清洗時我再強(qiáng)調(diào)一遍加入的新樣本一定要檢查別讓某個錯誤標(biāo)簽悄悄溜進(jìn)去臟標(biāo)簽對分類模型的影響比缺少數(shù)據(jù)更致命。5.2 兩級分類替代單模型硬分類如果后來數(shù)據(jù)量擴(kuò)充到幾千張我的下一步是把現(xiàn)在的六類別單模型拆成兩級。第一級判斷“正常/異常”第二級只對異常細(xì)分成blast和特定異常類型。好處是減少類別之間的全排列干擾basophil這種數(shù)量少且形態(tài)特殊的類不會因為和正常細(xì)胞混在一起而被犧牲。更關(guān)鍵的是二級結(jié)構(gòu)在癌癥篩查里更方便解釋第一級是初篩第二級是定位具體可疑類型醫(yī)生看到的不再是一個冷冰冰的類別標(biāo)簽而是有層級的技術(shù)判斷鏈。訓(xùn)練好模型之后如果要做輕量化部署可以直接導(dǎo)出ONNX格式y(tǒng)olo export modelruns/classify/blood_cls/weights/best.pt formatonnx imgsz224導(dǎo)出后可以用ONNX Runtime或TensorRT加速推理單個細(xì)胞圖像的推理時間能壓到幾毫秒級別放到本地工具或邊緣設(shè)備上都沒有問題?;仡^來看這個項目最核心的部分不是預(yù)訓(xùn)練模型有多強(qiáng)而是把數(shù)據(jù)按YOLO11cls的分類范式歸置好再給每個訓(xùn)練參數(shù)找到合適的理由。我希望任何人拿到這套整理好的文件夾和訓(xùn)練腳本改個路徑就能跑通自己的第一版血細(xì)胞分類模型。不要急著去堆數(shù)據(jù)和網(wǎng)絡(luò)結(jié)構(gòu)先老老實實把目錄理順把增強(qiáng)關(guān)到合適位置把混淆矩陣看明白模型的真實水平一定對得起你花在數(shù)據(jù)上的時間。本文還有配套的精品資源點擊獲取