檢測(cè)完整上手指南:用 YoloDotNet 從圖片一路跑到視頻流)
C# 目標(biāo)檢測(cè)完整上手指南用 YoloDotNet 從圖片一路跑到視頻流【免費(fèi)下載鏈接】YoloDotNetYoloDotNet - A C# .NET 8.0 project for Classification, Object Detection, OBB Detection, Segmentation and Pose Estimation in both images and live video streams.項(xiàng)目地址: https://gitcode.com/gh_mirrors/yo/YoloDotNetYoloDotNet 是一個(gè)基于 C# .NET 8.0 的開(kāi)源目標(biāo)檢測(cè)庫(kù)把圖像分類(lèi)、目標(biāo)檢測(cè)、OBB 檢測(cè)、分割和姿態(tài)估計(jì)統(tǒng)一封裝成幾個(gè)方法圖片和實(shí)時(shí)視頻流都能直接喂進(jìn)去。這篇 YoloDotNet 教程不按操作清單逐條硬背而是帶你走一條真實(shí)的開(kāi)發(fā)路徑從加載一張圖片到讓攝像頭畫(huà)面里的目標(biāo)被逐幀盯住。跑完這條路徑你就摸清了這套 .NET 目標(biāo)檢測(cè) API 的脾氣。先看清能力版圖你要調(diào)用的是哪個(gè) Run 方法YoloDotNet 的核心入口只有一個(gè)類(lèi) Yolo所有能力都是初始化一次、調(diào)用對(duì)應(yīng)方法。拿到的是普通檢測(cè)模型就調(diào)用 RunObjectDetection模型帶旋轉(zhuǎn)角度的走 RunObbDetection分割用 RunSegmentation姿態(tài)估計(jì)用 RunPoseEstimation分類(lèi)用 RunClassification。選錯(cuò)入口的典型癥狀是模型加載成功了結(jié)果卻一塌糊涂。因?yàn)?YoloDotNet 會(huì)讀取模型元數(shù)據(jù)來(lái)自動(dòng)匹配內(nèi)部模塊檢測(cè)模型和分割模型的輸出張量結(jié)構(gòu)完全不同入口必須一一對(duì)應(yīng)。同一套 API 換不同模型就切換任務(wù)圖上這類(lèi)密集人群正是檢測(cè)模塊的典型輸入場(chǎng)景。項(xiàng)目自帶的 ONNX 模型都放在 test/assets/Models 目錄。yolov8s.onnx、yolov11s.onnx 是標(biāo)準(zhǔn)目標(biāo)檢測(cè)模型命名里帶 seg、pose、cls、obb 后綴的分別對(duì)應(yīng)分割、姿態(tài)、分類(lèi)和 OBB 任務(wù)。新手先用這些現(xiàn)成模型起步最穩(wěn)妥不用自己從零訓(xùn)練。最省事的起步配置一次備齊倉(cāng)庫(kù)與模型前提條件只有一個(gè)裝好 .NET 8.0 SDKdotnet --version能輸出版本號(hào)即可。后面要做視頻處理的話再裝 FFmpeg 并加入系統(tǒng) PATH。YoloDotNet 安裝不需要任何全局注冊(cè)或環(huán)境變量克隆下來(lái)就能直接編譯git clone https://gitcode.com/gh_mirrors/yo/YoloDotNet cd YoloDotNet倉(cāng)庫(kù)本身是一個(gè)完整解決方案Demo 目錄下每個(gè)子項(xiàng)目都是獨(dú)立可運(yùn)行的示例。進(jìn)入目標(biāo)檢測(cè)示例并還原依賴(lài)cd Demo/ObjectDetectionDemo dotnet restoredotnet restore會(huì)把主庫(kù)、執(zhí)行提供程序、SkiaSharp 等依賴(lài)一次拉齊通常半分鐘內(nèi)完成。這里要理解一個(gè)關(guān)鍵概念執(zhí)行提供程序CpuExecutionProvider、CudaExecutionProvider 等是 YoloDotNet 的可插拔模塊意味著你能先在 CPU 上把邏輯跑通再無(wú)縫切到 GPU 提速代碼改動(dòng)只限于一行。一次跑通的目標(biāo)檢測(cè)示例先讓 CPU 跑起來(lái)打開(kāi) ObjectDetectionDemo 的 Program.cs核心邏輯其實(shí)只有三步初始化 Yolo、執(zhí)行推理、把結(jié)果畫(huà)回圖片。下面這段把執(zhí)行提供程序換成了最通用的 CPUusing var yolo new Yolo(new YoloOptions { ExecutionProvider new CpuExecutionProvider(yolov8s.onnx), ImageResize ImageResize.Proportional }); using var image SKBitmap.Decode(test.jpg); var results yolo.RunObjectDetection(image, confidence: 0.25, iou: 0.7); image.Draw(results); image.Save(output.jpg, SKEncodedImageFormat.Jpeg, 85);這段在做什么YoloOptions 描述模型在哪、用哪種硬件算、圖片怎么縮放。ImageResize.Proportional表示等比縮放并自動(dòng)補(bǔ)邊這個(gè)選項(xiàng)直接影響檢測(cè)精度RunObjectDetection返回帶類(lèi)別、置信度和坐標(biāo)框的檢測(cè)結(jié)果Draw擴(kuò)展方法負(fù)責(zé)把框和標(biāo)簽畫(huà)到圖上。街道畫(huà)面里的車(chē)輛與行人被同時(shí)框出每條標(biāo)注都帶著類(lèi)別名和置信度百分比。看結(jié)果圖時(shí)框上的那個(gè)百分比就是置信度——它表示模型有多大把握這里確實(shí)有某個(gè)目標(biāo)。理解這一點(diǎn)是下面調(diào)參的前提。調(diào)參心法置信度、IOU 與 ROI 分別管什么你可能會(huì)問(wèn)為什么我的檢測(cè)結(jié)果一堆虛框或者干脆什么都檢不出來(lái)多半是這兩個(gè)參數(shù)沒(méi)調(diào)對(duì)。confidence越低模型越大膽誤報(bào)也越多iou交并比控制重疊框的合并力度值越低合并得越狠能解決同一輛車(chē)被框了三遍的尷尬。如果只想關(guān)注圖片的局部區(qū)域還可以用roi圈出感興趣范圍var results yolo.RunObjectDetection(image, confidence: 0.5, iou: 0.4, roi: new SKRectI(100, 100, 600, 600));把 confidence 提到 0.5低置信度的虛框會(huì)被過(guò)濾畫(huà)面立刻干凈許多。沒(méi)有萬(wàn)能組合最實(shí)用的做法是把兩個(gè)參數(shù)暴露成命令行變量掃幾組數(shù)值對(duì)比輸出圖比憑感覺(jué)猜快得多。核心場(chǎng)景讓檢測(cè)盯住視頻里的每一幀圖片跑通之后最讓人上頭的應(yīng)用是實(shí)時(shí)視頻檢測(cè)。YoloDotNet 對(duì)視頻的抽象很直接給出視頻源注冊(cè)一個(gè)逐幀回調(diào)然后啟動(dòng)。yolo.InitializeVideo(new VideoOptions { VideoInput device/dev/video0:1280:720:30, // 攝像頭也可填本地視頻文件路徑 VideoOutput output.mp4 }); yolo.OnVideoFrameReceived (frame, frameIndex) { var detections yolo.RunObjectDetection(frame, confidence: 0.3); frame.Draw(detections); }; yolo.StartVideoProcessing();這段的邏輯VideoInput支持本地文件、RTMP 直播流和攝像頭三種來(lái)源每解碼出一幀OnVideoFrameReceived就被觸發(fā)一次你在回調(diào)里做的檢測(cè)和繪制都會(huì)實(shí)時(shí)疊加到該幀上。攝像頭的寫(xiě)法是device設(shè)備名:寬:高:幀率Windows 和 Linux 的取流方式不一樣先調(diào)Yolo.GetVideoDevices()就能列出系統(tǒng)當(dāng)前可用的設(shè)備名。視頻流模式下逐幀檢測(cè)過(guò)馬路行人配合 SORT 跟蹤器還能為每個(gè)目標(biāo)維持穩(wěn)定編號(hào)。如果想讓目標(biāo)跨幀保持同一身份可以在結(jié)果上鏈?zhǔn)秸{(diào)用.FilterLabels([person])只保留行人再.Track(sortTracker)做跨幀跟蹤。幀率跟不上時(shí)把FrameInterval設(shè)為 2 表示只處理每?jī)蓭O(jiān)控類(lèi)場(chǎng)景通常足夠用。新手避坑清單五個(gè)最容易翻車(chē)的細(xì)節(jié)模型版本對(duì)不上YoloDotNet 按模型元數(shù)據(jù)自動(dòng)匹配模塊YOLOv8 的模型別指望用 v12 的 demo 跑通Demo 目錄與 Models 目錄本來(lái)就是按版本一一對(duì)應(yīng)的。FFmpeg 缺失視頻功能會(huì)直接報(bào)解碼失敗先跑ffmpeg -version自查是否已安裝并進(jìn)入 PATH。路徑帶中文或空格ONNX 模型加載對(duì)路徑敏感先把模型拷到項(xiàng)目根目錄用相對(duì)路徑最省事。換了硬件卻忘了換提供程序CPU 切 GPU 時(shí)必須把CpuExecutionProvider換成CudaExecutionProvider兩者在代碼里是顯式不同的類(lèi)不是改個(gè)開(kāi)關(guān)。忘了釋放資源Yolo實(shí)現(xiàn)了IDisposable務(wù)必用using包裹否則 GPU 顯存和原生內(nèi)存不會(huì)及時(shí)回收。動(dòng)手挑戰(zhàn)把它變成你自己的第一個(gè)檢測(cè)應(yīng)用讀完這篇 YoloDotNet 教程建議直接做一個(gè)小作業(yè)用 test/assets/Models 里的 yolov8s.onnx寫(xiě)一個(gè)命令行攝像頭守衛(wèi)——當(dāng)檢測(cè)到 person 時(shí)在控制臺(tái)輸出一條帶時(shí)間戳的日志。提示三個(gè)方向攝像頭源用device字符串幀回調(diào)里把 confidence 調(diào)高到 0.5 壓制誤報(bào)把每幀檢測(cè)結(jié)果的數(shù)量打印出來(lái)即可。做完這一步你就完成了從靜態(tài)圖片到實(shí)時(shí)視頻的完整跨越下一步可以翻開(kāi) Trackers 目錄下的 SortTracker 源碼看看目標(biāo)是如何在幀與幀之間被記住的。【免費(fèi)下載鏈接】YoloDotNetYoloDotNet - A C# .NET 8.0 project for Classification, Object Detection, OBB Detection, Segmentation and Pose Estimation in both images and live video streams.項(xiàng)目地址: https://gitcode.com/gh_mirrors/yo/YoloDotNet創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考