創(chuàng)新與工程落地解析)
圖像分割這個(gè)方向2024年給人最大的感受就是能落地的模型忽然多起來了。前幾年提到圖像分割大家腦子里還是FCN、U-Net這些老面孔一兩個(gè)模型打天下。今年不一樣從Meta的SAM 2到Y(jié)OLO11-seg從統(tǒng)一分割框架到擴(kuò)散模型分割從云端大模型到能跑在邊緣設(shè)備上的輕量版本整個(gè)賽道幾乎是一口氣把“算法、架構(gòu)、部署”三個(gè)維度同時(shí)往前推了一大步。這篇文章我想掰開揉碎聊一聊我自己在今年實(shí)際用過、看得見的五大革新圖像分割模型。不是純粹堆論文而是站在工程落地的角度把每個(gè)模型的架構(gòu)創(chuàng)新點(diǎn)、適用場景、實(shí)際操作過程中的步驟和坑都過一遍。適合正在選型、做技術(shù)預(yù)研或者說已經(jīng)在練手但沒完全摸清楚門路的同學(xué)參考。1. 圖像分割賽道現(xiàn)狀與五大模型選型總覽1.1 2024年圖像分割到底卷在哪兒先花點(diǎn)時(shí)間把今年的技術(shù)主線捋清楚。圖像分割這個(gè)任務(wù)本身不算新但2024年它的進(jìn)化速度明顯加快了而且方向很集中第一通用分割模型從“能分”走向“能跟蹤”從靜態(tài)圖片走向視頻流代表就是SAM 2第二實(shí)時(shí)檢測分割一體化的模型繼續(xù)白菜化YOLO系列背靠ultralytics生態(tài)把訓(xùn)練和部署門檻壓到了歷史最低第三學(xué)術(shù)界不再滿足于單任務(wù)模型開始做一個(gè)模型同時(shí)搞定語義分割、實(shí)例分割、全景分割的統(tǒng)一框架第四擴(kuò)散模型這種生成式思路滲透到分割領(lǐng)域帶來了一種完全不同于傳統(tǒng)判別式分割的新范式第五也是我作為工程人員最關(guān)心的輕量化分割模型終于能跑了MobileSAM、EfficientSAM這類項(xiàng)目讓嵌入式設(shè)備也有了“分割一切”的能力。換句話說2024年不是某一個(gè)模型單點(diǎn)突破而是整條鏈路——從模型架構(gòu)、訓(xùn)練范式到部署方案——都在改。這也提醒我們做技術(shù)選型的時(shí)候不能只看論文刷了多少分更要看它在你真實(shí)的硬件環(huán)境、數(shù)據(jù)分布、業(yè)務(wù)約束下能不能站得住。1.2 五大模型橫向?qū)Ρ扰c應(yīng)用場景映射我這次列出的五大模型不是按論文引用量排的而是按“實(shí)踐價(jià)值”篩的SAM 2、YOLO11-seg、OneFormer、擴(kuò)散分割代表模型、MobileSAM/EfficientSAM。它們在架構(gòu)思路上差異非常大覆蓋了從研究到生產(chǎn)的全部需求。模型方向核心架構(gòu)突破典型優(yōu)勢典型劣勢合適場景SAM 2可提示分割 流式記憶視頻跟蹤視頻分割效果好、提示靈活顯存開銷大、推理偏慢視頻交互標(biāo)注、目標(biāo)跟蹤、醫(yī)學(xué)影像YOLO11-seg單階段檢測器 anchor-free分割頭速度快、部署成熟、生態(tài)好對開放詞匯支持弱、邊界質(zhì)量中等工業(yè)質(zhì)檢、自動(dòng)駕駛、實(shí)時(shí)監(jiān)控OneFormer任務(wù)token Transformer統(tǒng)一框架一個(gè)模型產(chǎn)三種分割結(jié)果訓(xùn)練成本高、小目標(biāo)易丟全景理解、多任務(wù)統(tǒng)一建模擴(kuò)散分割生成式掩膜、與CLIP結(jié)合開放詞匯、零樣本潛力大推理慢、多輪采樣不穩(wěn)定學(xué)術(shù)研究、開放場景分割MobileSAM/EfficientSAM大模型蒸餾 輕量ViT可跑移動(dòng)端/嵌入式、保留SAM基礎(chǔ)能力精度有損失、復(fù)雜提示下降端側(cè)交互、實(shí)時(shí)輔助標(biāo)注這張表先給大家一個(gè)整體印象。下面我按模型逐個(gè)展開每個(gè)都從架構(gòu)講到實(shí)操。2. SAM 2從“分割一切”到“跟蹤分割一切”2.1 SAM 2的架構(gòu)創(chuàng)新記憶注意力與流式處理如果說2023年的SAM解決了“給個(gè)點(diǎn)或框把目標(biāo)摳出來”的問題那么2024年SAM 2解決的問題就是“視頻里這個(gè)目標(biāo)一直在動(dòng)你怎么連續(xù)地把它摳出來”。SAM 2的架構(gòu)本質(zhì)上是在原來的雙塔結(jié)構(gòu)圖像編碼器 提示編碼器 掩膜解碼器中間引入了一個(gè)記憶模塊。關(guān)鍵改動(dòng)有三點(diǎn)第一視頻被當(dāng)成一個(gè)流式序列處理每幀的預(yù)測結(jié)果會(huì)寫進(jìn)記憶庫第二模型增加了記憶注意力層讓當(dāng)前幀的視覺特征能夠和過去幀的預(yù)測結(jié)果做跨幀匹配這樣即使目標(biāo)和鏡頭之間有遮擋、模糊模型也能靠歷史信息猜出目標(biāo)大概在哪第三SAM 2的提示機(jī)制擴(kuò)展到了時(shí)間維度你可以在任意一幀上點(diǎn)一下模型就會(huì)自動(dòng)往前和往后傳播這個(gè)提示完成整個(gè)視頻片段的分割。這個(gè)架構(gòu)創(chuàng)新的意義在于它把“分割”和“跟蹤”兩件事合并成了一個(gè)統(tǒng)一的流程。以前做視頻目標(biāo)分割常規(guī)做法是先用檢測器或分割模型跑單幀再疊加一個(gè)跟蹤算法流程復(fù)雜、錯(cuò)誤會(huì)累積。SAM 2直接用分割模型本身解決時(shí)序一致性問題這是我今年覺得最“革新”的一點(diǎn)。2.2 實(shí)戰(zhàn)在視頻目標(biāo)分割任務(wù)中引入SAM 2我的實(shí)際使用場景是給一批監(jiān)控視頻做目標(biāo)摳圖目標(biāo)是提取固定區(qū)域內(nèi)的移動(dòng)物體。我用的方式是先把視頻抽幀然后在關(guān)鍵幀上打點(diǎn)提示再交給SAM 2去傳播。我基于官方倉庫的推理腳本做了一點(diǎn)改造核心調(diào)用邏輯如下from sam2.build_sam import build_sam2_video_predictor import torch checkpoint ./checkpoints/sam2.pt model_cfg sam2_hiera.yaml predictor build_sam2_video_predictor(model_cfg, checkpoint, devicecuda) # 初始化視頻目錄按照約定視頻需要先抽幀保存為jpg序列 predictor.init_state(video_path./frames) # 在第5幀點(diǎn)擊目標(biāo)中心 frame_idx 5 points np.array([[640, 420]], dtypenp.float32) labels np.array([1], dtypenp.int32) _, obj_ids, mask_logits predictor.add_new_points( frame_idxframe_idx, obj_id1, pointspoints, labelslabels, ) # 向后傳播得到整段視頻的分割掩膜 for out_frame_idx, out_obj_ids, out_mask_logits in predictor.propagate_in_video(start_frame_idxframe_idx): mask (out_mask_logits[0] 0.0).cpu().numpy() cv2.imwrite(f./results/mask_{out_frame_idx:04d}.png, mask.astype(np.uint8) * 255)這里有個(gè)容易被新手忽略的地方SAM 2對輸入視頻的尺寸非常敏感官方默認(rèn)要求幀分辨率在1024附近太小的幀會(huì)顯著影響掩膜邊界質(zhì)量。我一開始直接拿720p的幀喂進(jìn)去結(jié)果小目標(biāo)經(jīng)常漏。后來統(tǒng)一縮放到長邊1024再推理效果立刻穩(wěn)定很多。另外如果視頻里有鏡頭切換最好在切換位置重新給提示否則記憶信息會(huì)污染新場景的特征匹配。2.3 顯卡資源與推理速度的取舍SAM 2大模型版本在單張1024分辨率圖片上的顯存開銷大約在6到8GB視頻傳播時(shí)因?yàn)橐鏆v史幀的特征和掩膜顯存會(huì)更高。我實(shí)際測試在RTX 3090上1080p視頻抽幀后跑60幀的傳播推理平均每幀大約需要0.2到0.3秒做離線標(biāo)注夠用但要做實(shí)時(shí)視頻分割肯定不現(xiàn)實(shí)。我的建議是如果你只是做單幀交互式摳圖用2023年的原版SAM就行沒必要上SAM 2但如果你要做視頻級的像素級跟蹤SAM 2是當(dāng)前開源方案里最省心的一條路。官方提供了Hiera系列的不同大小實(shí)際工程一般用SAM 2.1_hiera_large或者sam2.1_hiera_base_plus既保證精度又控制顯存。3. YOLO11-seg實(shí)時(shí)實(shí)例分割的工業(yè)落地首選3.1 從YOLOv8到Y(jié)OLO11分割頭的改進(jìn)邏輯行業(yè)里很多人可能還在用YOLOv8-seg但ultralytics在今年更新到了YOLO11其中YOLO11-seg是最適合工業(yè)落地的實(shí)時(shí)實(shí)例分割模型。它最大的特點(diǎn)是延續(xù)了單階段框架的簡單性不搞兩階段也不依賴Transformer而是把分割任務(wù)直接掛在檢測框架后面用一個(gè)額外的分割分支輸出每個(gè)目標(biāo)的二進(jìn)制掩膜。YOLO11相比YOLOv8的幾個(gè)關(guān)鍵改動(dòng)包括主干網(wǎng)絡(luò)里用了C3k2模塊也就是在CSPNet基礎(chǔ)上進(jìn)一步優(yōu)化了梯度路徑讓信息流動(dòng)更順暢SPPF部分繼續(xù)保留但配合通道數(shù)調(diào)整讓特征圖尺寸控制更靈活檢測頭和解碼頭分得更細(xì)分割分支和分類回歸分支彼此解耦這樣訓(xùn)練時(shí)梯度干擾更小。從效果來看YOLO11-seg在COCO上的Mask mAP比YOLOv8-seg提升了兩三個(gè)點(diǎn)而推理速度幾乎持平甚至略快。我做工業(yè)項(xiàng)目時(shí)選擇YOLO11-seg核心原因不是它精度最高而是它生態(tài)太成熟了ultralytics庫把數(shù)據(jù)集配置、訓(xùn)練、導(dǎo)出ONNX、TensorRT部署全部打通了。相比自己去拼裝SAM 2和跟蹤器YOLO11-seg開箱即用。3.2 訓(xùn)練自定義數(shù)據(jù)集的完整流程以我最近做的一個(gè)包裝缺陷檢測項(xiàng)目為例目標(biāo)是分割出包裝袋上的破損區(qū)域。整套流程大概三步第一步準(zhǔn)備數(shù)據(jù)集。YOLOv8/YOLO11分割需要的標(biāo)注格式是每行一個(gè)目標(biāo)多個(gè)多邊形點(diǎn)坐標(biāo)用歸一化的xy坐標(biāo)保存0 0.512 0.314 0.512 0.372 0.563 0.372 0.563 0.314 1 0.731 0.512 0.731 0.579 0.804 0.579 0.804 0.512我圖省事直接用LabelMe標(biāo)注多邊形然后寫了一個(gè)小腳本轉(zhuǎn)成YOLO格式。這一步最容易被忽視的是“歸一化”坐標(biāo)必須除以圖片寬高否則訓(xùn)練直接崩。另一個(gè)常見問題是標(biāo)注太稀疏每個(gè)對象只標(biāo)了十來個(gè)點(diǎn)模型學(xué)到的是粗糙多邊形而不是精確邊緣。我的經(jīng)驗(yàn)是關(guān)鍵轉(zhuǎn)角處多標(biāo)點(diǎn)平滑曲線處可以少標(biāo)保證邊緣誤差在2到3個(gè)像素以內(nèi)。第二步配置數(shù)據(jù)文件并啟動(dòng)訓(xùn)練。# dataset.yaml train: ./datasets/packaging/train/images val: ./datasets/packaging/val/images names: 0: defectyolo segment train datadataset.yaml modelyolo11s-seg.pt epochs100 imgsz640 batch16 device0第三步驗(yàn)證效果并導(dǎo)出yolo segment val datadataset.yaml modelruns/segment/train/weights/best.pt yolo export modelruns/segment/train/weights/best.pt formatonnx dynamicTrue訓(xùn)練環(huán)節(jié)我踩過的坑主要是類別不平衡。包裝袋破損通常是小概率事件負(fù)樣本遠(yuǎn)多于正樣本。這時(shí)候不要只調(diào)損失函數(shù)權(quán)重最簡單有效的手段是“復(fù)制粘貼增強(qiáng)”——把缺陷區(qū)域通過隨機(jī)縮放、旋轉(zhuǎn)后疊加到正常樣本上生成更多帶標(biāo)注的合成樣本。實(shí)測在1350張?jiān)紙D片的基礎(chǔ)上通過這個(gè)方式擴(kuò)到3600張mAP直接漲了4個(gè)多點(diǎn)。3.3 推理速度與精度的平衡藝術(shù)YOLO11-seg有三個(gè)常用體積檔位n、s、m。工業(yè)場景我一般推薦從s起步在自定義數(shù)據(jù)集上s版本比n版本mAP高不少但速度在RTX 3060上依然能跑到80到120 FPS完全滿足實(shí)時(shí)要求。如果部署到NVIDIA Jetson Orin這類邊緣設(shè)備n或s版本配合TensorRT半精度量化也能達(dá)到30到50 FPS。需要特別提醒的是YOLOv11-seg的分割掩膜本質(zhì)上還是以檢測框?yàn)檫吔缟傻囊簿褪恰癿ask是在框內(nèi)預(yù)測”的。因此對大而扁的物體、或者目標(biāo)之間互相重疊的場景掩膜精度會(huì)明顯下降。這是單階段實(shí)例分割的通病選型時(shí)要心里有數(shù)。4. OneFormer / 統(tǒng)一分割框架一個(gè)模型搞定語義、實(shí)例、全景4.1 為什么需要統(tǒng)一分割圖像分割的三個(gè)子任務(wù)——語義分割、實(shí)例分割、全景分割——在傳統(tǒng)方法里幾乎都要維護(hù)獨(dú)立的模型和訓(xùn)練流程。語義分割用FCN/U-Net那套實(shí)例分割用Mask R-CNN或YOLO-seg那套全景分割又要把語義和實(shí)例結(jié)果融合。工程上一個(gè)很痛的問題是三種標(biāo)簽體系不一致數(shù)據(jù)標(biāo)注成本翻倍模型維護(hù)也麻煩。OneFormer這個(gè)框架2023年已經(jīng)提出2024年在社區(qū)里被關(guān)注得更多核心賣點(diǎn)就是用同一個(gè)Transformer架構(gòu)、同一套訓(xùn)練權(quán)重、同一份訓(xùn)練數(shù)據(jù)同時(shí)輸出語義分割、實(shí)例分割和全景分割三種結(jié)果。它的架構(gòu)核心是引入了“任務(wù)token”這個(gè)機(jī)制輸入一張圖再輸入一個(gè)代表當(dāng)前任務(wù)類型的tokensemantic/instance/panopticTransformer解碼器會(huì)根據(jù)這個(gè)token的引導(dǎo)從相同的特征里解碼出對應(yīng)的任務(wù)結(jié)果。這有點(diǎn)像給模型一個(gè)“工作指令”讓它知道自己這次要做哪一站。4.2 架構(gòu)細(xì)節(jié)query、Transformer解碼器與任務(wù)tokenOneFormer整體上走的是基于query的Transformer分割路線和Mask2Former血緣很近。區(qū)別在于Mask2Former的query是無差別的每個(gè)query都做所有任務(wù)而OneFormer的query是由任務(wù)token調(diào)制過的每一個(gè)query都綁定一個(gè)任務(wù)上下文。這個(gè)設(shè)計(jì)的好處是模型在訓(xùn)練時(shí)共享視覺編碼器和大部分解碼器參數(shù)只有任務(wù)token那一層的小部分參數(shù)在不同任務(wù)間變化所以訓(xùn)練階段的收斂速度明顯比分開訓(xùn)練三個(gè)模型更快。另一個(gè)值得提的細(xì)節(jié)是query數(shù)量。默認(rèn)配置里OneFormer使用150個(gè)query而語義分割通常只需要幾十個(gè)類別實(shí)例分割則需要更多query來覆蓋所有實(shí)例。150這個(gè)數(shù)字是對三個(gè)任務(wù)的折中。實(shí)際用下來當(dāng)一張圖里的實(shí)例數(shù)量超過這個(gè)數(shù)時(shí)會(huì)漏掉一些極小的目標(biāo)。所以如果你的場景里密集小目標(biāo)特別多建議把query數(shù)量調(diào)到240甚至300但顯存占用也會(huì)相應(yīng)上升。4.3 實(shí)際使用效果與局限我在開放場景測試集上跑過OneFormer的官方預(yù)訓(xùn)練模型全景分割質(zhì)量相當(dāng)不錯(cuò)特別是對室內(nèi)場景中的“東西”和“墻面、地板”這類stuff的劃分非常干凈。但它的問題也很明顯一是訓(xùn)練成本高從零開始訓(xùn)練要4塊甚至8塊A100跑好幾天一般小團(tuán)隊(duì)很難自己重訓(xùn)二是端側(cè)推理太重Transformer解碼器這一層在推理時(shí)計(jì)算量很大我在Jetson Orin上跑一次全景分割要超過200ms實(shí)時(shí)性不足。我的建議是OneFormer適合做離線的場景理解、數(shù)據(jù)自動(dòng)標(biāo)注這類任務(wù)不適合做線上實(shí)時(shí)分割。如果你的目標(biāo)是統(tǒng)一標(biāo)注體系、把多套模型合并成一套OneFormer是一個(gè)值得花時(shí)間做預(yù)研的方向但生產(chǎn)落地前需要做充分的蒸餾和量化壓縮。5. 擴(kuò)散模型做分割生成式分割的新范式5.1 擴(kuò)散分割的基本原理擴(kuò)散模型大家聽得多的是文生圖比如Stable Diffusion。2024年有一個(gè)趨勢是把這套生成式思路搬到分割任務(wù)里來做法大致是訓(xùn)練一個(gè)模型從隨機(jī)噪聲逐步去噪最終“生成”出一個(gè)分割掩膜。換句話說傳統(tǒng)分割模型是判別式地給每個(gè)像素分類擴(kuò)散分割則是把分割當(dāng)成一個(gè)從噪聲中恢復(fù)掩膜的生成過程。這個(gè)思路聽著反直覺但細(xì)想有它的道理生成過程天然適合建模復(fù)雜的結(jié)構(gòu)性輸出比如邊界不規(guī)則、拓?fù)鋸?fù)雜的掩膜判別式模型很容易在邊界處“畫糊”擴(kuò)散模型因?yàn)槊恳惠喍荚诩?xì)化可以把邊界磨得更清楚。同時(shí)擴(kuò)散分割還可以和CLIP這類圖文對齊模型結(jié)合實(shí)現(xiàn)開放詞匯分割——你不需要預(yù)先定義類別只要給一句自然語言描述模型就能分割出對應(yīng)目標(biāo)。5.2 在開放詞匯分割上的潛力開放詞匯是擴(kuò)散分割最吸引我的點(diǎn)。傳統(tǒng)分割模型訓(xùn)練時(shí)定義了80類它就只會(huì)分這80類遇到新類別直接就懵。擴(kuò)散分割可以借助預(yù)訓(xùn)練圖文模型的語義空間把文本特征當(dāng)成條件輸入讓模型分割出“沒有訓(xùn)練過的類別”。實(shí)際操作上我試過一個(gè)基于擴(kuò)散和CLIP結(jié)合的方案輸入一張街景圖提示文本寫“red car”模型輸出的掩膜可以較為準(zhǔn)確地選中紅色車輛即使訓(xùn)練數(shù)據(jù)里“red car”這個(gè)組合從未出現(xiàn)過。這對工程來說意義很大因?yàn)閳鼍袄镱悇e是動(dòng)態(tài)變化的時(shí)候你不需要重新收集數(shù)據(jù)、重新訓(xùn)練直接換文本提示就行。5.3 當(dāng)前短板與應(yīng)用邊界不過我必須潑盆冷水?dāng)U散分割目前還遠(yuǎn)沒到可以隨便上線做生產(chǎn)的狀態(tài)。第一推理速度太慢采樣50步和采樣5步之間精度差距極大而即使5步采樣單張圖也要一兩秒和YOLO11-seg的毫秒級速度完全不在一個(gè)量級。第二結(jié)果不穩(wěn)定同一個(gè)prompt跑兩次掩膜可能在細(xì)節(jié)上有明顯差異這對質(zhì)檢、醫(yī)療這類要求可復(fù)現(xiàn)性的場景是致命的。第三訓(xùn)練難度高想從零訓(xùn)練一個(gè)擴(kuò)散分割模型對數(shù)據(jù)和算力的要求比傳統(tǒng)模型高一個(gè)臺(tái)階。所以我把擴(kuò)散分割定位為“研究和新場景探索工具”適合用來做數(shù)據(jù)預(yù)標(biāo)注、快速試錯(cuò)、或者那些類別極端多樣且難以枚舉數(shù)據(jù)的場景。真要上生產(chǎn)還是得回到傳統(tǒng)的判別式分割模型。6. 輕量化分割模型MobileSAM、EfficientSAM 與邊緣部署6.1 大模型蒸餾的思路SAM系列精度是高但動(dòng)輒幾十GB的模型、十幾GB的顯存讓很多嵌入式項(xiàng)目只能干瞪眼。2024年一個(gè)重要分支就是把SAM這類大模型“蒸餾成小模型”代表就是MobileSAM和EfficientSAM。MobileSAM的思路非常直接SAM的大頭在圖像編碼器也就是一個(gè)巨大的ViT-HMobileSAM用一個(gè)輕量的小ViT替換掉它然后利用原版SAM的預(yù)測結(jié)果作教師信號(hào)只蒸餾圖像編碼器的輸出特征。解碼器部分保持原樣不動(dòng)。這樣做出來的模型參數(shù)量大概是原來的幾十分之一而交互提示后的分割效果在常規(guī)場景下和原版差距并不大。EfficientSAM走的是另外一條路利用掩膜對齊的跨注意力蒸餾讓小模型的中間層特征盡可能接近大模型同時(shí)在注意力模塊里做結(jié)構(gòu)剪枝。兩種方案各有優(yōu)劣我的實(shí)測感受是MobileSAM部署更簡單、社區(qū)資料更多EfficientSAM在某些細(xì)粒度邊界上略好一點(diǎn)。6.2 端側(cè)部署實(shí)測我在一塊RK3588開發(fā)板上分別跑過MobileSAM和EfficientSAM的ONNX導(dǎo)出版本圖片分辨率512x512CPU上單次推理時(shí)間在1.2到2秒之間加上NPU加速后能壓到300到500毫秒。雖然不是實(shí)時(shí)但在交互式標(biāo)注工具里已經(jīng)足夠流暢——用戶點(diǎn)一下一兩秒后出掩膜體驗(yàn)是可以接受的。部署步驟大致是這樣# 1. 導(dǎo)出ONNX python scripts/export_onnx_model.py --model-type mobile_sam --checkpoint ./weights/mobile_sam.pt --output ./onnx/mobile_sam.onnx # 2. 用onnxruntime推理 import onnxruntime as ort sess ort.InferenceSession(./onnx/mobile_sam.onnx, providers[CPUExecutionProvider]) # 輸入包括image、point_coords、point_labels等張量 outputs sess.run(None, {image: image_input, point_coords: pt_input, point_labels: label_input})這一步最容易出問題的是onnx導(dǎo)出的動(dòng)態(tài)軸配置。SAM系列模型里image的尺寸是固定的但point數(shù)量是變化的導(dǎo)出時(shí)必須把point_coords和point_labels的維度標(biāo)為動(dòng)態(tài)否則運(yùn)行時(shí)只要點(diǎn)的數(shù)量變了就報(bào)錯(cuò)。6.3 從模型壓縮到硬件適配的經(jīng)驗(yàn)做輕量化分割部署我有幾條實(shí)際心得。第一蒸餾后的小模型對提示噪聲更敏感原來在大模型上點(diǎn)偏幾個(gè)像素沒關(guān)系小模型可能就分割錯(cuò)誤所以前端的點(diǎn)擊提示要做好坐標(biāo)偏移校驗(yàn)。第二量化的精度損失在分割任務(wù)上比檢測任務(wù)更明顯尤其是掩膜邊緣建議優(yōu)先采用INT8量化而不是二值化或4bit量化。第三如果目標(biāo)非常小比如醫(yī)學(xué)影像里的病灶點(diǎn)輕量化模型漏檢率會(huì)顯著上升這種情況下不要迷信蒸餾還是保留一個(gè)云端大模型做難例處理。7. 模型評估、調(diào)參與避坑實(shí)錄7.1 分割任務(wù)的指標(biāo)mIoU、mAP、F1 怎么選很多新手上來就看mIoU但不同任務(wù)側(cè)重點(diǎn)完全不一樣。語義分割任務(wù)的核心指標(biāo)是mIoU因?yàn)樗鹣袼亟y(tǒng)計(jì)分類結(jié)果能反映整張圖的理解程度實(shí)例分割任務(wù)核心指標(biāo)是mask mAP它和檢測任務(wù)的AP類似先算IoU匹配再對預(yù)測實(shí)例打分排序全景分割則更復(fù)雜需要同時(shí)計(jì)算PQPQ同時(shí)考慮到識(shí)別質(zhì)量和分割質(zhì)量。工程上我最常用的組合是mIoU做模型訓(xùn)練收斂判斷mAP做實(shí)例級性能對比F1配合業(yè)務(wù)閾值做最終是否上線的決策。比如質(zhì)檢場景缺陷必須高召回那就要在低置信度閾值下看F1而不是只看最高點(diǎn)的mAP。7.2 常見訓(xùn)練問題與排查方案訓(xùn)練分割模型經(jīng)常遇到的四類問題我做成一個(gè)速查表現(xiàn)象可能原因排查方法Loss降不下去學(xué)習(xí)率過大、數(shù)據(jù)標(biāo)注有錯(cuò)誤標(biāo)簽降低學(xué)習(xí)率一個(gè)數(shù)量級錯(cuò)標(biāo)比例超過5%時(shí)先清洗數(shù)據(jù)掩膜邊緣呈鋸齒狀標(biāo)注多邊形點(diǎn)數(shù)太少、下采樣倍數(shù)過大增加標(biāo)注精細(xì)度輸出分辨率從640提到1024小目標(biāo)全漏掉輸入分辨率太低、anchor/Autoassign問題提升輸入分辨率對小目標(biāo)區(qū)域做裁剪訓(xùn)練訓(xùn)練震蕩不收斂batch size太小或沒做warmupbatch至少8前10個(gè)epoch做線性warmup我還要提醒一個(gè)不常被提到的點(diǎn)分割標(biāo)簽和檢測框那種矩形標(biāo)注不同它是密集像素級標(biāo)簽對標(biāo)注一致性要求極高。同一個(gè)目標(biāo)兩個(gè)標(biāo)注員畫的多邊形邊緣差3個(gè)像素模型學(xué)出來的邊界就是模糊的。有條件的話在訓(xùn)練前做一次標(biāo)簽清洗把形狀詭異的標(biāo)注查一遍再訓(xùn)。7.3 工程化經(jīng)驗(yàn)標(biāo)注、數(shù)據(jù)增強(qiáng)、錨點(diǎn)設(shè)置數(shù)據(jù)增強(qiáng)這塊分割任務(wù)用顏色抖動(dòng)和隨機(jī)尺度變換收益很高但不要盲目用旋轉(zhuǎn)。如果業(yè)務(wù)場景里物體都是直立擺放的模型不需要學(xué)旋轉(zhuǎn)不變性轉(zhuǎn)了反而增加學(xué)習(xí)難度。錨點(diǎn)設(shè)置方面YOLO系列是自動(dòng)錨點(diǎn)但建議還是對訓(xùn)練集跑一下自動(dòng)錨點(diǎn)計(jì)算尤其當(dāng)目標(biāo)形狀分布和目標(biāo)寬高比與你預(yù)期的差距很大時(shí)自動(dòng)錨點(diǎn)能顯著減少前期的無效訓(xùn)練。另外一個(gè)細(xì)節(jié)分割頭的loss權(quán)重不要默認(rèn)走我習(xí)慣把box loss降低、把mask loss權(quán)重抬高因?yàn)榉指铐?xiàng)目最終評價(jià)的是掩膜質(zhì)量而不是框的貼合度。8. 如何根據(jù)業(yè)務(wù)場景選出正確模型很多同學(xué)問得最多的一句話是“我到底該用哪個(gè)模型”其實(shí)這個(gè)問題沒有標(biāo)準(zhǔn)答案但可以根據(jù)幾條硬約束快速縮小范圍。先把硬約束列出來第一實(shí)時(shí)性要求響應(yīng)延遲要毫秒級那就別考慮擴(kuò)散模型和OneFormer直接從YOLO11-seg里選第二硬件條件只有CPU或者嵌入式板子優(yōu)先MobileSAM、EfficientSAM或者YOLO11n-seg云端有GPU就放開用SAM 2和YOLO11m-seg第三類別是否固定如果類別固定、場景封閉傳統(tǒng)判別式模型足夠如果類別開放、需求隨時(shí)變考慮擴(kuò)散分割做研究同時(shí)用SAM 2做交互式輔助標(biāo)注第四視頻還是單幀視頻場景直接看SAM 2單幀場景看YOLO11-seg或OneFormer。再補(bǔ)充一個(gè)我自己的選型經(jīng)驗(yàn)不要為了新模型而新模型。今年SAM 2出來后很多團(tuán)隊(duì)第一時(shí)間就想著把原有點(diǎn)擊分割服務(wù)切過去但對單幀交互點(diǎn)擊這個(gè)業(yè)務(wù)來說原版SAM和MobileSAM已經(jīng)能滿足90%的需求切到SAM 2不僅推理更慢還要重新做服務(wù)適配。新模型的收益如果覆蓋不了遷移成本就不要?jiǎng)?。技術(shù)選型不是追新是找最吻合約束條件的解。最后分享一個(gè)小技巧不管最后選哪個(gè)模型都建議在項(xiàng)目里同時(shí)保留一個(gè)“大模型離線處理 小模型實(shí)時(shí)兜底”的雙通道。倒不是說小模型一定差而是它在邊界細(xì)節(jié)、遮擋、小目標(biāo)上確實(shí)會(huì)有短板這時(shí)把特別難的幀異步送到大模型里重新處理既保證了整體速度又守住了精度底線。這是我跑了多個(gè)落地項(xiàng)目之后覺得ROI最高的一筆架構(gòu)投入。