:從數(shù)據(jù)標注到部署全解析)
開頭做水藻檢測這幾年我最大的感受是傳統(tǒng)的顯微鏡人工鏡檢已經(jīng)遠遠跟不上水質(zhì)監(jiān)測的實際節(jié)奏了。一個水樣從采樣、固定、沉淀到人工計數(shù)熟練的操作員也得花十幾分鐘遇到藻類爆發(fā)的季節(jié)樣品堆積如山等結果出來水華可能已經(jīng)進入下一個階段了。也正是因為這個痛點我?guī)е鴪F隊做了一個基于YOLOv8深度學習的水藻檢測系統(tǒng)把整個流程從人工鏡檢變成了拍照、上傳、出結果三步走。這篇文章就把這個項目從頭到尾拆開講清楚包括YOLOv8的選型邏輯、YOLO數(shù)據(jù)集的構建標準、UI界面的設計思路、模型訓練和部署落地中踩過的坑希望能給正在做生物目標檢測或水質(zhì)監(jiān)測自動化的朋友一些參考。1. 水藻檢測到底在解決什么問題為什么選擇YOLOv81.1 人工鏡檢的瓶頸遠比想象中嚴重水藻檢測不是一個錦上添花的功能而是水質(zhì)預警里非常剛性的一環(huán)。水體中藻類的種類和密度直接反映富營養(yǎng)化程度藍藻、綠藻、硅藻、甲藻等不同門類的藻類對應的水體健康風險和治理手段完全不同。傳統(tǒng)做法是通過顯微鏡人工觀察玻片樣本識別藻種并計數(shù)最后換算成單位體積的藻細胞數(shù)量。這個流程的問題在于三個方面。第一是慢。一個樣本從制樣到出報告通常需要10到20分鐘高頻監(jiān)測場景下根本吃不消。我見過某水質(zhì)監(jiān)測平臺在夏季高峰期每天要處理上百個水樣人工鏡檢團隊三班倒還是積壓嚴重。第二是主觀性太強。不同的操作員對同一種藻的識別標準不一致特別是半透明、形態(tài)不規(guī)則的藻類誤差很大同一個樣本不同人計數(shù)可能差出30%以上。第三是難以形成連續(xù)的數(shù)據(jù)積累。人工記錄的數(shù)據(jù)多半是紙質(zhì)的或者散亂的表格很難做成結構化的樣本庫去支撐后續(xù)趨勢分析。所以這個項目的核心目標非常明確用深度學習目標檢測替代人工識別的部分做到圖像進來、檢測結果出來同時把結果統(tǒng)計成可導出的結構化數(shù)據(jù)。這也就決定了模型輸出的核心必須是目標框類別置信度這樣標準的信息結構而不是單純的圖像分類結論。1.2 為什么是YOLOv8而不是傳統(tǒng)圖像處理或兩階段檢測器很多第一次做生物識別項目的人會問水藻檢測能不能用OpenCV的閾值分割、邊緣檢測去做我的回答是能做但只能做非常有限的應用。藻類在顯微鏡下的形態(tài)千變?nèi)f化絲狀藻、群體藻、單細胞藻的輪廓差異極大光照和背景質(zhì)感的變化會讓閾值參數(shù)瞬間失效。傳統(tǒng)圖像分割適合背景干凈、目標形態(tài)固定的場景水藻顯然不屬于這一類。用固定規(guī)則去擬合高度多變的生物形態(tài)本質(zhì)上是不現(xiàn)實的。接著我們對比了兩類深度學習方案兩階段檢測器和單階段檢測器。兩階段檢測器比如Faster R-CNN這一類的識別精度確實高但推理速度普遍較慢在實時視頻流檢測場景下很難保證流暢性。而水藻檢測的最終形態(tài)一定是要支持實時或者準實時檢測的——現(xiàn)場采集的視頻、流動顯微鏡的實時畫面都需要模型能在幾十毫秒內(nèi)完成一幀推理。YOLOv8這一代版本有幾個設計對生物目標檢測特別友好anchor-free的解耦檢測頭讓正負樣本的定義更簡潔C2f結構在保持輕量的同時增強了梯度流動多尺度特征融合網(wǎng)絡對大小差異懸殊的藻類目標有更好的召回能力。再加上Ultralytics生態(tài)里訓練、導出、部署的工具鏈非常完善這讓我們能更快地把模型從實驗臺搬到實際系統(tǒng)里。做一個直觀對比方案識別精度推理速度開發(fā)成本適合場景閾值分割/邊緣檢測低高低背景固定的簡單目標傳統(tǒng)HOGSVM分類器中低中中形態(tài)單一的目標兩階段檢測器高低高對速度不敏感的離線檢測YOLOv8高高較低實時檢測、工程化落地選定YOLOv8之后整個項目就被拆成了三條線數(shù)據(jù)集建設、模型訓練、UI界面與部署。接下來一一展開。2. 數(shù)據(jù)集建設比模型訓練更花時間的部分2.1 數(shù)據(jù)采集渠道與拍攝規(guī)范模型效果的上限由數(shù)據(jù)決定這句話在水藻檢測項目中體現(xiàn)得淋漓盡致。最開始我們拿現(xiàn)成的公開數(shù)據(jù)集試跑發(fā)現(xiàn)泛化效果很差——公開數(shù)據(jù)集里的水藻圖像大多是在理想光照、單一背景下拍攝的而實際水樣的背景里會有雜質(zhì)、碎屑、氣泡藻類的密度和聚集狀態(tài)也完全不同。所以dataset部分我的建議是公開數(shù)據(jù)打底自采數(shù)據(jù)做主力。自采數(shù)據(jù)的方式不復雜但需要注意規(guī)范。我們需要一臺帶數(shù)字相機的生物顯微鏡放大倍數(shù)控制在100到400倍之間這個區(qū)間既能看清藻類細胞細節(jié)又能保證單張畫面里有足夠的樣本量。拍攝時盡量統(tǒng)一曝光參數(shù)背景保持潔凈避免玻片上的劃痕和氣泡干擾。不同季節(jié)、不同水域的水樣都采樣一些因為同樣一種藻在不同營養(yǎng)條件下形態(tài)會發(fā)生變化如果只在單一條件下采集模型到現(xiàn)場很容易臉盲。每一類水藻的目標建議至少收集500到1000個實例框太少的話模型學不到類內(nèi)變化太多的話標注成本又過大。類別的定義也要提前想清楚是按形態(tài)學門類分藍藻、綠藻、硅藻、裸藻等還是按具體的屬來分。這個決定了標注的難度和模型最終的使用方式。我們最后定了4個類別對應項目實際關注的幾個關鍵指標類群。2.2 標注規(guī)則怎么定才不返工標注是水藻檢測項目中最容易被低估的工作量。水藻和常規(guī)目標人、車、貓狗有本質(zhì)區(qū)別很多藻類是半透明的邊緣模糊有些是絲狀群體黏連在一起有些單個細胞只有幾十個像素大小。如果標注規(guī)則不提前定清楚標注員和模型都會被折騰死。我們實際操作中定下的規(guī)則有這樣幾條第一所有水藻目標都按最小可識別單元進行框選。比如絲狀藻如果一段絲狀體超過視野范圍就按一段連續(xù)可辨識的區(qū)域來框不強行把整條絲拉進去第二對于極度密集的區(qū)域框與框之間允許重疊但重疊面積不超過30%給后續(xù)NMS留出空間第三半透明藻類以可見輪廓為準如果輪廓實在無法判斷寧可不框也不要框錯第四背景中疑似藻類但無法確定的微小顆粒統(tǒng)一歸為背景不強行標注。這些規(guī)則看起來簡單但在實際標注過程中反復出現(xiàn)分歧做了一輪培訓之后才穩(wěn)定下來。工具方面我們用的是開源的圖像標注工具LabelImg支持YOLO格式的txt直接導出。但后面發(fā)現(xiàn)純手動標注的效率瓶頸太明顯換成了帶有半自動標注功能的工具先用一個小模型預標注人工只修正錯框和補漏框效率提高了接近三倍。中途如果發(fā)現(xiàn)某張圖里標注框的邊界和模型實際輸出明顯不一致優(yōu)先去查標注不用急著改模型參數(shù)——這是很多項目反復調(diào)參卻原地踏步的原因。2.3 數(shù)據(jù)增強與格式轉(zhuǎn)換的細節(jié)標注完成之后原始的標注框數(shù)量通常是不夠的尤其密集樣本很少。我們做數(shù)據(jù)增強的核心策略是Copy-Paste和Mosaic增強的組合。Copy-Paste可以把單個藻類目標的圖像塊復制到不同的背景上從而增加目標數(shù)量和背景多樣性Mosaic增強把四張圖拼在一起訓練讓模型在一個batch里看到更多樣的數(shù)據(jù)對密集場景的魯棒性提升非常明顯。另外水藻檢測對光照變化比較敏感我們在增強策略里特意加了隨機亮度、對比度擾動模擬不同顯微鏡光源下的色溫變化。這里要提醒一個非常容易踩的坑如果數(shù)據(jù)是從VOC格式XML或COCO格式JSON轉(zhuǎn)成YOLO格式txt的話坐標換算一定要小心。YOLO格式保存的是歸一化后的中心點坐標和寬高XML保存的是左上角和右下角坐標。換算公式很簡單x_center (x_min x_max) / 2 / image_widthy_center (y_min y_max) / 2 / image_heightwidth (x_max - x_min) / image_widthheight (y_max - y_min) / image_height。一旦寬高搞反訓練出來的模型會全部偏移而且這種錯誤在Loss曲線上很難直接看出來表現(xiàn)形式是模型一直不收斂或者收斂后驗證集mAP極低。數(shù)據(jù)劃分方面我們堅持的原則是按來源分集。也就是說同一個水樣拍攝出來的連續(xù)圖片全部放進訓練集或者全部放進驗證集不能隨機混著切。否則模型在驗證集上表現(xiàn)極好到了新水樣上立刻拉胯——因為驗證集里有和訓練集幾乎一樣的背景等于作弊。真實的場景永遠是新背景、新光照、新藻類聚集狀態(tài)。3. 模型訓練鏈路從配置到評估的完整流程3.1 模型規(guī)格選型與關鍵超參數(shù)配置YOLOv8提供了n/s/m/l/x等不同規(guī)格的模型參數(shù)從小到大速度和精度呈反向關系。水藻檢測這類任務的分辨率要求和目標大小直接關聯(lián)。顯微鏡畫面里的藻類單細胞往往只占幾十個像素如果選太小的模型特征提取能力不足很容易漏檢。我們的建議是先用最小的nano模型把整個訓練和推理流程跑通確認數(shù)據(jù)和代碼沒有問題然后換成small或者medium做正式訓練。最終線上部署用的是medium規(guī)格在邊緣設備上跑單幀推理大約需要30到50毫秒完全夠用。訓練配置方面我們使用的數(shù)據(jù)配置文件和命令如下。# data.yaml train: data/images/train val: data/images/val nc: 4 names: [blue_green_algae, green_algae, diatom, euglena]yolo detect train datadata.yaml modelyolov8m.pt epochs200 imgsz960 batch16這里有三個超參數(shù)值得展開說一下。第一個是輸入尺寸imgsz。默認是640但水藻檢測屬于典型的小目標檢測把輸入尺寸提高到960后小目標的檢出率提升非常明顯代價是訓練速度變慢和顯存占用變大。有條件的話可以上1024甚至1280但要先確認顯存夠用。第二個是epochs我們在200輪左右驗證集mAP基本收斂繼續(xù)訓練會對訓練集越來越過擬合。第三個是batch size盡量開大充分占用顯存如果顯存不足就把batch調(diào)小配合梯度累積來保證訓練的穩(wěn)定性。優(yōu)化器直接選了AdamW學習率保持默認沒有額外手工微調(diào)。3.2 Loss曲線的觀察方法不是越低越好訓練過程中最需要盯的是三類Lossbox_loss邊界框回歸損失、cls_loss分類損失、dfl_loss分布焦點損失。很多剛接觸目標檢測的人看到Loss曲線一路下降就很開心但這里有個常見的誤區(qū)Loss只是訓練指標最終評判要看驗證集上的mAP等指標。如果訓練集Loss持續(xù)下降而驗證集mAP停滯甚至下降說明模型開始過擬合這個時候應該提前停止訓練而不是繼續(xù)跑下去。我在訓練水藻模型時觀察到的一個現(xiàn)象是cls_loss下降得很快但box_loss下降得相對緩慢。原因是水藻目標的邊緣模糊標注框本身存在一定的主觀性模型很難把邊界框回歸得非常精準。遇到這種情況不要急優(yōu)先保證分類和中心點定位的準確性框稍微大一點或者小一點在實際計數(shù)場景中影響不大。訓練過程中每10輪保存一次checkpoint最后用best.pt而不是last.pt做推理。3.3 模型評估m(xù)AP之外還要看什么訓練完的模型不能只看mAP50和mAP50-95的數(shù)值。在生物檢測場景里除了整體指標必須要逐類看Precision和Recall。不同藻類的形態(tài)差異很大可能出現(xiàn)整體mAP還不錯、但某一類比如硅藻的Recall特別低的情況因為硅藻殼面的紋理在低倍鏡下不明顯模型容易漏檢。通過打印per-class的PR曲線和混淆矩陣才能定位到真正的問題出在哪一類目標上。另外驗證集圖像和實時視頻流的檢測難度不是一個量級。靜態(tài)圖像光照穩(wěn)定、沒有運動模糊而實時視頻流中藻類在流動液中會旋轉(zhuǎn)和移動模型性能會明顯下降。所以我在訓練結束后習慣用一段真實場景錄制的視頻做二次驗證統(tǒng)計連續(xù)幀的漏檢率這比驗證集上的mAP更能反映線上表現(xiàn)。這個習慣幫我們提前發(fā)現(xiàn)了很多問題比如某類藻在運動狀態(tài)下形態(tài)扭曲嚴重后續(xù)我們針對這類數(shù)據(jù)做了專項補充。4. UI界面設計讓檢測系統(tǒng)真正可用4.1 為什么選擇PyQt5做桌面端界面模型訓練得再好如果沒有一個可操作的界面檢測系統(tǒng)就只能活在代碼里。我們最終選擇了PyQt5來搭建UI原因很直接Python生態(tài)無縫對接模型推理和OpenCV圖像處理信號槽機制做多線程交互非常順手打包成桌面程序后部署到監(jiān)控室或者實驗室的工作站上也很方便。相比之下Web前端方案比如Flask網(wǎng)頁雖然界面美觀但部署需要額外的服務環(huán)境在離線內(nèi)網(wǎng)環(huán)境里反而麻煩。Tkinter雖然輕量但做復雜交互界面時樣式和性能都跟不上。我們的界面功能劃分得很清楚左側(cè)是控制區(qū)和參數(shù)區(qū)右側(cè)是圖像顯示區(qū)和結果列表區(qū)。頂部是模式切換單張圖片檢測、本地視頻檢測、攝像頭實時檢測三種模式。左側(cè)參數(shù)區(qū)可以調(diào)節(jié)置信度閾值和NMS IoU閾值這兩個參數(shù)在實際使用中經(jīng)常需要現(xiàn)場調(diào)整放到界面上可以避免每次改代碼。右側(cè)結果區(qū)實時顯示檢測框、類別名稱、置信度以及各類別的統(tǒng)計計數(shù)并支持一鍵導出CSV報告。4.2 多線程架構不能讓界面卡死在模型推理上這是UI設計中最核心的一個坑。如果把模型推理直接寫在主線程里每一幀檢測耗時幾十毫秒甚至上百毫秒界面會明顯卡頓點擊按鈕也半天沒反應體驗極差。正確做法是讓界面主線程只負責渲染和交互模型推理放在單獨的QThread工作線程里通過信號把檢測結果傳回主線程。這樣即使模型在后臺慢一點界面依然流暢。核心代碼結構大致是這樣的import sys from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QMainWindow, QFileDialog, QLabel, QPushButton, QVBoxLayout, QWidget from ultralytics import YOLO class InferThread(QThread): frame_signal pyqtSignal(object, list) def __init__(self, model_path, source): super().__init__() self.model YOLO(model_path) self.source source self.running True def run(self): import cv2 cap cv2.VideoCapture(self.source) while self.running: ret, frame cap.read() if not ret: break results self.model(frame, conf0.35, iou0.5) boxes [] for r in results: for box in r.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) x1, y1, x2, y2 [int(v) for v in box.xyxy[0]] boxes.append((cls_id, conf, x1, y1, x2, y2)) self.frame_signal.emit(frame, boxes) cap.release() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.btn QPushButton(選擇視頻, self) self.label QLabel(self) layout QVBoxLayout() layout.addWidget(self.btn) layout.addWidget(self.label) container QWidget() container.setLayout(layout) self.setCentralWidget(container) self.btn.clicked.connect(self.start_detect) self.thread None def start_detect(self): path, _ QFileDialog.getOpenFileName(self, 選擇視頻) if not path: return self.thread InferThread(best.pt, path) self.thread.frame_signal.connect(self.update_frame) self.thread.start() def update_frame(self, frame, boxes): import cv2 for cls_id, conf, x1, y1, x2, y2 in boxes: color (0, 255, 0) cv2.rectangle(frame, (x1, y1), (x2, y2), color, 2) cv2.putText(frame, f{cls_id} {conf:.2f}, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch rgb.shape qimg QImage(rgb.data, w, h, ch * w, QImage.Format_RGB888) self.label.setPixmap(QPixmap.fromImage(qimg))這個示例只是最簡結構實際項目中還要加攝像頭熱插拔檢測、視頻暫停繼續(xù)開關、檢測結果自動累計統(tǒng)計、置信度閾值實時滑塊聯(lián)動等。但核心思想就是一句話重活放子線程界面只畫結果。4.3 界面資源組織與啟動封裝UI模塊的資源組織也很重要。我們把模型權重文件統(tǒng)一放在models目錄下類別名稱映射寫成一個txt文件或直接寫在配置文件里界面啟動時加載。這樣后續(xù)模型迭代時只要替換權重文件界面代碼幾乎不用動。啟動入口做了封裝雙擊bat文件或者桌面快捷方式就能拉起程序不需要使用者手動安裝Python依賴和模型路徑。實際部署到實驗室后操作員只關心點哪個按鈕能出結果完全不碰代碼這才是工程化落地和Demo的區(qū)別。5. 部署優(yōu)化與推理加速5.1 ONNX導出與精度對齊驗證當模型在開發(fā)機上驗證效果穩(wěn)定后就可以進入部署環(huán)節(jié)了。我們把PyTorch模型導出成ONNX格式這一步不僅是為了跨平臺部署更是為了在推理性能上做進一步優(yōu)化。導出的命令很簡單yolo export modelbest.pt formatonnx opset12 halfTrue導出完成后要做精度對齊驗證用同一張測試圖分別跑PyTorch原模型和ONNX推理對比輸出的坐標框和置信度。正常情況下兩者的差異應該在極小的范圍內(nèi)如果出現(xiàn)明顯偏差優(yōu)先檢查opset版本和輸入輸出的名映射問題。我們在最初導出時就踩過這個坑opset版本過高導致某些算子在目標機器上的推理庫不支持導出過程沒有報錯但推理結果完全不對。5.2 推理加速的幾個實用技巧ONNX導出完成后推理端我們用的是ONNX Runtime相比原生的PyTorch推理速度提升了50%以上。在此基礎上還有幾招可以進一步加速。第一是半精度推理在支持FP16的GPU或者AI加速芯片上把模型參數(shù)和中間張量都切成FP16推理速度幾乎翻倍而且對水藻檢測這類非極端精度要求的任務幾乎沒有指標損失。第二是設置動態(tài)輸入或固定輸入尺寸在部署時把輸入尺寸固定為訓練時的960×960避免每次推理重新分配內(nèi)存。第三是對后處理進行剪裁大幅降低類別數(shù)是關鍵但更重要的是把單幀檢測上限max_det從默認的300調(diào)低到100左右水藻檢測一幀里極少超過100個目標調(diào)低了反而能避免一些低置信度的雜亂框干擾計數(shù)。5.3 邊緣設備部署的取舍我們的系統(tǒng)最終計劃要部署到現(xiàn)場的水質(zhì)監(jiān)測站那里沒有高性能服務器只能用常見的嵌入式部署平臺。這種場景下UNet規(guī)模的模型都偏大需要把YOLOv8s或者YOLOv8n拿來做量化。INT8量化后模型體積能減少約75%推理速度能再上一個臺階但mAP會有小幅下降。我的建議是在量化前后用一段真實視頻跑一遍對比如果精度下降在可接受范圍內(nèi)比如mAP50從0.85降到0.8就可以接受INT8方案。另外現(xiàn)場部署還要考慮輸入源的適配工業(yè)相機和顯微鏡的SDK五花八門界面層最好把圖像采集也做一層抽象否則換一個相機型號可能就要改一遍代碼。6. 實測效果、常見問題與排查思路6.1 真實場景中的誤檢漏檢案例模型上線后我們在真實水樣上做了一批驗證發(fā)現(xiàn)的問題比訓練集上看到的要復雜得多。最典型的是氣泡誤檢水樣在制樣過程中會產(chǎn)生微小的氣泡在顯微鏡下呈現(xiàn)圓形、邊緣明亮形態(tài)上和一些微小的單細胞藻非常相似模型經(jīng)常把氣泡錯認成藻類。解決辦法不是一味調(diào)高置信度閾值那樣會同時砍掉真正的目標而是要在數(shù)據(jù)層面補齊氣泡這類負樣本。我們專門采集了含氣泡的水樣圖像用背景類別或者直接不標注讓模型在訓練時見過足夠多的氣泡形態(tài)誤檢率顯著下降。另一個高發(fā)問題是密集區(qū)域的漏檢和錯檢。水華爆發(fā)期藻類聚集形成大團塊單體邊界完全重疊人眼都很難分清個體。模型在團塊區(qū)域的輸出往往是一大坨框NMS之后剩下幾個計數(shù)誤差很大。我們嘗試了兩種改進一是把輸入尺寸進一步加大到1280讓模型看到更多細節(jié)二是訓練時針對性加入高密度的Copy-Paste增強樣本提高模型對重疊目標的區(qū)分能力。效果有一定改善但要完全解決需要對標注標準做更細致的定義比如在團塊區(qū)域標注群體作為一個獨立目標而不是逐個個體。6.2 閾值參數(shù)現(xiàn)場調(diào)優(yōu)的思路部署后我們發(fā)現(xiàn)訓練階段的效果很好不代表現(xiàn)場推理直接能用。現(xiàn)場環(huán)境的光照、藻種結構和水樣背景千差萬別一個固定不變的置信度閾值無法適應所有場景。所以界面才特別留了置信度和IoU閾值的實時調(diào)節(jié)控件。經(jīng)驗是如果現(xiàn)場誤檢多把背景當藻類優(yōu)先調(diào)高置信度閾值從0.25往0.4甚至0.5調(diào)如果漏檢多該檢測到的目標沒有框出來優(yōu)先調(diào)低置信度閾值同時檢查輸入圖像有沒有運動模糊。IoU閾值則影響重疊框的合并強度密集場景下調(diào)低到0.4左右可以保留更多重疊目標但可能帶來重復計數(shù)。這些參數(shù)沒有統(tǒng)一標準必須結合實際畫面效果微調(diào)。6.3 標注一致性最容易被忽略的模型天花板最后想專門聊一下標注一致性的問題。水藻這類邊緣模糊的生物目標標注的主觀性對模型上限的影響非常巨大。如果A標注員習慣把絲狀藻框得緊一些B標注員習慣框得松一些模型學到的是一個忽緊忽松的邊界框分布效果自然拉胯。我們在項目中期做了一次標注質(zhì)檢發(fā)現(xiàn)同一張圖的重復標注IoU只有0.75左右這個數(shù)值在生物圖像任務里其實不算差但仍意味著模型學到的邊界本身就有噪聲。解決思路有兩個一是建立清晰的標注SOP文檔配示例圖并在多人標注時定期交叉抽檢二是用模型輔助標注迭代先訓練一個基線模型把所有待標注圖片跑一遍預標注人工只負責修正和確認這樣能把標注標準迅速拉齊。對于水藻這類重復性高、邊界模糊的目標第二種方式明顯更省力也是我們最終采用的主要方式。6.4 一個可以繼續(xù)擴展的方向項目做到這里基礎的水藻檢測流程已經(jīng)完整落地。如果后續(xù)要做得更深入一個自然的擴展方向是從檢測哪些藻走向算有多少藻。借助目標檢測輸出的框和類別計數(shù)結合采樣水樣的體積和顯微鏡視野面積可以估算單位體積內(nèi)的藻類密度進一步做富營養(yǎng)化趨勢曲線和水華預警。這種方法不需要額外的模型能力只需要在UI層的統(tǒng)計模塊里把幾何換算和單位換算做好。再往后還可以把檢測范圍從水藻擴展到其他浮游生物輪蟲、枝角類等形成一個通用的浮游生物圖像識別平臺。我自己在這個項目里最深刻的體會是一個目標檢測系統(tǒng)真正的工程價值并不在于模型有多新、mAP有多高而在于數(shù)據(jù)是否真實、標注是否統(tǒng)一、部署是否穩(wěn)定。最后分享一個小建議給準備做類似生物目標檢測的朋友動手訓練模型之前先花時間把標注標準的細節(jié)定清楚把真實場景的樣本拍足。這一步做好了后面的路會順很多這一步偷懶了后面大概率要在調(diào)試中反復還債。