:數(shù)據(jù)集構(gòu)建與模型調(diào)優(yōu)實(shí)戰(zhàn))
簡(jiǎn)介本資源是面向計(jì)算機(jī)視覺初學(xué)者與安防算法開發(fā)者的小型目標(biāo)檢測(cè)數(shù)據(jù)集聚焦于“翻越欄桿”這一典型異常行為識(shí)別任務(wù)適用于YOLO系列、Faster R-CNN等主流檢測(cè)模型的訓(xùn)練與驗(yàn)證。壓縮包共1538個(gè)文件包含512張高質(zhì)量JPG圖像、512份Pascal VOC格式XML標(biāo)注文件含坐標(biāo)與類別及512份YOLO格式TXT標(biāo)簽文件已按標(biāo)準(zhǔn)格式轉(zhuǎn)換所有標(biāo)注均使用labelImg工具完成類別統(tǒng)一為“climbing”總計(jì)599個(gè)精確框標(biāo)注另有2個(gè)冗余txt文件用于版本說明或校驗(yàn)。資源包大小僅30.1MB輕量易部署且已集成基礎(chǔ)圖像增強(qiáng)樣本兼顧泛化性與實(shí)用性。目前已有956人學(xué)習(xí)下載適合快速構(gòu)建原型系統(tǒng)、開展行為識(shí)別小實(shí)驗(yàn)或作為教學(xué)演示數(shù)據(jù)集尤其利于理解VOC與YOLO雙格式協(xié)同使用、標(biāo)注一致性校驗(yàn)及單類別檢測(cè)任務(wù)的數(shù)據(jù)準(zhǔn)備全流程。1. 項(xiàng)目背景與數(shù)據(jù)集價(jià)值解析最近在整理硬盤翻出來一個(gè)壓箱底的老項(xiàng)目數(shù)據(jù)集——“翻越欄桿檢測(cè)數(shù)據(jù)集VOCYOLO格式512張1類別”。這個(gè)數(shù)據(jù)集雖然規(guī)模不大只有512張圖片但在我早期做安防監(jiān)控相關(guān)的算法驗(yàn)證時(shí)起到了不小的作用。今天把它分享出來也順便聊聊圍繞這類特定場(chǎng)景數(shù)據(jù)集從制作、標(biāo)注到訓(xùn)練、調(diào)優(yōu)的一整套實(shí)戰(zhàn)經(jīng)驗(yàn)?!胺綑跅U檢測(cè)”聽起來很具體但它背后代表了一類非常典型的安防應(yīng)用需求行為越界識(shí)別。無論是小區(qū)圍墻、工廠周界、還是地鐵站臺(tái)防止人員非法翻越都是核心安全訴求。在深度學(xué)習(xí)普及之前這類任務(wù)多依賴傳統(tǒng)的背景減除、光流法或者簡(jiǎn)單的規(guī)則判斷比如在虛擬警戒線附近檢測(cè)到移動(dòng)物體誤報(bào)率高魯棒性差。一個(gè)專門針對(duì)“翻越欄桿”動(dòng)作的數(shù)據(jù)集其價(jià)值就在于能讓模型學(xué)習(xí)到“人”與“欄桿”在特定空間交互關(guān)系下的形態(tài)特征比如身體傾斜角度、手臂支撐動(dòng)作、腿部跨越姿態(tài)等從而實(shí)現(xiàn)更精準(zhǔn)的識(shí)別。這個(gè)數(shù)據(jù)集采用了經(jīng)典的VOC格式和YOLO格式進(jìn)行存儲(chǔ)方便大家直接用于不同的訓(xùn)練框架。VOC格式是許多老牌視覺庫如OpenCV DNN, TensorFlow Object Detection API支持的標(biāo)準(zhǔn)而YOLO格式則是當(dāng)下最流行的單階段目標(biāo)檢測(cè)算法如YOLOv5, YOLOv8的直接輸入格式。提供雙格式意味著你拿到手幾乎可以無縫對(duì)接大多數(shù)訓(xùn)練流程。數(shù)據(jù)集只包含“翻越”這一個(gè)類別目標(biāo)明確非常適合作為新手入門目標(biāo)檢測(cè)或者作為已有模型進(jìn)行特定場(chǎng)景微調(diào)Fine-tuning的補(bǔ)充數(shù)據(jù)。2. 數(shù)據(jù)集內(nèi)容深度拆解與質(zhì)量評(píng)估拿到一個(gè)數(shù)據(jù)集第一步絕不是急著扔進(jìn)模型訓(xùn)練而是先要“讀懂”它。這個(gè)“翻越欄桿檢測(cè)數(shù)據(jù)集”雖然結(jié)構(gòu)標(biāo)準(zhǔn)但里面有很多細(xì)節(jié)決定了你后續(xù)訓(xùn)練的成敗。2.1 數(shù)據(jù)規(guī)模與場(chǎng)景分布512張圖像對(duì)于目標(biāo)檢測(cè)任務(wù)來說屬于小樣本數(shù)據(jù)集。這直接決定了我們的使用策略它不適合從頭開始訓(xùn)練From Scratch一個(gè)復(fù)雜的檢測(cè)模型因?yàn)閰?shù)量巨大的模型如ResNet-50/101為Backbone的檢測(cè)器需要海量數(shù)據(jù)才能避免過擬合。它的正確打開方式有兩種一是用于遷移學(xué)習(xí)在一個(gè)大型通用數(shù)據(jù)集如COCO上預(yù)訓(xùn)練的模型上用本數(shù)據(jù)集進(jìn)行微調(diào)二是用于輕量級(jí)模型如YOLOv5s, YOLOv8n的專項(xiàng)訓(xùn)練這類模型參數(shù)少對(duì)小數(shù)據(jù)集更友好。我們需要分析這512張圖像的場(chǎng)景多樣性光照條件是否包含了白天、夜晚、黃昏、陰天、逆光等情況一個(gè)只在白天數(shù)據(jù)上訓(xùn)練的模型晚上基本會(huì)失效。欄桿類型是金屬柵欄、水泥圍墻、玻璃護(hù)欄還是鐵絲網(wǎng)不同的紋理和結(jié)構(gòu)會(huì)影響邊緣特征。人物視角是否包含了正面、側(cè)面、背面、俯視如攝像頭在高處、平視等多種拍攝角度視角單一會(huì)導(dǎo)致模型對(duì)特定姿態(tài)過擬合。翻越階段是剛剛攀爬、正在跨越、還是即將落地一個(gè)完整的動(dòng)作周期數(shù)據(jù)能讓模型理解行為的連續(xù)性。在我檢視這個(gè)數(shù)據(jù)集時(shí)發(fā)現(xiàn)它較好地覆蓋了白天和夜晚場(chǎng)景欄桿以常見的金屬柵欄和水泥圍墻為主視角多為平視和輕微俯視翻越動(dòng)作階段也比較完整。這是它作為優(yōu)質(zhì)小數(shù)據(jù)集的基石。2.2 標(biāo)注格式詳解與轉(zhuǎn)換邏輯數(shù)據(jù)集提供了VOC和YOLO兩種格式理解它們的差異和聯(lián)系至關(guān)重要。VOC格式來源于PASCAL VOC挑戰(zhàn)賽采用XML文件存儲(chǔ)標(biāo)注。每個(gè)XML文件對(duì)應(yīng)一張圖片里面包含了圖片尺寸、通道數(shù)以及每個(gè)目標(biāo)物體的詳細(xì)信息。annotation size width1920/width height1080/height depth3/depth /size object nameclimbing/name !-- 類別名 -- bndbox xmin500/xmin !-- 邊界框左上角x坐標(biāo) -- ymin300/ymin xmax700/xmax !-- 邊界框右下角x坐標(biāo) -- ymax800/ymax /bndbox /object /annotationVOC格式的坐標(biāo)是絕對(duì)像素坐標(biāo)清晰直觀但它的缺點(diǎn)是存儲(chǔ)相對(duì)冗余且需要解析XML才能讀取。YOLO格式是為YOLO系列算法設(shè)計(jì)的專用格式通常用.txt文件存儲(chǔ)。每個(gè)txt文件對(duì)應(yīng)一張圖片每行代表一個(gè)目標(biāo)物體。0 0.520833 0.509259 0.104167 0.462963這一行數(shù)據(jù)需要解讀0類別索引class id。在這個(gè)數(shù)據(jù)集中因?yàn)橹挥小胺健币粋€(gè)類別所以索引永遠(yuǎn)是0。如果有多個(gè)類別這里就是0, 1, 2...0.520833邊界框中心點(diǎn)的x坐標(biāo) / 圖片寬度。x_center 0.520833 * width0.509259邊界框中心點(diǎn)的y坐標(biāo) / 圖片高度。y_center 0.509259 * height0.104167邊界框的寬度 / 圖片寬度。w 0.104167 * width0.462963邊界框的高度 / 圖片高度。h 0.462963 * heightYOLO格式的坐標(biāo)是歸一化后的相對(duì)坐標(biāo)范圍0~1這種格式的好處是與圖片絕對(duì)尺寸解耦模型訓(xùn)練時(shí)無需關(guān)心輸入圖片的原始大小便于數(shù)據(jù)增強(qiáng)和批量處理。同時(shí)文本格式更緊湊讀寫更快。注意在YOLO格式中坐標(biāo)歸一化是基于整張圖片的尺寸進(jìn)行的。如果你的數(shù)據(jù)增強(qiáng)操作如Mosaic, RandomPerspective會(huì)改變圖片的有效區(qū)域需要確保歸一化計(jì)算依然正確否則標(biāo)注框會(huì)錯(cuò)位。這是訓(xùn)練中一個(gè)常見的坑。2.3 數(shù)據(jù)質(zhì)量自查清單在投入訓(xùn)練前手動(dòng)或編寫腳本檢查以下問題可以避免大量無效訓(xùn)練標(biāo)注框是否準(zhǔn)確隨機(jī)抽樣幾十張圖片用OpenCV或LabelImg等工具可視化看邊界框是否緊密貼合翻越中的人物。常見的錯(cuò)誤是框得太大包含過多背景或太小沒框住整個(gè)人。是否存在漏標(biāo)一張圖中出現(xiàn)多個(gè)翻越行為時(shí)是否所有目標(biāo)都被標(biāo)注了類別是否正確雖然只有一類但也需確認(rèn)沒有誤標(biāo)如把正常行走的人標(biāo)為翻越。標(biāo)注格式一致性檢查所有YOLO格式的txt文件確保每行都有5個(gè)數(shù)值且數(shù)值在0-1之間中心點(diǎn)坐標(biāo)可能在0-1邊緣但寬高不應(yīng)1。圖像-標(biāo)注匹配確保每張.jpg圖片都有對(duì)應(yīng)的.xml或.txt標(biāo)注文件且文件名嚴(yán)格一致。對(duì)于這個(gè)小數(shù)據(jù)集我建議至少人工檢查10%的樣本約50張可以快速發(fā)現(xiàn)系統(tǒng)性標(biāo)注問題。3. 基于YOLOv8的模型訓(xùn)練實(shí)戰(zhàn)指南有了高質(zhì)量的數(shù)據(jù)集下一步就是選擇模型和訓(xùn)練框架。這里我以當(dāng)前最流行、生態(tài)最完善的Ultralytics YOLOv8為例展示完整的訓(xùn)練流程。選擇YOLOv8是因?yàn)樗瑫r(shí)支持分類、檢測(cè)、分割、姿態(tài)估計(jì)等多種任務(wù)且API極其友好非常適合快速原型驗(yàn)證。3.1 環(huán)境搭建與數(shù)據(jù)準(zhǔn)備首先創(chuàng)建一個(gè)干凈的Python虛擬環(huán)境并安裝依賴。# 創(chuàng)建并激活虛擬環(huán)境以conda為例 conda create -n yolo_fence python3.8 conda activate yolo_fence # 安裝PyTorch (請(qǐng)根據(jù)你的CUDA版本到PyTorch官網(wǎng)選擇對(duì)應(yīng)命令) # 例如對(duì)于CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安裝Ultralytics YOLOv8 pip install ultralytics接下來組織你的數(shù)據(jù)集目錄結(jié)構(gòu)。YOLOv8要求特定的格式我們將提供的YOLO格式數(shù)據(jù)整理如下datasets/ └── fence_climb/ ├── images/ │ ├── train/ # 存放訓(xùn)練圖片例如 400張 │ └── val/ # 存放驗(yàn)證圖片例如 112張 └── labels/ ├── train/ # 存放訓(xùn)練圖片對(duì)應(yīng)的YOLO格式txt標(biāo)簽 └── val/ # 存放驗(yàn)證圖片對(duì)應(yīng)的YOLO格式txt標(biāo)簽?zāi)阈枰獙?12張圖片和標(biāo)簽按一定比例如8:2或7:3分割到train和val文件夾。務(wù)必保證images/train和labels/train中的文件名一一對(duì)應(yīng)val集同理。然后在數(shù)據(jù)集根目錄fence_climb下創(chuàng)建一個(gè)data.yaml配置文件這是YOLOv8讀取數(shù)據(jù)的入口。# data.yaml path: /path/to/your/datasets/fence_climb # 數(shù)據(jù)集根目錄絕對(duì)路徑 train: images/train # 訓(xùn)練集圖片相對(duì)路徑 val: images/val # 驗(yàn)證集圖片相對(duì)路徑 # 類別數(shù)量和名稱 nc: 1 # number of classes names: [climbing] # class names3.2 模型選擇與訓(xùn)練啟動(dòng)YOLOv8提供了不同尺寸的預(yù)訓(xùn)練模型從輕量到高精度yolov8n.pt(nano): 參數(shù)最少速度最快精度最低。yolov8s.pt(small)yolov8m.pt(medium)yolov8l.pt(large)yolov8x.pt(extra large): 參數(shù)最多速度最慢精度通常最高。對(duì)于我們的512張圖小數(shù)據(jù)集強(qiáng)烈建議從yolov8n或yolov8s開始。大模型容易在小數(shù)據(jù)上過擬合表現(xiàn)為訓(xùn)練集損失很低但驗(yàn)證集損失很高或波動(dòng)大。使用預(yù)訓(xùn)練權(quán)重是必須的它能提供通用的特征提取能力。啟動(dòng)訓(xùn)練的Python腳本非常簡(jiǎn)單from ultralytics import YOLO # 加載一個(gè)預(yù)訓(xùn)練模型 model YOLO(yolov8s.pt) # 這里選擇small模型 # 開始訓(xùn)練 results model.train( datadatasets/fence_climb/data.yaml, # 配置文件路徑 epochs100, # 訓(xùn)練輪數(shù)小數(shù)據(jù)可適當(dāng)增加 imgsz640, # 輸入圖片尺寸默認(rèn)640 batch16, # 批次大小根據(jù)GPU內(nèi)存調(diào)整 device0, # 使用GPU 0如果是CPU則設(shè)為cpu workers4, # 數(shù)據(jù)加載線程數(shù) projectruns/detect, # 結(jié)果保存目錄 namefence_climb_exp1, # 實(shí)驗(yàn)名稱 pretrainedTrue, # 使用預(yù)訓(xùn)練權(quán)重默認(rèn)True optimizerSGD, # 優(yōu)化器也可以選AdamW lr00.01, # 初始學(xué)習(xí)率 weight_decay0.0005, # 權(quán)重衰減防止過擬合 )運(yùn)行后YOLOv8會(huì)自動(dòng)下載預(yù)訓(xùn)練模型如果本地沒有然后開始訓(xùn)練。所有日志、模型權(quán)重、訓(xùn)練曲線圖都會(huì)保存在runs/detect/fence_climb_exp1目錄下。3.3 訓(xùn)練過程監(jiān)控與關(guān)鍵指標(biāo)解讀訓(xùn)練開始后不要干等。重點(diǎn)關(guān)注TensorBoard或YOLOv8自帶的日志中的幾個(gè)指標(biāo)損失函數(shù)Losstrain/box_loss: 訓(xùn)練集邊界框回歸損失。理想情況應(yīng)穩(wěn)步下降后趨于平緩。train/cls_loss: 訓(xùn)練集分類損失本例只有一類此項(xiàng)可能很低或?yàn)榱?。val/box_loss: 驗(yàn)證集邊界框回歸損失。這是關(guān)鍵它也應(yīng)該下降并最終穩(wěn)定。如果train_loss持續(xù)下降而val_loss反而上升是典型的過擬合信號(hào)。性能指標(biāo)Metricsmetrics/mAP50-95: 這是核心評(píng)估指標(biāo)指IoU閾值從0.5到0.95步長0.05區(qū)間內(nèi)平均精度mAP的平均值。值越高越好對(duì)于安防應(yīng)用我們更關(guān)注mAP50即IoU0.5時(shí)的精度。metrics/precision: 查準(zhǔn)率即模型預(yù)測(cè)為正的樣本中真正為正的比例。高精度意味著誤報(bào)False Positive少。metrics/recall: 查全率即所有真實(shí)的正樣本中被模型預(yù)測(cè)出來的比例。高召回意味著漏報(bào)False Negative少。在安防場(chǎng)景中我們往往更追求高召回率因?yàn)槁┑粢粋€(gè)真正的翻越事件漏報(bào)的代價(jià)通常遠(yuǎn)高于系統(tǒng)誤報(bào)警誤報(bào)的代價(jià)。你可以在訓(xùn)練后通過調(diào)整置信度閾值conf-thres來平衡精確率和召回率。4. 模型調(diào)優(yōu)策略與常見問題排查直接訓(xùn)練得到的模型往往不是最優(yōu)的尤其是對(duì)于小數(shù)據(jù)集。下面分享幾個(gè)針對(duì)性的調(diào)優(yōu)策略和踩坑經(jīng)驗(yàn)。4.1 應(yīng)對(duì)小數(shù)據(jù)集的過擬合問題這是訓(xùn)練小數(shù)據(jù)集時(shí)最大的挑戰(zhàn)。除了使用輕量級(jí)模型和預(yù)訓(xùn)練權(quán)重還有以下實(shí)戰(zhàn)技巧數(shù)據(jù)增強(qiáng)Data Augmentation的精細(xì)化配置YOLOv8內(nèi)置了豐富的數(shù)據(jù)增強(qiáng)但默認(rèn)配置可能過于激進(jìn)或不適合你的場(chǎng)景??梢栽趍odel.train()參數(shù)中調(diào)整model.train( ... hsv_h0.015, # 色調(diào)增強(qiáng)幅度 hsv_s0.7, # 飽和度增強(qiáng)幅度 hsv_v0.4, # 明度增強(qiáng)幅度 degrees10.0, # 隨機(jī)旋轉(zhuǎn)角度范圍 translate0.1, # 隨機(jī)平移比例 scale0.5, # 隨機(jī)縮放比例 shear0.0, # 隨機(jī)剪切幅度對(duì)于人體姿態(tài)建議設(shè)為0或很小避免扭曲關(guān)鍵結(jié)構(gòu) flipud0.0, # 上下翻轉(zhuǎn)概率對(duì)于監(jiān)控視角上下翻轉(zhuǎn)通常不合理設(shè)為0 fliplr0.5, # 左右翻轉(zhuǎn)概率可以保留增加視角多樣性 mosaic1.0, # Mosaic增強(qiáng)概率小數(shù)據(jù)集神器強(qiáng)烈建議保持1.0 mixup0.0, # Mixup增強(qiáng)概率小數(shù)據(jù)集可謹(jǐn)慎嘗試0.1-0.2太高可能有害 )心得對(duì)于“翻越”這種方向性可能很重要的行為fliplr左右翻轉(zhuǎn)需要謹(jǐn)慎。因?yàn)閺淖笙蛴曳蛷挠蚁蜃蠓谖锢硎澜缡菍?duì)稱的可以增強(qiáng)。但flipud上下翻轉(zhuǎn)通常無意義因?yàn)楸O(jiān)控?cái)z像頭不會(huì)倒置安裝。shear剪切過度會(huì)導(dǎo)致人體嚴(yán)重變形建議關(guān)閉或設(shè)很小值。使用更嚴(yán)格的正則化增加權(quán)重衰減weight_decay如從0.0005提高到0.001給模型更大的約束。使用標(biāo)簽平滑Label Smoothing在model.train()中設(shè)置label_smoothing0.1可以緩解模型對(duì)訓(xùn)練標(biāo)簽的過度自信提升泛化能力。早停Early Stopping監(jiān)控驗(yàn)證集損失val/box_loss如果連續(xù)10-20個(gè)epoch不再下降甚至上升就果斷停止訓(xùn)練避免在過擬合的區(qū)域繼續(xù)訓(xùn)練。嘗試凍結(jié)部分網(wǎng)絡(luò)層這是遷移學(xué)習(xí)的常用技巧。你可以先凍結(jié)骨干網(wǎng)絡(luò)Backbone的大部分層只訓(xùn)練檢測(cè)頭Head讓模型先適應(yīng)新數(shù)據(jù)的分布訓(xùn)練幾輪后再解凍所有層進(jìn)行微調(diào)。YOLOv8中可以通過設(shè)置freeze參數(shù)來實(shí)現(xiàn)例如freeze10會(huì)凍結(jié)前10層。4.2 針對(duì)“翻越”場(chǎng)景的優(yōu)化思路輸入尺寸imgsz的選擇默認(rèn)640x640對(duì)于監(jiān)控場(chǎng)景可能不是最優(yōu)的。監(jiān)控視頻中目標(biāo)翻越的人通常只占畫面的一部分。如果原始圖片分辨率很高如1920x1080直接縮放到640會(huì)讓人體目標(biāo)變得過小丟失細(xì)節(jié)??梢試L試增大imgsz到960甚至1280但這會(huì)顯著增加顯存消耗和訓(xùn)練時(shí)間。一個(gè)折中的辦法是訓(xùn)練時(shí)用640推理部署時(shí)用更大的尺寸。Anchor Box的重新聚類YOLO系列早期版本使用預(yù)定義的Anchor框來匹配目標(biāo)。雖然YOLOv8是Anchor-Free的但了解這個(gè)概念仍有幫助。如果你的目標(biāo)翻越中的人寬高比與COCO數(shù)據(jù)集中的普通人差異很大比如因?yàn)樽藨B(tài)傾斜邊界框變得更“扁”或更“瘦”可以嘗試用你的數(shù)據(jù)集重新聚類生成Anchor但這在YOLOv8中不是必須步驟。關(guān)注困難樣本Hard Example訓(xùn)練幾輪后在驗(yàn)證集上運(yùn)行模型找出那些預(yù)測(cè)置信度低、或者被錯(cuò)誤檢測(cè)漏檢、誤檢的圖片。把這些圖片單獨(dú)拿出來分析原因是光照太暗遮擋嚴(yán)重還是姿態(tài)過于罕見可以考慮對(duì)這些困難樣本進(jìn)行有針對(duì)性的數(shù)據(jù)增強(qiáng)比如專門對(duì)暗光圖片做亮度增強(qiáng)或者人工補(bǔ)充一些類似的樣本到訓(xùn)練集中這是提升模型在邊界case上表現(xiàn)的有效方法。4.3 訓(xùn)練中常見錯(cuò)誤與排查問題Loss為NaN或突然變得巨大。排查首先檢查數(shù)據(jù)標(biāo)注。YOLO格式的坐標(biāo)值必須在0-1之間。一個(gè)常見的錯(cuò)誤是標(biāo)注時(shí)使用了絕對(duì)坐標(biāo)但忘記除以圖片寬高進(jìn)行歸一化導(dǎo)致坐標(biāo)值遠(yuǎn)大于1。編寫一個(gè)簡(jiǎn)單的腳本遍歷所有.txt文件檢查數(shù)值范圍。排查學(xué)習(xí)率lr0是否設(shè)置過高對(duì)于小數(shù)據(jù)集和微調(diào)任務(wù)學(xué)習(xí)率通常要調(diào)低。嘗試從0.01降到0.001甚至0.0001。排查檢查圖片格式。確保所有圖片都能被正常讀取如不是損壞的圖片通道數(shù)正確。問題mAP50始終很低比如低于0.5。排查驗(yàn)證集劃分是否合理確保驗(yàn)證集中的圖片場(chǎng)景和訓(xùn)練集有差異但又不是完全沒見過的極端情況。糟糕的劃分會(huì)導(dǎo)致指標(biāo)失真。排查類別不平衡雖然我們只有一類但如果正樣本有翻越行為的幀和負(fù)樣本背景或無目標(biāo)幀比例失衡也會(huì)影響學(xué)習(xí)。確保數(shù)據(jù)集中每張圖都至少包含一個(gè)目標(biāo)。排查模型容量不足或過大嘗試換一個(gè)尺寸的模型如從nano換到small或反之。問題訓(xùn)練速度非常慢。排查batch size是否太小在GPU顯存允許的情況下增大batch size能提高訓(xùn)練效率和穩(wěn)定性。但注意batch size增大會(huì)降低模型更新的隨機(jī)性可能影響最終精度需要適當(dāng)調(diào)低學(xué)習(xí)率。排查workers數(shù)據(jù)加載進(jìn)程數(shù)是否設(shè)置合理通常設(shè)置為CPU核心數(shù)的2-4倍。設(shè)置過小會(huì)導(dǎo)致數(shù)據(jù)加載成為瓶頸GPU空閑等待。5. 模型驗(yàn)證、部署與應(yīng)用思考訓(xùn)練完成后在runs/detect/fence_climb_exp1/weights目錄下會(huì)得到兩個(gè)關(guān)鍵模型文件best.pt驗(yàn)證集上表現(xiàn)最好的權(quán)重和last.pt最后一輪的權(quán)重。我們應(yīng)使用best.pt進(jìn)行后續(xù)操作。5.1 模型性能驗(yàn)證使用訓(xùn)練好的模型在獨(dú)立的測(cè)試集如果預(yù)留了的話或驗(yàn)證集上運(yùn)行生成詳細(xì)的評(píng)估報(bào)告和可視化結(jié)果。from ultralytics import YOLO # 加載訓(xùn)練好的最佳模型 model YOLO(runs/detect/fence_climb_exp1/weights/best.pt) # 在驗(yàn)證集上評(píng)估 metrics model.val(datadatasets/fence_climb/data.yaml) print(metrics.box.map) # 打印mAP50-95 print(metrics.box.map50) # 打印mAP50 # 對(duì)單張圖片或一個(gè)文件夾進(jìn)行推理并可視化 results model.predict(sourcepath/to/test_image.jpg, conf0.25, # 置信度閾值可調(diào) iou0.45, # NMS的IoU閾值 saveTrue, # 保存結(jié)果圖片 show_labelsTrue, show_confTrue)查看生成的預(yù)測(cè)圖片直觀判斷模型的表現(xiàn)邊界框是否準(zhǔn)確有沒有明顯的誤檢如把攀爬樓梯的人誤認(rèn)為翻越欄桿或漏檢特別是在夜間、雨天、目標(biāo)較小等困難場(chǎng)景下。5.2 模型部署與集成對(duì)于安防應(yīng)用最終模型需要集成到實(shí)際的視頻分析流程中。有幾種常見的部署方式Python API直接調(diào)用最簡(jiǎn)單的方式在Python后端服務(wù)中加載best.pt使用model.predict()對(duì)視頻流逐幀分析。優(yōu)點(diǎn)是靈活便于調(diào)試缺點(diǎn)是依賴完整的PyTorch和Ultralytics環(huán)境性能可能不是最優(yōu)。導(dǎo)出為ONNX格式ONNX是一種開放的模型交換格式可以被多種推理引擎支持如OpenVINO, TensorRT, ONNX Runtime。model.export(formatonnx, imgsz640, simplifyTrue)導(dǎo)出ONNX后你可以使用ONNX Runtime進(jìn)行高性能的CPU推理或者進(jìn)一步轉(zhuǎn)到其他平臺(tái)。導(dǎo)出為TensorRT引擎如果你有NVIDIA GPU并且追求極致的推理速度可以將模型導(dǎo)出為TensorRT格式。這通常能獲得數(shù)倍甚至數(shù)十倍的性能提升。YOLOv8支持直接導(dǎo)出為TensorRT的.engine文件但需要配置好CUDA和TensorRT環(huán)境。集成到邊緣設(shè)備對(duì)于端側(cè)部署如海思、瑞芯微等AI芯片的NVR或IPC需要將模型轉(zhuǎn)換為設(shè)備廠商提供的專用格式如.wk、.rknn。這通常需要借助廠商提供的轉(zhuǎn)換工具鏈流程會(huì)更復(fù)雜一些。5.3 從檢測(cè)到報(bào)警的業(yè)務(wù)邏輯模型輸出的是每一幀中“翻越”目標(biāo)的邊界框和置信度。要形成有效的報(bào)警還需要上層業(yè)務(wù)邏輯目標(biāo)跟蹤Tracking單純的目標(biāo)檢測(cè)是逐幀獨(dú)立的會(huì)出現(xiàn)同一個(gè)目標(biāo)在連續(xù)幀中被識(shí)別為多個(gè)不同ID的情況。需要集成跟蹤算法如ByteTrack, DeepSORT來為每個(gè)目標(biāo)分配唯一ID并形成運(yùn)動(dòng)軌跡。區(qū)域入侵判斷結(jié)合目標(biāo)的軌跡和預(yù)先劃定的警戒區(qū)域ROI, Region of Interest進(jìn)行判斷。只有當(dāng)目標(biāo)軌跡與警戒區(qū)域相交并且持續(xù)一定時(shí)間或滿足特定動(dòng)作模式如從區(qū)域外進(jìn)入?yún)^(qū)域內(nèi)時(shí)才觸發(fā)報(bào)警。這可以過濾掉在欄桿附近正常行走的人。報(bào)警去重與上報(bào)為了避免對(duì)同一事件連續(xù)報(bào)警需要設(shè)置報(bào)警間隔。同時(shí)報(bào)警信息需要結(jié)構(gòu)化時(shí)間、地點(diǎn)、截圖、視頻片段并上報(bào)到中心管理平臺(tái)。這個(gè)512張的“翻越欄桿檢測(cè)數(shù)據(jù)集”就是一個(gè)很好的起點(diǎn)。你可以用它訓(xùn)練出一個(gè)基礎(chǔ)可靠的檢測(cè)器作為整個(gè)智能分析管道的第一環(huán)。在實(shí)際項(xiàng)目中你很可能還需要根據(jù)具體的攝像頭角度、欄桿類型、光照環(huán)境收集更多的數(shù)據(jù)對(duì)模型進(jìn)行迭代優(yōu)化這就是一個(gè)持續(xù)的模型運(yùn)維過程了。本文還有配套的精品資源點(diǎn)擊獲取