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