顯微鏡:自動(dòng)識(shí)別目標(biāo)區(qū)域的完整工程實(shí)踐)
1. 這一講解決什么問題顯微鏡觀察這件事干過的人都有體會(huì)真正費(fèi)時(shí)間的不是調(diào)焦而是“找東西”。一張全切片掃描圖動(dòng)輒上萬個(gè)視野你得逐個(gè)看過去找到那幾個(gè)有異常的、有價(jià)值的區(qū)域。如果是做藥物篩選一天要看幾千個(gè)孔板每板幾百個(gè)視野靠人眼一個(gè)個(gè)過看到最后眼睛都是花的而且漏檢率根本不低。“AI 增強(qiáng)顯微鏡”這個(gè)系列走到第 6 講前面我們已經(jīng)聊過圖像增強(qiáng)、細(xì)胞分割、特征提取這些基礎(chǔ)能力這一講講的是串聯(lián)起整個(gè)流程的關(guān)鍵一步自動(dòng)識(shí)別目標(biāo)區(qū)域。說白了就是讓模型幫你判斷“這塊視野里有值得進(jìn)一步分析的內(nèi)容”然后把鏡臺(tái)自動(dòng)挪過去、把圖像自動(dòng)存下來或者把目標(biāo)區(qū)域直接裁出來進(jìn)入下游分析。這里說的“目標(biāo)區(qū)域”在不同實(shí)驗(yàn)場(chǎng)景下含義不太一樣??赡苁墙M織切片上的腫瘤區(qū)域可能是培養(yǎng)皿里的克隆團(tuán)可能是熒光圖像里某個(gè)通道的信號(hào)富集區(qū)也可能是劃痕實(shí)驗(yàn)里的無細(xì)胞區(qū)域邊界。但不管哪種場(chǎng)景本質(zhì)都是同一件事把“需要關(guān)注”的區(qū)域和“不需要關(guān)注”的背景區(qū)分開。適合看這一講的人我默認(rèn)你已經(jīng)跑通過前面幾講的流程至少對(duì) Python、OpenCV、PyTorch 有基本概念。如果只是聽說過深度學(xué)習(xí)想上手也沒關(guān)系這一講我會(huì)把從數(shù)據(jù)準(zhǔn)備到模型部署的完整鏈路拆開講每一步都給出可以直接抄作業(yè)的配置和參數(shù)你照著做就能跑通一個(gè)最小可用的自動(dòng)目標(biāo)識(shí)別系統(tǒng)。2. 整體技術(shù)路線怎么選2.1 先想清楚你要的是“框”還是“輪廓”自動(dòng)識(shí)別目標(biāo)區(qū)域業(yè)界有兩套成熟的技術(shù)路線目標(biāo)檢測(cè)和目標(biāo)分割。目標(biāo)檢測(cè)輸出的是矩形框告訴你在圖像的哪個(gè)位置有一個(gè)目標(biāo)框的大概范圍是多少。目標(biāo)分割輸出的是像素級(jí)的掩膜每一個(gè)像素都被分類成“目標(biāo)”或“背景”輸出的是一個(gè)和原圖等大的二值圖或彩色圖。很多第一次做這個(gè)的人上來就糾結(jié)選哪個(gè)其實(shí)判斷標(biāo)準(zhǔn)很簡(jiǎn)單你要拿這個(gè)結(jié)果去干什么。如果下游只是機(jī)械地把鏡臺(tái)移過去、把該區(qū)域圖像采集回來那檢測(cè)框就完全夠用沒有必要做分割——分割模型的訓(xùn)練成本、推理耗時(shí)都明顯高于檢測(cè)模型而且標(biāo)注工作量也大不少。但如果你的下游是要定量分析目標(biāo)區(qū)域的面積、形態(tài)、周長(zhǎng)或者要精確統(tǒng)計(jì)目標(biāo)區(qū)域內(nèi)的細(xì)胞數(shù)目那必須走分割路線因?yàn)榫匦慰蛞欢〞?huì)帶背景一算面積就偏了。我自己的經(jīng)驗(yàn)是第一次迭代盡量先用檢測(cè)模型跑通流程哪怕最后需要分割也可以先用檢測(cè)框把區(qū)域裁出來再在框內(nèi)做分割。這樣整個(gè)流水線的穩(wěn)定性高很多因?yàn)闄z測(cè)模型在顯微鏡圖像上的魯棒性通常比分割模型好訓(xùn)練一些尤其是標(biāo)注數(shù)據(jù)有限的時(shí)候。2.2 顯微鏡圖像和自然圖像不一樣別直接套通用方案這是新手最容易踩的坑。拿一張細(xì)胞的明場(chǎng)圖像去訓(xùn)練一個(gè)在自然圖像上表現(xiàn)很好的檢測(cè)模型經(jīng)常會(huì)發(fā)現(xiàn)結(jié)果一塌糊涂這不是模型的問題是數(shù)據(jù)分布差異太大。顯微鏡圖像有幾個(gè)顯著特點(diǎn)第一背景和目標(biāo)的對(duì)比度經(jīng)常很差。尤其是明場(chǎng)圖像細(xì)胞邊緣是半透明的和背景的灰度差異很可能只有十幾個(gè)灰度級(jí)肉眼看著還行模型提取特征就很吃力。這時(shí)候可能需要先做預(yù)處理增強(qiáng)或者選擇對(duì)邊緣特征更敏感的模型結(jié)構(gòu)。第二目標(biāo)尺度變化范圍極廣。一個(gè) 40 倍物鏡下的細(xì)胞大約占幾十個(gè)像素但一個(gè)組織的壞死區(qū)域可能占據(jù)整張圖像的三分之一。模型如果只有一個(gè)尺度的特征輸出肯定顧此失彼。所以選模型時(shí)要注意有沒有多尺度特征融合機(jī)制像 FPN 這種結(jié)構(gòu)在做顯微圖像時(shí)效果普遍比單尺度輸出好。第三標(biāo)注噪聲問題嚴(yán)重。顯微鏡圖像的標(biāo)注比自然圖像難得多邊界不清晰、細(xì)胞粘連、組織折疊很多地方的標(biāo)注本身就是模糊的。這導(dǎo)致同一個(gè)數(shù)據(jù)集不同人標(biāo)的結(jié)果差異很大。后面我會(huì)專門講怎么處理這個(gè)問題。第四圖像尺寸通常很大。一張全切片掃描圖動(dòng)輒 5 萬乘 5 萬像素直接整張塞進(jìn)模型根本不可能。必須做裁剪patch處理而裁剪又會(huì)帶來邊界目標(biāo)被切斷的問題這需要在后處理時(shí)做特殊設(shè)計(jì)。2.3 模型選型的實(shí)用建議基于以上特點(diǎn)我的選型建議分三檔如果標(biāo)注數(shù)據(jù)很少比如只有幾十張優(yōu)先考慮輕量檢測(cè)模型。這類模型結(jié)構(gòu)簡(jiǎn)單、參數(shù)少不容易過擬合推理速度快跑 CPU 都能實(shí)時(shí)。典型結(jié)構(gòu)比如 SSD 風(fēng)格的模型在顯微鏡這類背景相對(duì)單一的場(chǎng)景下效果通常不差。如果數(shù)據(jù)量中等幾百?gòu)堃陨蟽?yōu)先選擇帶特征金字塔的兩階段檢測(cè)器。兩階段的意思是先產(chǎn)生候選區(qū)域、再對(duì)候選區(qū)域進(jìn)行分類和回歸精度更高加上特征金字塔處理后對(duì)多尺度目標(biāo)比較友好。這類模型稍微重一些但訓(xùn)練只要一張中端 GPU 就能跑動(dòng)。如果確定要分割首選 U-Net 系結(jié)構(gòu)。這是醫(yī)學(xué)圖像和顯微圖像分割的事實(shí)標(biāo)準(zhǔn)編碼器-解碼器結(jié)構(gòu)加跳躍連接對(duì)小目標(biāo)、弱邊界的表達(dá)能力非常強(qiáng)。它的最大好處是對(duì)訓(xùn)練數(shù)據(jù)量的要求比 Transformer 系結(jié)構(gòu)低得多而且用預(yù)訓(xùn)練編碼器比如 ResNet34 作 backbone效果會(huì)很穩(wěn)。提示不要為了追新模型而選大結(jié)構(gòu)。顯微圖像識(shí)別這個(gè)場(chǎng)景標(biāo)注成本遠(yuǎn)大于算力成本選一個(gè)數(shù)據(jù)效率高的模型比選一個(gè)理論精度高但需要海量數(shù)據(jù)的模型要實(shí)際得多。3. 數(shù)據(jù)準(zhǔn)備和標(biāo)注實(shí)操3.1 顯微圖像的采集與整理建模第一步不是寫代碼而是把數(shù)據(jù)管好。顯微圖像的采集有幾個(gè)硬性要求同一批實(shí)驗(yàn)的圖像盡量保持相同的采集參數(shù)。物鏡倍數(shù)、相機(jī)曝光、光源強(qiáng)度都盡量統(tǒng)一因?yàn)槟P蛯W(xué)的是“在這個(gè)成像條件下目標(biāo)長(zhǎng)什么樣”如果你把 4 倍物鏡和 40 倍物鏡的圖像混在一起訓(xùn)練模型會(huì)非常困惑。圖像格式建議先統(tǒng)一轉(zhuǎn)成 8 位灰度或 RGB存儲(chǔ)為 PNG 無損格式。不要直接拿原始格式的文件訓(xùn)練不同廠家顯微鏡輸出的原始格式千差萬別有的還帶額外的元數(shù)據(jù)層統(tǒng)一的預(yù)處理步驟應(yīng)該放在數(shù)據(jù)入庫(kù)階段而不是訓(xùn)練階段。數(shù)據(jù)劃分上我強(qiáng)烈建議按實(shí)驗(yàn)批次劃分訓(xùn)練集、驗(yàn)證集、測(cè)試集而不是按圖像隨機(jī)劃分。因?yàn)橥粋€(gè)孔板、同一張切片的不同視野之間高度相關(guān)如果隨機(jī)劃分模型實(shí)際上在驗(yàn)證集上“見過”了訓(xùn)練數(shù)據(jù)的近親指標(biāo)會(huì)虛高。按批次劃分才能反映真實(shí)場(chǎng)景下的泛化能力。每個(gè)類別的目標(biāo)數(shù)量要做到基本均衡。如果你的目標(biāo)是識(shí)別兩種區(qū)域而其中一種只占了 5%模型大概率會(huì)無視它。這種情況要么多采集一些少數(shù)類的樣本要么在損失函數(shù)里給少數(shù)類加權(quán)重。3.2 標(biāo)注工具與標(biāo)注規(guī)范標(biāo)注工具的選擇我試過幾個(gè)方案直接用開源標(biāo)注工具這個(gè)免費(fèi)社區(qū)也活躍界面簡(jiǎn)單能導(dǎo)出 COCO 格式、Pascal VOC 格式的標(biāo)注文件。也可以考慮直接用 Python 腳本畫框的半自動(dòng)標(biāo)注方式適合批量給規(guī)則形狀目標(biāo)打標(biāo)比如熒光點(diǎn)、克隆團(tuán)這類接近圓形或橢圓形的目標(biāo)。但工具只是手段標(biāo)注規(guī)范才是決定模型上限的關(guān)鍵。我歸納了三條顯微圖像標(biāo)注的硬性規(guī)范這都是踩過坑之后總結(jié)的第一標(biāo)注邊界含混時(shí)定一個(gè)可復(fù)現(xiàn)的標(biāo)準(zhǔn)。比如明場(chǎng)圖像里細(xì)胞邊界模糊就規(guī)定“以最外層可見膜輪廓為準(zhǔn)”不要有時(shí)標(biāo)緊有時(shí)標(biāo)松。這個(gè)標(biāo)準(zhǔn)要寫成文檔發(fā)給所有參與標(biāo)注的人。第二小目標(biāo)不要略過。很多標(biāo)注者在標(biāo)注密集小目標(biāo)時(shí)會(huì)嫌麻煩而漏標(biāo)這會(huì)讓模型學(xué)出“漏掉小目標(biāo)也沒關(guān)系”的錯(cuò)誤傾向。建議采用 100% 標(biāo)注策略要么這塊區(qū)域全部標(biāo)要么這塊區(qū)域完全不要最怕的就是“標(biāo)一半漏一半”。第三背景也要多樣化。模型不僅要知道目標(biāo)長(zhǎng)什么樣還要知道背景長(zhǎng)什么樣。如果所有樣本都是干凈整潔的背景模型一遇到氣泡、雜質(zhì)、厚薄不均的區(qū)域就會(huì)把背景當(dāng)成目標(biāo)。專門抽一些有瑕疵的圖像標(biāo)注為空?qǐng)D沒有目標(biāo)對(duì)降低誤檢很有幫助。3.3 數(shù)據(jù)增強(qiáng)的顯微鏡專屬策略通用增強(qiáng)方法大家都很熟悉隨機(jī)翻轉(zhuǎn)、旋轉(zhuǎn) 90 度、隨機(jī)裁剪、亮度抖動(dòng)。但針對(duì)顯微圖像我額外建議幾招一是彈性形變。這聽起來奇怪但對(duì)細(xì)胞和組織這類柔性目標(biāo)非常有效。細(xì)胞在樣本制備時(shí)本來就有各種形態(tài)變化微小的彈性形變相當(dāng)于擴(kuò)充了形態(tài)多樣性。前面說過的 U-Net 類分割模型配合彈性形變?cè)鰪?qiáng)泛化能力會(huì)明顯提升。二是模擬焦距偏移。顯微圖像常因自動(dòng)對(duì)焦不準(zhǔn)出現(xiàn)輕微模糊訓(xùn)練時(shí)隨機(jī)對(duì)圖像做小半徑高斯模糊能增強(qiáng)模型對(duì)失焦圖像的容忍度。三是局部對(duì)比度自適應(yīng)。用 CLAHE 方法對(duì)圖像做局部直方圖均衡化再隨機(jī)混入訓(xùn)練集可以模擬不同光照條件下的成像效果對(duì)于明場(chǎng)圖像尤其有效。注意彈性形變的增強(qiáng)系數(shù)不要太大否則會(huì)讓邊界形態(tài)嚴(yán)重扭曲模型會(huì)學(xué)到不真實(shí)的形態(tài)特征。我的經(jīng)驗(yàn)是變形幅度控制在 5 個(gè)像素以內(nèi)頻率可以高一些但幅度必須保守。4. 模型訓(xùn)練與調(diào)參要點(diǎn)4.1 訓(xùn)練策略從預(yù)訓(xùn)練模型開始但要凍對(duì)層顯微圖像數(shù)據(jù)和 ImageNet 自然圖像差異很大但預(yù)訓(xùn)練模型仍然有用——它學(xué)到的低級(jí)特征邊緣、紋理、角點(diǎn)是通用的。我見過太多人有兩個(gè)極端要么完全從零訓(xùn)練收斂又慢效果又差要么全量微調(diào)預(yù)訓(xùn)練模型結(jié)果因?yàn)轱@微圖像和自然圖像差異太大底層的卷積核被大幅改動(dòng)反而丟失了有用的通用特征。推薦做法分三步第一步加載預(yù)訓(xùn)練權(quán)重凍結(jié) backbone 的所有層只訓(xùn)練檢測(cè)頭或分割頭。這時(shí)候用較小的學(xué)習(xí)率跑幾個(gè) epoch看損失能不能降到合理水平。第二步解凍 backbone 的后半部分比如最后兩個(gè) stage用更小的學(xué)習(xí)率訓(xùn)練。前半部分保持凍結(jié)保留通用特征提取能力。第三步如果數(shù)據(jù)量充足再解凍全部層用最低的學(xué)習(xí)率精調(diào)。這套“漸進(jìn)解凍”策略在幾個(gè)顯微圖像項(xiàng)目上效果都很穩(wěn)定比全量微調(diào)普遍能提升幾個(gè)點(diǎn)的準(zhǔn)確率而且收斂速度更快。4.2 關(guān)鍵參數(shù)與訓(xùn)練配置關(guān)于訓(xùn)練參數(shù)我直接給一套經(jīng)過多個(gè)項(xiàng)目驗(yàn)證的默認(rèn)配置大家可以根據(jù)自己的數(shù)據(jù)量微調(diào)參數(shù)推薦值說明輸入尺寸512×512 或 640×640顯微圖像目標(biāo)通常不大不必用過大輸入批大小8~16顯存不夠就減小不建議用梯度累積替代顯微圖像背景相對(duì)均勻小batch也能穩(wěn)定訓(xùn)練初始學(xué)習(xí)率1e-4凍結(jié)階段/ 1e-5解凍階段使用余弦退火調(diào)度很有效優(yōu)化器AdamWweight decay 1e-4比 SGD 收斂更穩(wěn)對(duì)顯微數(shù)據(jù)更友好訓(xùn)練輪數(shù)50~80 epoch配合早停機(jī)制看驗(yàn)證集指標(biāo)數(shù)據(jù)加載用 DALI 或純 PyTorch DataLoader 都行但要開 num_workers0否則 GPU 利用率會(huì)非常難看其中輸入尺寸這個(gè)參數(shù)最需要說兩句。很多人習(xí)慣把顯微圖像做大輸入覺得信息保留多但實(shí)際訓(xùn)練中小目標(biāo)在縮小后容易丟失反而建議在輸入尺寸和模型結(jié)構(gòu)間找平衡。我一般先看目標(biāo)占原圖的像素比例如果目標(biāo)是 50×50 像素左右輸入 512 就夠了如果目標(biāo)只有 20×20那輸入尺寸至少要做到 768。還有一個(gè)非常實(shí)用的技巧推理時(shí)用 TTA測(cè)試時(shí)增強(qiáng)。把每張圖像做水平和垂直翻轉(zhuǎn)分別推理然后把結(jié)果框或掩膜融合回去。能穩(wěn)定提升兩到三個(gè)點(diǎn)的檢測(cè)精度代價(jià)只是推理時(shí)間翻倍。對(duì)于離線批量分析場(chǎng)景這個(gè)性價(jià)比極高。4.3 怎么判斷模型真的可以用了訓(xùn)練過程中很多人只盯著 loss 曲線但 loss 降到很低并不代表目標(biāo)識(shí)別效果好。我做顯微圖像項(xiàng)目時(shí)主要看三個(gè)指標(biāo)第一驗(yàn)證集上的 mAP平均精度均值。這個(gè)指標(biāo)反映整體檢測(cè)精度但在顯微圖像上有個(gè)問題小目標(biāo)稍微位移幾個(gè)像素IoU 就會(huì)掉很多導(dǎo)致 mAP 被低估。所以我通常會(huì)同時(shí)看 mAP 和 mAPIoU0.5原 mAP50后者對(duì)位置敏感性較低更能反映“檢出沒檢出”這個(gè)實(shí)際需求。第二每類目標(biāo)的召回率。對(duì)于目標(biāo)識(shí)別任務(wù)漏檢往往比誤檢更危險(xiǎn)——在顯微鏡場(chǎng)景里漏掉一個(gè)有價(jià)值的視野區(qū)域意味著那個(gè)樣本永遠(yuǎn)不會(huì)被進(jìn)一步分析。所以我會(huì)重點(diǎn)關(guān)注困難類別的召回率如果某個(gè)小目標(biāo)類別的召回率低于 0.8我會(huì)優(yōu)先去補(bǔ)充該類別的訓(xùn)練數(shù)據(jù)而不是糾結(jié)大類的精度。第三人工目檢。這個(gè)聽起來不科學(xué)但非常必要。抽 100 張測(cè)試圖像把檢測(cè)結(jié)果畫出來一張一張看。模型的很多失敗模式是指標(biāo)看不到的比如系統(tǒng)性地在圖像邊緣漏檢因?yàn)椴眉魜G失了上下文、在某個(gè)特定染色區(qū)域誤檢因?yàn)闃颖局苽涞膫斡?。這些只有人眼看才能發(fā)現(xiàn)。5. 推理部署與結(jié)果后處理5.1 推理流程與滑動(dòng)窗口策略模型訓(xùn)練好了接下來的問題是顯微鏡圖像那么大怎么跑推理答案就是滑動(dòng)窗口sliding window。把大圖切成有重疊的 patch逐塊推理再合并結(jié)果。窗口大小我建議和訓(xùn)練輸入尺寸一致或略小一點(diǎn)重疊率取 20% 到 40%。重疊的目的是避免目標(biāo)恰好被窗口邊界切斷。切邊時(shí)如果目標(biāo)有一半在窗口內(nèi)、一半在窗外窗口內(nèi)的部分可能仍然能被檢出但因?yàn)樯舷挛男畔⑷笔е眯哦韧ǔF?。重疊率也不是越高越好。我實(shí)測(cè)過不同重疊率的效果20% 重疊基本夠用如果目標(biāo)形態(tài)復(fù)雜、上下文依賴強(qiáng)提到 30% 有明顯提升再往上到 50%效果提升微乎其微推理時(shí)間卻翻倍。核驗(yàn)一張 2 萬乘 2 萬像素的切片用 512 窗口加 20% 重疊大約需要跑 2500 次推理在單張中端 GPU 上大約需要 5 到 10 分鐘。這個(gè)速度在離線分析場(chǎng)景可以接受但如果你是想要實(shí)時(shí)輔助觀察就得換方案了。5.2 合并重疊檢測(cè)結(jié)果滑動(dòng)窗口推理后同一個(gè)目標(biāo)很可能出現(xiàn)在相鄰窗口里產(chǎn)生了多個(gè)重復(fù)的檢測(cè)框。標(biāo)準(zhǔn)做法是用 NMS非極大值抑制去掉重復(fù)框。但直接套默認(rèn)的 NMS 參數(shù)在顯微圖像上可能出問題細(xì)胞密集區(qū)域里NMS 的 IoU 閾值設(shè)得太高會(huì)漏掉緊挨著的真實(shí)目標(biāo)設(shè)得太低又會(huì)讓重疊框無法合并。我的經(jīng)驗(yàn)是先用 NMS 去掉重復(fù)框但如果檢測(cè)框非常密集改用一個(gè)更柔和的方案把所有高置信度檢測(cè)框的坐標(biāo)做平均合并成一個(gè)框如果兩框的中心點(diǎn)距離小于一個(gè)目標(biāo)直徑就認(rèn)為是同一個(gè)目標(biāo)。這個(gè)方案對(duì)密集目標(biāo)更寬容要根據(jù)目標(biāo)大小設(shè)置合并距離閾值。對(duì)于分割模型合并就簡(jiǎn)單得多把每個(gè)窗口輸出的概率圖拼到大圖上重疊區(qū)域的概率直接取平均。這樣做比較平滑不會(huì)在窗口邊界出現(xiàn)跳變。拼完后對(duì)整張概率圖做閾值化閾值一般取 0.3 到 0.5需要根據(jù)驗(yàn)證集調(diào)再找連通域就能得到目標(biāo)區(qū)域的完整掩膜。5.3 處理“目標(biāo)被切在邊緣”的問題滑動(dòng)窗口最討厭的問題就是大目標(biāo)被窗口邊界切成兩半。檢測(cè)模型的框輸出不了“半個(gè)目標(biāo)”于是要么漏檢要么輸出一個(gè)被截?cái)嗟募倏?。一個(gè)實(shí)用的方案是改進(jìn)窗口的分割方法。窗口滑動(dòng)時(shí)除了按網(wǎng)格切還要保證每個(gè)位置都在多個(gè)不同偏移的窗口中出現(xiàn)過。更簡(jiǎn)單的方案是推理時(shí)把窗口擴(kuò)大 10% 到 20% 作為上下文context模型只輸出擴(kuò)大前中心區(qū)域的檢測(cè)結(jié)果這樣每個(gè)目標(biāo)都能看到周邊上下文信息漏檢率會(huì)明顯下降。實(shí)現(xiàn)這個(gè)方案的代價(jià)是推理次數(shù)不變但每次推理的有效區(qū)域變了整體計(jì)算量會(huì)大一些。不過對(duì)比漏檢造成的后果這個(gè)代價(jià)我覺得完全值得。5.4 結(jié)果可視化與反饋閉環(huán)拿到識(shí)別結(jié)果后最簡(jiǎn)單的驗(yàn)證方式是把檢測(cè)框和掩膜疊加到原圖上輸出成 PDF 或大圖保存。這一步看起來簡(jiǎn)單但有一個(gè)細(xì)節(jié)很多人忽略疊加圖要保留原圖的灰度信息不要把原圖變成純黑背景否則沒法判斷模型是不是靠背景紋理做的錯(cuò)誤識(shí)別。更進(jìn)一步如果這套系統(tǒng)要長(zhǎng)期使用我建議把每張測(cè)試圖像的預(yù)測(cè)置信度分布記錄下來。一旦置信度整體漂移說明輸入圖像分布和訓(xùn)練數(shù)據(jù)出現(xiàn)了偏差比如更換了顯微鏡、調(diào)整了光圈這時(shí)候就需要重新評(píng)估模型或者補(bǔ)充訓(xùn)練數(shù)據(jù)。這也算是一種簡(jiǎn)單的數(shù)據(jù)漂移監(jiān)控機(jī)制。6. 實(shí)際踩坑與排查技巧6.1 常見問題速查表現(xiàn)象可能原因排查方法解決方案模型把所有目標(biāo)都檢測(cè)成一個(gè)大框訓(xùn)練數(shù)據(jù)里密集目標(biāo)的標(biāo)注框嚴(yán)重重疊檢查標(biāo)注框的 IoU 分布嚴(yán)格按規(guī)范標(biāo)注訓(xùn)練時(shí)調(diào)低 NMS 閾值背景區(qū)域大量誤報(bào)訓(xùn)練集背景單一沒有偽影樣本統(tǒng)計(jì)誤報(bào)位置是否集中在特定區(qū)域收集含氣泡、雜質(zhì)的空?qǐng)D加入訓(xùn)練集小目標(biāo)全部漏檢模型下采樣倍數(shù)過大小目標(biāo)特征丟失檢查 backbone 的下采樣倍數(shù)與目標(biāo)像素比增大輸入尺寸或使用更高分辨率的特征圖失焦圖像效果驟降訓(xùn)練集都是清晰對(duì)焦的圖像測(cè)試集加入高斯模糊驗(yàn)證訓(xùn)練時(shí)加入隨機(jī)高斯模糊增強(qiáng)驗(yàn)證集指標(biāo)好、新數(shù)據(jù)很差訓(xùn)練/驗(yàn)證劃分方式不當(dāng)檢查是否跨批次劃分改為按實(shí)驗(yàn)批次劃分?jǐn)?shù)據(jù)集推理速度過慢滑動(dòng)窗口重疊率太高或輸入尺寸過大統(tǒng)計(jì)單張推理耗時(shí)占比調(diào)低重疊率或換更輕量的模型結(jié)構(gòu)分割掩膜邊緣破碎窗口拼接時(shí)概率圖直接硬裁查看窗口邊界處掩膜是否呈鋸齒狀重疊區(qū)域概率取加權(quán)平均擴(kuò)大上下文6.2 一個(gè)真實(shí)排查案例的過程有次我在做某跨平臺(tái)系統(tǒng)的目標(biāo)識(shí)別模塊時(shí)訓(xùn)練出來的模型在測(cè)試集上 mAP 有 0.89看起來很漂亮但實(shí)際拿到顯微鏡上跑發(fā)現(xiàn)凡是視野邊緣有雜質(zhì)氣泡的區(qū)域模型就會(huì)在氣泡邊緣畫一個(gè)框還帶著很高的置信度。這個(gè)問題的排查思路分享一下。我沒有急著加數(shù)據(jù)而是先取了 20 張誤檢圖像把所有檢測(cè)框畫出來觀察它們的共性。很快就發(fā)現(xiàn)所有誤檢框的邊緣都有一條特別亮的弧線——這是氣泡折射光線的特征。而訓(xùn)練數(shù)據(jù)里正好沒有氣泡圖像模型學(xué)到的其實(shí)是“有亮弧線就是目標(biāo)”。解決方案分兩步第一步人工篩選了約 30 張含氣泡但不含目標(biāo)的圖像加入訓(xùn)練集標(biāo)記為空?qǐng)D第二步在增強(qiáng)流程里加了隨機(jī)光照擾動(dòng)讓模型不再過度依賴局部高亮特征。重新訓(xùn)練后氣泡誤檢率從 11% 降到了不到 1%。6.3 標(biāo)注質(zhì)量怎么把控前面反復(fù)提到標(biāo)注質(zhì)量這里說具體怎么控制。如果你有幾個(gè)人一起標(biāo)注建議做兩件事做完第一批標(biāo)注后抽 10% 的圖像由主標(biāo)人重新標(biāo)注一遍計(jì)算標(biāo)注一致性。如果標(biāo)注框的中心點(diǎn)偏移超過 5 個(gè)像素或者邊界差異超過 10%說明標(biāo)注規(guī)范還不夠明確需要重新對(duì)齊標(biāo)準(zhǔn)。另外強(qiáng)烈建議在訓(xùn)練中途請(qǐng)標(biāo)注者看模型預(yù)測(cè)結(jié)果。標(biāo)注者看到模型的預(yù)測(cè)結(jié)果后會(huì)自然意識(shí)到哪里標(biāo)注得不準(zhǔn)確這是一種高效的反饋機(jī)制——本質(zhì)上就是人在糾正模型在輔助。6.4 關(guān)于部署環(huán)境的經(jīng)驗(yàn)最終這個(gè)自動(dòng)識(shí)別系統(tǒng)要真正用起來建議設(shè)計(jì)成獨(dú)立的批量分析流程而不是單個(gè) Python 腳本。整個(gè)流程可以拆成三個(gè)獨(dú)立的環(huán)節(jié)圖像導(dǎo)入環(huán)節(jié)負(fù)責(zé)從顯微鏡目錄讀取圖像并做統(tǒng)一預(yù)處理推理環(huán)節(jié)加載模型批量跑滑動(dòng)窗口輸出檢測(cè)結(jié)果匯總環(huán)節(jié)將結(jié)果整理成表格、疊加圖和統(tǒng)計(jì)報(bào)告。這樣拆開的好處是每個(gè)環(huán)節(jié)都可以單獨(dú)調(diào)試和替換。如果后期換了新模型只需改推理環(huán)節(jié)圖像導(dǎo)入和匯總邏輯完全不用動(dòng)。我的實(shí)際經(jīng)驗(yàn)是這種低耦合設(shè)計(jì)在真正部署時(shí)要少踩很多坑。注意如果顯微鏡軟件自帶自動(dòng)化接口可以把“自動(dòng)識(shí)別目標(biāo)區(qū)域”的結(jié)果直接轉(zhuǎn)換成鏡臺(tái)坐標(biāo)序列讓顯微鏡自動(dòng)移動(dòng)到目標(biāo)位置采集高倍圖像。這一步非常實(shí)用做藥物篩選和高通量成像時(shí)能省下一整天的重復(fù)勞動(dòng)。具體接口各廠家差異很大但基本原理就是輸出目標(biāo)中心點(diǎn)坐標(biāo)換算成鏡臺(tái)相對(duì)位移精度通常能滿足大多數(shù)場(chǎng)景。寫在最后的經(jīng)驗(yàn)自動(dòng)識(shí)別目標(biāo)區(qū)域這個(gè)功能做到能用的程度并不難難的是在不同成像條件、不同樣本制備下都能穩(wěn)定工作。我個(gè)人最大的體會(huì)是這個(gè)問題的瓶頸不在模型結(jié)構(gòu)而在數(shù)據(jù)質(zhì)量和工程細(xì)節(jié)。數(shù)據(jù)管好了、滑動(dòng)窗口策略對(duì)了、后處理做扎實(shí)了哪怕用最普通的模型結(jié)構(gòu)也能得到很可用的結(jié)果。如果要給剛開始做這個(gè)方向的人一句建議我會(huì)說不要一上來就追求最先進(jìn)的算法先用最簡(jiǎn)單的方案把一個(gè)最小流程跑通從采集圖像、標(biāo)注、訓(xùn)練到推理輸出整個(gè)管線打通之后再一步步迭代優(yōu)化。很多人在第一步就卡住了原因是覺得模型還不夠好不敢繼續(xù)往下走。實(shí)際上哪怕最開始的效果只有 60% 的準(zhǔn)確率先把流程跑通后面每一輪的改進(jìn)都能被量化評(píng)估這才是推動(dòng)項(xiàng)目前進(jìn)的正確方式。最后分享一個(gè)小技巧訓(xùn)練結(jié)束后把模型在典型圖像上的預(yù)測(cè)結(jié)果做成一張匯總圖打印出來貼在工位上。每次調(diào)整數(shù)據(jù)或參數(shù)之后都對(duì)照這張圖看變化你會(huì)很容易發(fā)現(xiàn)哪些改動(dòng)真的帶來了改進(jìn)哪些只是訓(xùn)練噪聲帶來的波動(dòng)。這個(gè)方法陪我跑完了不少顯微圖像的識(shí)別項(xiàng)目比盯著 loss 曲線直觀多了。