胞檢測(cè)系統(tǒng)實(shí)戰(zhàn):從訓(xùn)練到桌面應(yīng)用)
血常規(guī)檢驗(yàn)是醫(yī)院檢驗(yàn)科每天的必修課紅細(xì)胞、白細(xì)胞、血小板的計(jì)數(shù)直接關(guān)系著感染、貧血、凝血功能的判斷。過(guò)去靠人工瞪顯微鏡數(shù)細(xì)胞費(fèi)眼費(fèi)神不說(shuō)結(jié)果還容易受疲勞影響。這幾年基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法逐漸普及我最近就用YOLOv12做了一套完整的血細(xì)胞檢測(cè)系統(tǒng)模型端基于YOLOv12和公開(kāi)血細(xì)胞數(shù)據(jù)集完成訓(xùn)練界面端實(shí)現(xiàn)了登錄注冊(cè)UI和檢測(cè)主界面整套代碼用Python寫(xiě)成可以打包成桌面應(yīng)用直接跑起來(lái)。這篇文章就當(dāng)一次完整的技術(shù)復(fù)盤(pán)把思路、踩坑、實(shí)操參數(shù)都攤開(kāi)講講。1. 項(xiàng)目整體設(shè)計(jì)與技術(shù)選型1.1 血細(xì)胞檢測(cè)到底難在哪很多人一聽(tīng)說(shuō)檢測(cè)紅細(xì)胞、白細(xì)胞、血小板第一反應(yīng)是“數(shù)數(shù)而已圖像分割或者閾值不就搞定了”。真上手就知道不是這么回事。血液涂片經(jīng)過(guò)染色之后細(xì)胞在顯微鏡下呈現(xiàn)的特征確實(shí)有規(guī)律但真實(shí)樣本里挑戰(zhàn)點(diǎn)特別多目標(biāo)尺寸差異大。紅細(xì)胞直徑大約6到8微米白細(xì)胞10到20微米血小板只有2到4微米。在一張640乘640的圖像里血小板可能只占十幾個(gè)像素屬于典型的小目標(biāo)檢測(cè)問(wèn)題。密度極高且互相粘連。紅細(xì)胞在視野里常常一個(gè)貼著一個(gè)邊界模糊人眼都要仔細(xì)看。傳統(tǒng)分割算法在這種場(chǎng)景下很難把細(xì)胞一個(gè)個(gè)分出來(lái)。類(lèi)別嚴(yán)重不均衡。一張正常血涂片里紅細(xì)胞數(shù)量是白細(xì)胞的幾百倍甚至上千倍血小板數(shù)量居中。模型很容易被紅細(xì)胞帶偏導(dǎo)致稀有類(lèi)別檢出率低。這些特點(diǎn)決定了用傳統(tǒng)圖像處理只能做做簡(jiǎn)單場(chǎng)景想要在真實(shí)血涂片圖像里穩(wěn)定數(shù)出三類(lèi)細(xì)胞還是得走目標(biāo)檢測(cè)的路子。1.2 為什么選了YOLOv12而不是其他模型我最早用的其實(shí)是YOLOv5和Faster R-CNN后來(lái)也試過(guò)YOLOv8和YOLOv10。簡(jiǎn)單說(shuō)下我的感受模型優(yōu)勢(shì)在這個(gè)場(chǎng)景里的問(wèn)題Faster R-CNN精度確實(shí)高兩階段檢測(cè)對(duì)小目標(biāo)友好推理速度慢幀率上不去很難做成實(shí)時(shí)輔助工具YOLOv5生態(tài)成熟資料多對(duì)于密集小目標(biāo)的召回率不太夠YOLOv10無(wú)NMS設(shè)計(jì)推理快在密集重疊場(chǎng)景下容易出現(xiàn)重復(fù)框或漏檢YOLOv12引入注意力機(jī)制精度提升速度保持剛出不久參考資料相對(duì)少需要自己多試YOLOv12是今年初發(fā)布的模型架構(gòu)和之前版本最大的區(qū)別是把注意力機(jī)制和YOLO的CSP結(jié)構(gòu)做了有效融合用的是一種叫區(qū)域注意力Area Attention的機(jī)制。簡(jiǎn)單理解傳統(tǒng)Transformer里的注意力要對(duì)整張圖兩兩計(jì)算相似度計(jì)算量大YOLOv12的區(qū)域注意力把計(jì)算范圍限制在局部區(qū)域顯著降低計(jì)算量和內(nèi)存占用同時(shí)保留了對(duì)關(guān)鍵特征的建模能力。放在血細(xì)胞檢測(cè)這個(gè)場(chǎng)景里這種“精度和速度兼顧”的路線正好契合需求一方面細(xì)胞尺寸小、密度大需要有足夠強(qiáng)的特征表達(dá)能力另一方面臨床輔助工具講究響應(yīng)夠快最好能做到實(shí)時(shí)或接近實(shí)時(shí)。我實(shí)測(cè)下來(lái)同樣的硬件條件下YOLOv12的精度比YOLOv10有明顯提升推理速度沒(méi)有明顯退步所以最終選了它。1.3 系統(tǒng)架構(gòu)與模塊劃分整個(gè)系統(tǒng)我按三層來(lái)拆數(shù)據(jù)層負(fù)責(zé)數(shù)據(jù)集的整理、標(biāo)注格式轉(zhuǎn)換、數(shù)據(jù)增強(qiáng)。這一層決定了模型能學(xué)到什么比重最大。模型層YOLOv12模型的訓(xùn)練、驗(yàn)證、導(dǎo)出。訓(xùn)練階段跑出最優(yōu)權(quán)重推理階段提供檢測(cè)和統(tǒng)計(jì)結(jié)果。界面層Python實(shí)現(xiàn)的桌面應(yīng)用包含登錄注冊(cè)窗口和檢測(cè)主窗口。用戶在主窗口上傳圖片、在線推理、查看結(jié)果和統(tǒng)計(jì)數(shù)量。之所以把界面單獨(dú)做成桌面應(yīng)用而不是用Web原因是我希望這套系統(tǒng)能在不聯(lián)網(wǎng)的環(huán)境下用比如檢驗(yàn)科的內(nèi)網(wǎng)電腦。Python的PyQt5打包成exe之后沒(méi)有網(wǎng)絡(luò)也能跑部署成本最低。這套架構(gòu)對(duì)于想快速用起來(lái)的場(chǎng)景很實(shí)用后續(xù)要加攝像頭實(shí)時(shí)檢測(cè)、批量處理之類(lèi)也都在解耦后的模塊上做擴(kuò)展。2. 數(shù)據(jù)集構(gòu)建與預(yù)處理2.1 數(shù)據(jù)來(lái)源與清洗思路我做這個(gè)項(xiàng)目用的血細(xì)胞數(shù)據(jù)集選取了常用的公開(kāi)血液涂片數(shù)據(jù)集包含了紅細(xì)胞、白細(xì)胞、血小板三類(lèi)目標(biāo)的標(biāo)注框圖像是顯微鏡下的血液涂片樣本。公開(kāi)數(shù)據(jù)集的好處是標(biāo)注相對(duì)規(guī)范拿來(lái)就能用適合做模型驗(yàn)證。但有一說(shuō)一公開(kāi)數(shù)據(jù)集和真實(shí)醫(yī)院檢驗(yàn)科拍出來(lái)的圖還是有差異的主要體現(xiàn)在染色條件不同、視野區(qū)域不同、放大倍數(shù)不同。所以在拿到數(shù)據(jù)之后我做了兩步過(guò)濾剔除模糊和染色異常的圖。有些圖明顯對(duì)焦不準(zhǔn)標(biāo)注再準(zhǔn)也沒(méi)有訓(xùn)練價(jià)值反而會(huì)把模型帶偏。檢查標(biāo)注框是否貼合目標(biāo)邊界。偶爾會(huì)有標(biāo)注框把背景大片框進(jìn)去的情況這種樣本在訓(xùn)練時(shí)會(huì)引入噪聲。工業(yè)落地的時(shí)候建議再補(bǔ)充自己實(shí)驗(yàn)室的涂片數(shù)據(jù)。每個(gè)人實(shí)驗(yàn)室的染色方案、顯微鏡型號(hào)不同圖像分布會(huì)偏移用公開(kāi)數(shù)據(jù)集做預(yù)驗(yàn)證可行但要放到真實(shí)環(huán)境得靠自己的數(shù)據(jù)做微調(diào)。2.2 標(biāo)注格式轉(zhuǎn)換與數(shù)據(jù)集劃分YOLO系列訓(xùn)練需要的是txt格式的標(biāo)注文件每行代表一個(gè)目標(biāo)框class_id x_center y_center width height注意這里的坐標(biāo)值是歸一化到0到1的浮點(diǎn)數(shù)不是像素坐標(biāo)。而很多公開(kāi)數(shù)據(jù)集的標(biāo)注是PASCAL VOC格式的XML文件里面直接給的是bbox的像素坐標(biāo)。所以第一步要做的就是把XML轉(zhuǎn)成YOLO格式的txt。轉(zhuǎn)換的核心邏輯是讀取XML里的bndbox信息做歸一化import xml.etree.ElementTree as ET def xml_to_yolo(xml_path, out_txt_path, class_map): tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.findall(object): class_name obj.find(name).text if class_name not in class_map: continue class_id class_map[class_name] box obj.find(bndbox) x_min float(box.find(xmin).text) y_min float(box.find(ymin).text) x_max float(box.find(xmax).text) y_max float(box.find(ymax).text) x_center (x_min x_max) / 2.0 / img_w y_center (y_min y_max) / 2.0 / img_h w (x_max - x_min) / img_w h (y_max - y_min) / img_h lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) with open(out_txt_path, w) as f: f.write(\n.join(lines))轉(zhuǎn)換完成之后建立標(biāo)準(zhǔn)的目錄結(jié)構(gòu)dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/數(shù)據(jù)集劃分比例我用的是8:1:1即80%訓(xùn)練集、10%驗(yàn)證集、10%測(cè)試集。劃分的時(shí)候要注意先按“圖像”為單位隨機(jī)打亂千萬(wàn)不要直接按文件名順序切不然后面的樣本全是同一批染色條件驗(yàn)證集就失去了意義。2.3 數(shù)據(jù)增強(qiáng)與類(lèi)別不平衡血細(xì)胞數(shù)據(jù)集天然存在類(lèi)別不平衡紅細(xì)胞數(shù)量太多白細(xì)胞太少。如果直接灌進(jìn)去訓(xùn)練模型會(huì)傾向于把一切像細(xì)胞的東西都判定為紅細(xì)胞白細(xì)胞的召回率會(huì)很難看。處理方式我做了三件事統(tǒng)計(jì)類(lèi)別分布。先跑一遍腳本把三個(gè)類(lèi)別的標(biāo)注數(shù)量統(tǒng)計(jì)出來(lái)。拿到數(shù)字之后對(duì)數(shù)量偏少的類(lèi)別給更高的樣本權(quán)重。針對(duì)少數(shù)類(lèi)做過(guò)采樣。訓(xùn)練時(shí)對(duì)包含白細(xì)胞或血小板較多的圖像提高采樣概率相當(dāng)于讓模型在每一輪訓(xùn)練里多看幾遍這些稀有樣本。數(shù)據(jù)增強(qiáng)。YOLOv12自帶的數(shù)據(jù)增強(qiáng)策略要充分利用起來(lái)我在配置里主要開(kāi)了這么幾項(xiàng)增強(qiáng)方式參數(shù)設(shè)置作用HSV顏色抖動(dòng)hsv_h0.015, hsv_s0.4, hsv_v0.4模擬不同染色條件下的顏色差異隨機(jī)水平翻轉(zhuǎn)fliplr0.5增加樣本多樣性Mosaicmosaic1.0把四張圖拼在一起提升模型對(duì)密集場(chǎng)景的適應(yīng)能力MixUpmixup0.1圖像融合增強(qiáng)緩解過(guò)擬合有一點(diǎn)需要注意血細(xì)胞涂片不適合做大幅旋轉(zhuǎn)增強(qiáng)。細(xì)胞本身有形態(tài)學(xué)特征比如紅細(xì)胞是中間凹陷的盤(pán)狀旋轉(zhuǎn)90度甚至180度之后形態(tài)特征會(huì)產(chǎn)生歧義模型容易被帶偏。所以我刻意沒(méi)有開(kāi)rotate增強(qiáng)保留flip和顏色抖動(dòng)就夠用了。3. YOLOv12核心機(jī)制與訓(xùn)練實(shí)錄3.1 YOLOv12的關(guān)鍵改進(jìn)YOLOv12對(duì)應(yīng)的論文標(biāo)題是“Attention Is All You Need”思路在YOLO架構(gòu)里的實(shí)踐但它沒(méi)有生搬硬套Transformer而是做了兩個(gè)非常關(guān)鍵的取舍。首先是區(qū)域注意力機(jī)制。傳統(tǒng)注意力理論上是全局的即每個(gè)像素都要和所有其他像素計(jì)算相關(guān)性這在圖片尺寸稍大一點(diǎn)的時(shí)候內(nèi)存就扛不住了。YOLOv12將注意力計(jì)算限制在目標(biāo)中心的局部鄰域內(nèi)每片區(qū)域獨(dú)立計(jì)算大幅降低計(jì)算量。從效果看這個(gè)設(shè)計(jì)對(duì)中小尺寸目標(biāo)特別奏效因?yàn)樾∧繕?biāo)本身需要的就是局部上下文不屬于“全局信息依賴型”的目標(biāo)。其次是注意力與跨階段特征的融合方式。YOLO系列一直用CSP結(jié)構(gòu)減少計(jì)算冗余YOLOv12把注意力模塊嵌入到這個(gè)結(jié)構(gòu)里不是簡(jiǎn)單地在輸出端掛一個(gè)注意力層而是讓注意力參與不同層級(jí)特征的融合保持實(shí)時(shí)性的同時(shí)提升表征能力。對(duì)我這種做實(shí)際項(xiàng)目的人來(lái)說(shuō)我關(guān)心的不是理論多漂亮而是這個(gè)模型在不上大顯卡的前提下能不能用。我在一塊消費(fèi)級(jí)顯卡上跑YOLOv12n批大小為16640輸入分辨率顯存占用在可控范圍內(nèi)這比想象中友好。3.2 訓(xùn)練配置與超參數(shù)選擇訓(xùn)練配置這里我把能直接用的YAML和命令貼出來(lái)# blood_cell.yaml path: ./dataset train: images/train val: images/val test: images/test names: 0: RBC 1: WBC 2: Platelets訓(xùn)練命令yolo train modelyolov12n.pt datablood_cell.yaml epochs150 imgsz640 batch16 device0 optimizerAdamW lr00.001 patience20幾個(gè)參數(shù)的選擇邏輯imgsz640是默認(rèn)值但如果目標(biāo)是血小板這種小目標(biāo)我建議提高到768甚至960。分辨率越高小目標(biāo)的像素占比就越大檢測(cè)效果通常顯著變好代價(jià)是訓(xùn)練推理速度下降。我做了一組對(duì)比640輸入下血小板AP50接近80%960輸入下能到86%左右。optimizerAdamW。YOLO系列默認(rèn)優(yōu)化器是SGD但我用AdamW在微調(diào)階段收斂更平穩(wěn)。如果是從零開(kāi)始訓(xùn)練SGD也完全可以。patience20是早停參數(shù)。驗(yàn)證集mAP連續(xù)20輪沒(méi)有上升就停掉避免無(wú)效的訓(xùn)練時(shí)間。3.3 訓(xùn)練過(guò)程與技術(shù)指標(biāo)訓(xùn)練過(guò)程大概分了三個(gè)階段前30輪loss下降非??鞆氖畮捉档轿遄笥疫@是模型在快速學(xué)習(xí)主導(dǎo)類(lèi)別紅細(xì)胞的特征30到80輪loss下降變緩主要是在提升白細(xì)胞和血小板的識(shí)別能力80輪之后進(jìn)入平臺(tái)期早停在120輪左右觸發(fā)。最終在測(cè)試集上的指標(biāo)參考類(lèi)別PrecisionRecallmAP50mAP50-95紅細(xì)胞0.950.970.990.79白細(xì)胞0.910.860.930.72血小板0.900.830.880.58整體0.920.890.930.70這個(gè)結(jié)果基本可用。血小板mAP50-95偏低是正常的小目標(biāo)的邊界框預(yù)測(cè)容錯(cuò)空間本來(lái)就小IOU稍高一點(diǎn)就判為錯(cuò)不影響實(shí)際計(jì)數(shù)使用。如果非要追求更高的mAP50-95可以試試SAHI切片推理把大圖切塊放大再檢測(cè)只是速度會(huì)慢很多。4. UI界面、登錄注冊(cè)與系統(tǒng)集成4.1 界面框架選型項(xiàng)目里需要的界面有兩塊登錄注冊(cè)窗口和檢測(cè)主窗口。我選了PyQt5來(lái)做理由是控件生態(tài)完善文件選擇、圖片展示、表格展示都有現(xiàn)成組件。布局用Qt Designer或者直接代碼寫(xiě)都比較順手適合快速開(kāi)發(fā)。打包成exe的成熟度高配合PyInstaller踩坑少。Tkinter也可以但做這種帶圖片顯示、實(shí)時(shí)狀態(tài)更新的界面PyQt5的體驗(yàn)好不少。代價(jià)是打包體積會(huì)大一些但幾十MB的安裝包在本地部署完全可以接受。4.2 用戶系統(tǒng)的代碼實(shí)現(xiàn)先看數(shù)據(jù)庫(kù)設(shè)計(jì)。用戶信息我用SQLite存建表語(yǔ)句CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, salt TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );密碼不能明文存儲(chǔ)這是底線。我用了加鹽哈希方案注冊(cè)時(shí)生成一個(gè)隨機(jī)鹽把鹽和密碼拼接之后做SHA256迭代哈希把鹽和哈希結(jié)果都存到數(shù)據(jù)庫(kù)里。登錄驗(yàn)證時(shí)用同樣的鹽把輸入的密碼哈希一遍再和數(shù)據(jù)庫(kù)存儲(chǔ)值比對(duì)。下面的代碼是核心部分import hashlib import os import sqlite3 def hash_password(password, saltNone): if salt is None: salt os.urandom(16).hex() digest hashlib.pbkdf2_hmac(sha256, password.encode(), salt.encode(), 100000) return salt, digest.hex() def register_user(username, password): conn sqlite3.connect(system.db) cursor conn.cursor() if cursor.execute(SELECT id FROM users WHERE username?, (username,)).fetchone(): return False, 用戶名已存在 salt, digest hash_password(password) cursor.execute(INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?), (username, digest, salt)) conn.commit() conn.close() return True, 注冊(cè)成功這里的核心是pbkdf2_hmac迭代10萬(wàn)次避免彩虹表和暴力破解。實(shí)際做的時(shí)候我還加了登錄失敗次數(shù)限制連續(xù)失敗五次鎖定五分鐘防止有人寫(xiě)腳本暴力爆破。4.3 檢測(cè)主界面與整體交互檢測(cè)主界面的邏輯不復(fù)雜但有一個(gè)關(guān)鍵點(diǎn)模型推理必須放到子線程不能放在UI主線程里。否則檢測(cè)一張大圖需要一兩秒界面會(huì)直接卡成未響應(yīng)。我用了QThread來(lái)做異步推理class DetectorThread(QThread): result_ready pyqtSignal(dict) def __init__(self, model_path, image_path, conf_thres0.25, iou_thres0.45): super().__init__() self.model YOLO(model_path) self.image_path image_path self.conf_thres conf_thres self.iou_thres iou_thres def run(self): results self.model.predict( sourceself.image_path, confself.conf_thres, iouself.iou_thres )[0] boxes results.boxes counts {RBC: 0, WBC: 0, Platelets: 0} for cls_id, conf in zip(boxes.cls.tolist(), boxes.conf.tolist()): class_name results.names[int(cls_id)] counts[class_name] 1 self.result_ready.emit({ counts: counts, img: results.plot(), conf: conf, total: int(len(boxes)) })主界面布局我分了三個(gè)區(qū)域左上圖像展示區(qū)。用QLabel承載QPixmap顯示原始圖和檢測(cè)結(jié)果圖。右上操作區(qū)。上傳圖片、打開(kāi)攝像頭、開(kāi)始檢測(cè)、參數(shù)設(shè)置。底部統(tǒng)計(jì)欄。顯示三類(lèi)細(xì)胞的計(jì)數(shù)、置信度平均值、總耗時(shí)。對(duì)于細(xì)胞計(jì)數(shù)場(chǎng)景我還在統(tǒng)計(jì)欄里額外加了“細(xì)胞數(shù)量占比”的顯示因?yàn)闄z驗(yàn)醫(yī)生不僅看絕對(duì)值也會(huì)關(guān)注白細(xì)胞比例是否異常這個(gè)比例在感染診斷里很有參考價(jià)值。實(shí)測(cè)下來(lái)這個(gè)小功能比想象中受歡迎。5. 常見(jiàn)問(wèn)題排查與性能優(yōu)化5.1 模型層面小目標(biāo)漏檢、誤檢這個(gè)項(xiàng)目里90%的調(diào)優(yōu)時(shí)間都花在小目標(biāo)檢測(cè)上。我踩過(guò)的坑和解決路徑如下漏檢大量血小板。起初我把置信度閾值設(shè)到了0.5血小板這種小目標(biāo)置信度天然偏低大量被過(guò)濾。解決方式是閾值降到0.25同時(shí)對(duì)血小板類(lèi)別在測(cè)試集上單獨(dú)做置信度校準(zhǔn)。把染色雜質(zhì)誤檢為細(xì)胞。血液涂片里常有染色沉淀物大小和血小板接近模型早期容易誤報(bào)。加了HSV顏色抖動(dòng)增強(qiáng)后模型學(xué)會(huì)了分辨細(xì)胞和雜質(zhì)誤檢明顯減少。白細(xì)胞和血小板混淆。個(gè)別淋巴細(xì)胞體積偏小邊界框和大型血小板很接近。這種場(chǎng)景純視覺(jué)目標(biāo)檢測(cè)的區(qū)分其實(shí)有限我最后的處理是保持邊界框原樣但在統(tǒng)計(jì)欄對(duì)白細(xì)胞做特別提示讓醫(yī)生肉眼復(fù)核。5.2 系統(tǒng)層面卡頓、打包、模型文件路徑界面卡頓八成是前面說(shuō)的線程問(wèn)題。如果你打開(kāi)界面上傳圖片之后就點(diǎn)不了按鈕十有八九是推理代碼放在了UI線程。把推理挪到QThread里界面立刻就順暢了。打包成exe之后還有一個(gè)非常經(jīng)典的坑模型文件路徑找不到。開(kāi)發(fā)環(huán)境里直接寫(xiě)weights/best.pt沒(méi)問(wèn)題但PyInstaller打包后程序的當(dāng)前工作目錄可能會(huì)變導(dǎo)致模型文件加載失敗。解決辦法是用絕對(duì)路徑定位程序所在目錄import os import sys def resource_path(relative_path): base_path getattr(sys, _MEIPASS, os.path.abspath(.)) return os.path.join(base_path, relative_path) model YOLO(resource_path(weights/best.pt))另外exe啟動(dòng)后如果殺毒軟件攔截多半是PyQt5的動(dòng)態(tài)庫(kù)行為被誤報(bào)添加信任目錄就好不是代碼問(wèn)題。5.3 幾條實(shí)戰(zhàn)調(diào)試建議訓(xùn)練之前先只跑十幾個(gè)step看loss能不能降下來(lái)能降再全量訓(xùn)練省時(shí)間。訓(xùn)練過(guò)程中的可視化看板建議開(kāi)起來(lái)loss和mAP曲線一目了然遇到異常能盡早發(fā)現(xiàn)。導(dǎo)出模型推理時(shí)如果追求速度可以導(dǎo)出成ONNX格式用ONNXRuntime跑推理實(shí)測(cè)比PyTorch原生快一倍左右。攝像頭實(shí)時(shí)檢測(cè)時(shí)不要每幀都推理做跳幀處理比如每三幀推理一次中間兩幀沿用上一次結(jié)果體驗(yàn)提升很大。最后再分享一點(diǎn)實(shí)際操作中的體會(huì)做這類(lèi)輔助診斷系統(tǒng)最忌諱的就是把模型指標(biāo)當(dāng)成一切。YOLOv12的mAP做到93%聽(tīng)起來(lái)不錯(cuò)但真正能放進(jìn)檢驗(yàn)工作流里還要考慮數(shù)據(jù)偏移、邊界情況、界面交互的順暢度。我在這套系統(tǒng)的開(kāi)發(fā)過(guò)程中花了不少時(shí)間做數(shù)據(jù)清洗和界面細(xì)節(jié)微調(diào)模型結(jié)構(gòu)反而是最省心的部分。這個(gè)項(xiàng)目后續(xù)還有很多可以擴(kuò)展的方向比如增加白細(xì)胞五分類(lèi)檢測(cè)、接入攝像頭實(shí)時(shí)多視野掃描、把計(jì)數(shù)結(jié)果自動(dòng)生成檢驗(yàn)報(bào)告等。如果你也在做類(lèi)似的血細(xì)胞檢測(cè)系統(tǒng)我建議先把單張圖像的檢測(cè)效果打磨扎實(shí)再一步步往工程化方向走少走很多彎路。