項(xiàng)目實(shí)戰(zhàn):從數(shù)據(jù)集準(zhǔn)備到模型訓(xùn)練與評(píng)估)
簡(jiǎn)介本資源是一套面向計(jì)算機(jī)及相關(guān)專業(yè)本科生的跌倒檢測(cè)實(shí)戰(zhàn)項(xiàng)目專為畢業(yè)設(shè)計(jì)與期末大作業(yè)打造基于YOLOv8目標(biāo)檢測(cè)框架構(gòu)建端到端可運(yùn)行系統(tǒng)解決老年人居家安全監(jiān)測(cè)中的關(guān)鍵行為識(shí)別問題。壓縮包共24個(gè)文件66.14MB涵蓋5個(gè)核心Python腳本含模型訓(xùn)練、推理、Qt界面交互、5個(gè)權(quán)重文件含yolov8n.pt基礎(chǔ)模型及falldown.pt等訓(xùn)練成果、2個(gè)UI界面文件、4個(gè)SVG圖標(biāo)資源、2個(gè)視頻/圖像演示素材及requirements.txt等環(huán)境配置文件結(jié)構(gòu)清晰、模塊分工明確。已有124人下載學(xué)習(xí)項(xiàng)目經(jīng)導(dǎo)師指導(dǎo)并獲98分高分評(píng)價(jià)所有代碼均本地實(shí)測(cè)可運(yùn)行配套數(shù)據(jù)集完整、注釋詳盡附帶demo演示視頻與圖文說明顯著降低調(diào)試門檻特別適合深度學(xué)習(xí)入門者開展真實(shí)場(chǎng)景項(xiàng)目實(shí)踐。 每年到了答辯季總能看到一批做跌倒檢測(cè)的同學(xué)在群里問同一個(gè)問題檢測(cè)模型到底選什么框架、數(shù)據(jù)集怎么處理、loss曲線長(zhǎng)什么樣才算正常。說實(shí)話跌倒檢測(cè)這個(gè)題目從課程設(shè)計(jì)一路火到畢業(yè)設(shè)計(jì)不是沒有原因的——它既是目標(biāo)檢測(cè)的標(biāo)準(zhǔn)落地場(chǎng)景又帶著一點(diǎn)“醫(yī)療健康智慧養(yǎng)老”的加分項(xiàng)做出來有演示效果也好講PPT。但很多同學(xué)拿到選題之后第一反應(yīng)是去GitHub上找個(gè)現(xiàn)成的代碼庫跑通了就以為完事了結(jié)果一到答辯就被老師問住你的數(shù)據(jù)集怎么劃分的為什么用YOLOv8而不是YOLOv5你畫的這堆曲線說明了什么這篇內(nèi)容就是把這些坑一個(gè)個(gè)踩平。我會(huì)從方案選型的邏輯、數(shù)據(jù)集準(zhǔn)備的全流程、訓(xùn)練參數(shù)的手把手調(diào)整、loss曲線和指標(biāo)的可視化解讀再到最終模型的評(píng)估和導(dǎo)出完整拆一遍基于YOLOv8的跌倒檢測(cè)項(xiàng)目。如果你正在做這個(gè)題目或者打算拿它當(dāng)畢設(shè)/期末大作業(yè)這篇文章能幫你少走至少兩星期的彎路。說明本文適用于課程設(shè)計(jì)、期末大作業(yè)和本科畢業(yè)設(shè)計(jì)場(chǎng)景。整體方案以“單人可見光視頻中的跌倒檢測(cè)”為任務(wù)主線兼顧工程可復(fù)現(xiàn)性和論文可寫性。1. 方案選型為什么大家都在用YOLOv8做跌倒檢測(cè)1.1 跌倒檢測(cè)到底屬于什么類型的問題先說清楚任務(wù)本質(zhì)。跌倒檢測(cè)在計(jì)算機(jī)視覺里的常規(guī)解法有三條路一是基于目標(biāo)檢測(cè)把“人”作為檢測(cè)對(duì)象再通過人體框的寬高比變化、中心點(diǎn)位移速度、關(guān)鍵點(diǎn)角度等幾何特征進(jìn)一步判斷是否跌倒二是基于姿態(tài)估計(jì)比如OpenPose、MediaPipe、YOLOv8-pose提取人體關(guān)鍵點(diǎn)坐標(biāo)然后通過關(guān)鍵點(diǎn)之間的角度關(guān)系判斷姿態(tài)三是基于行為識(shí)別模型比如SlowFast、TSM這類視頻理解網(wǎng)絡(luò)直接把一短段視頻作為輸入輸出“跌倒/正?!钡姆诸惤Y(jié)果。三條路各有各的坑。行為識(shí)別模型效果是很強(qiáng)但你需要大量的跌倒視頻片段做訓(xùn)練算力需求也高普通學(xué)生黨一張1660Ti跑起來非常吃力姿態(tài)估計(jì)方案在單人場(chǎng)景下效果很好但一旦畫面里出現(xiàn)兩個(gè)人、有遮擋關(guān)鍵點(diǎn)就會(huì)亂跳后期還得自己寫一套邏輯來判斷“關(guān)鍵點(diǎn)提供的姿態(tài)信息是否可靠”目標(biāo)檢測(cè)方案看起來最“笨”但勝在穩(wěn)定、好訓(xùn)練、好解釋而且檢測(cè)框的寬高比和位移速度在跌倒場(chǎng)景中是一個(gè)區(qū)分度很高的特征。YOLOv8本質(zhì)上是錨定“目標(biāo)檢測(cè)”這條技術(shù)路線的它負(fù)責(zé)把畫面里的每個(gè)人穩(wěn)定地框出來。跌倒判斷邏輯你可以放在檢測(cè)框的幾何特征上進(jìn)行二次判斷也可以把跌倒作為一個(gè)獨(dú)立類別直接訓(xùn)練。用在畢設(shè)里的好處很明顯模型訓(xùn)練在目標(biāo)檢測(cè)框架里屬于最成熟的一類資料多、問題少、好調(diào)參而且YOLOv8本身提供了檢測(cè)、分類、姿態(tài)估計(jì)三個(gè)版本哪怕你中途想換方案代碼邏輯也不用推翻重來。1.2 YOLOv5、YOLOv8和RT-DETR怎么選很多同學(xué)的糾結(jié)點(diǎn)在于都2024/2025年了選YOLOv5會(huì)不會(huì)過時(shí)選最新的RT-DETR是不是更有競(jìng)爭(zhēng)力我的觀點(diǎn)是畢業(yè)設(shè)計(jì)求穩(wěn)YOLOv8是性價(jià)比最高的選擇。YOLOv5發(fā)布于2020年社區(qū)生態(tài)極其成熟網(wǎng)上大量教程但結(jié)構(gòu)相對(duì)老舊在訓(xùn)練速度、小目標(biāo)檢出能力上已經(jīng)跟不上。YOLOv8是Ultralytics在2023年初發(fā)布的版本相比v5做了幾個(gè)關(guān)鍵改動(dòng)一是把a(bǔ)nchor-based改成了anchor-free省掉了錨框聚類這一步訓(xùn)練代碼更簡(jiǎn)潔二是把分類頭和回歸頭解耦每個(gè)任務(wù)用獨(dú)立的卷積分支收斂速度有提升三是在Backbone里用C2f模塊替代C3模塊梯度流動(dòng)更充分特征提取能力更強(qiáng)。RT-DETR是百度提出的實(shí)時(shí)DETR方案精度確實(shí)不錯(cuò)它把Transformer結(jié)構(gòu)引入了實(shí)時(shí)檢測(cè)但訓(xùn)練和推理的配置門檻更高而且對(duì)畢設(shè)來說答辯老師未必熟悉這個(gè)模型講解成本反而更高。YOLOv8的生態(tài)優(yōu)勢(shì)是壓倒性的數(shù)據(jù)集格式一鍵轉(zhuǎn)換、訓(xùn)練命令一條龍、可視化面板齊全社區(qū)文檔和教程密度在同類項(xiàng)目里幾乎沒有對(duì)手。1.3 YOLOv8內(nèi)部結(jié)構(gòu)速覽至少能講到答辯PPT里的內(nèi)容如果被老師問到“你對(duì)YOLOv8的結(jié)構(gòu)了解多少”至少要把下面這幾層講清楚。YOLOv8的主體結(jié)構(gòu)拆成三塊Backbone負(fù)責(zé)提取特征用的是CSPDarknet結(jié)構(gòu)的改進(jìn)版核心模塊是C2fNeck負(fù)責(zé)多尺度特征融合沿用PAN-FPN結(jié)構(gòu)把淺層的細(xì)節(jié)信息和深層的語義信息反復(fù)融合Head是解耦檢測(cè)頭分別輸出類別概率和邊界框回歸結(jié)果。因?yàn)椴捎胊nchor-free思路YOLOv8的輸出實(shí)際上是一個(gè)特征圖上每個(gè)位置對(duì)“這里是否有一個(gè)目標(biāo)”的評(píng)分加上到邊界框四條邊的距離不再依賴預(yù)設(shè)的錨框尺寸。在實(shí)際操作中不需要手寫這些模塊直接用ultralytics庫的YOLO類就能完成訓(xùn)練和推理。但理解結(jié)構(gòu)有個(gè)直接好處一旦訓(xùn)練效果不好你能根據(jù)特征圖尺寸、感受野大小、Neck融合方式這些基礎(chǔ)概念判斷問題出在哪個(gè)環(huán)節(jié)而不是瞎調(diào)參數(shù)。比如小目標(biāo)檢測(cè)效果差大概率是Backbone下采樣倍數(shù)太大導(dǎo)致小物體特征丟失跌倒這種目標(biāo)通常占畫面比例不小所以YOLOv8默認(rèn)的640輸入尺寸是夠用的。2. 數(shù)據(jù)集準(zhǔn)備這一步的質(zhì)量直接決定模型上限2.1 公開數(shù)據(jù)集怎么找、怎么評(píng)估跌倒檢測(cè)沒有統(tǒng)一的ImageNet數(shù)據(jù)基本靠“公開數(shù)據(jù)集自己補(bǔ)錄”的組合。整理一下我在項(xiàng)目中實(shí)際用過的幾類資源供你參考數(shù)據(jù)集名稱內(nèi)容特點(diǎn)適用場(chǎng)景獲取方式Le2i Fall Detection Dataset法國(guó)勒芒大學(xué)發(fā)布有多個(gè)場(chǎng)景咖啡廳、家庭、辦公室、演講廳視頻標(biāo)注包含正常行走和跌倒行為家庭、辦公環(huán)境下的跌倒檢測(cè)官網(wǎng)填表申請(qǐng)UR Fall Detection Dataset美國(guó)羅切斯特大學(xué)發(fā)布雙攝像頭加速度計(jì)數(shù)據(jù)不過視覺標(biāo)注相對(duì)粗糙多傳感器融合方案的參考官網(wǎng)注冊(cè)下載Multiple Cameras Fall Dataset多視角拍攝的跌倒視頻適合驗(yàn)證不同角度下的檢測(cè)效果提升模型對(duì)不同視角的魯棒性學(xué)術(shù)公開下載自建數(shù)據(jù)集手機(jī)/相機(jī)錄制的模擬跌倒視頻補(bǔ)充真實(shí)場(chǎng)景缺失的樣本自行采集這里有個(gè)關(guān)鍵點(diǎn)Le2i和UR這類學(xué)術(shù)數(shù)據(jù)集標(biāo)注格式通常是視頻幀級(jí)別的類別標(biāo)簽該幀是fall還是not fall或者Pascal VOC格式的檢測(cè)框。如果你打算用YOLOv8直接訓(xùn)練檢測(cè)器得先花時(shí)間把標(biāo)注轉(zhuǎn)換成YOLO的txt格式——每個(gè)目標(biāo)一行內(nèi)容是“類別id 中心點(diǎn)x 中心點(diǎn)y 寬度 高度”坐標(biāo)值都在0到1之間歸一化。2.2 標(biāo)注格式轉(zhuǎn)換繞不開的硬活我自己剛開始做的時(shí)候以為有了標(biāo)注文件就能直接開訓(xùn)結(jié)果打開一看是XML的VOC格式Y(jié)OLOv8根本不認(rèn)。轉(zhuǎn)換有兩條路一是自己寫Python腳本解析XML、生成txt二是用ultralytics提供的工具。下面是我在項(xiàng)目里用過的轉(zhuǎn)換腳本核心邏輯解析VOC標(biāo)注文件、生成YOLO格式import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_file, class_names, output_dir): tree ET.parse(xml_file) root tree.getroot() image_name root.find(filename).text img_width int(root.find(size/width).text) img_height int(root.find(size/height).text) yolo_lines [] for obj in root.iter(object): class_name obj.find(name).text if class_name not in class_names: continue class_id class_names.index(class_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) center_x (xmin xmax) / 2.0 / img_width center_y (ymin ymax) / 2.0 / img_height box_width (xmax - xmin) / img_width box_height (ymax - ymin) / img_height yolo_lines.append(f{class_id} {center_x:.6f} {center_y:.6f} {box_width:.6f} {box_height:.6f}) output_path os.path.join(output_dir, os.path.splitext(image_name)[0] .txt) with open(output_path, w) as f: f.write(\n.join(yolo_lines))這段代碼是模板級(jí)別的但你必須理解里面的關(guān)鍵細(xì)節(jié)坐標(biāo)必須除以圖片寬高做歸一化否則訓(xùn)練時(shí)檢測(cè)框會(huì)飛到天上去。另外VOC格式里有些標(biāo)注是帶人體各個(gè)部位框的比如head、hand這些轉(zhuǎn)換時(shí)要過濾掉只保留你要的person類別。2.3 數(shù)據(jù)增強(qiáng)的實(shí)用技巧用過YOLOv8自帶的增強(qiáng)策略之后可以評(píng)估一下效果。ultralytics在訓(xùn)練時(shí)默認(rèn)會(huì)做HSV色域擴(kuò)充、隨機(jī)翻轉(zhuǎn)、縮放、平移、馬賽克Mosaic等一系列增強(qiáng)這是模型在小規(guī)模數(shù)據(jù)集上還能有不錯(cuò)泛化能力的重要原因。數(shù)據(jù)增強(qiáng)這塊要把握一個(gè)度。Mosaic增強(qiáng)把4張圖拼接成一張能顯著提升小目標(biāo)檢測(cè)效果但如果跌倒在你的數(shù)據(jù)里往往是畫面里的大目標(biāo)Mosaic帶來的收益可能不如想象中高翻轉(zhuǎn)增強(qiáng)要注意跌倒這個(gè)行為本身就存在左右方向差異水平翻轉(zhuǎn)很安全但垂直翻轉(zhuǎn)基本用不上。如果你自己錄數(shù)據(jù)建議燈光、衣服顏色、攝像頭高度都做一些變化這比任何代碼層面的增強(qiáng)都實(shí)在。2.4 訓(xùn)練集/驗(yàn)證集/測(cè)試集怎么劃分這條我要放在第一個(gè)坑的位置講。不少同學(xué)直接拿著下載好的數(shù)據(jù)集連看都不看就丟進(jìn)YOLOv8訓(xùn)練結(jié)果驗(yàn)證集里出現(xiàn)了和訓(xùn)練集同視頻同場(chǎng)景的幀mAP曲線的漂亮程度嚴(yán)重虛高。答辯的時(shí)候老師問“你的模型在沒見過的場(chǎng)景上效果如何”你當(dāng)場(chǎng)就懵了。正確的劃分方式是以視頻為最小單位劃分而不是以幀為最小單位。一個(gè)視頻的所有幀要么全部進(jìn)訓(xùn)練集、要么全部進(jìn)驗(yàn)證集避免同一視頻中的相似幀出現(xiàn)在兩個(gè)集合中。分配比例上我建議訓(xùn)練集70%、驗(yàn)證集15%、測(cè)試集15%其中測(cè)試集在訓(xùn)練結(jié)束后只允許用一次用于最終評(píng)估。目錄結(jié)構(gòu)直接照這個(gè)來dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/YOLOv8的配置文件YAML會(huì)引用這三個(gè)目錄的路徑。3. 環(huán)境配置與模型選型從零搭一套可用訓(xùn)練流程3.1 版本兼容組合一步到位YOLOv8依賴PyTorch而PyTorch版本和CUDA版本之間兼容關(guān)系比較復(fù)雜。如果電腦用的是GTX 1660Ti這類圖靈架構(gòu)的顯卡或者RTX 30/40系列建議裝CUDA 11.8或者CUDA 12.1的PyTorch版本。我用下來的穩(wěn)定組合是這樣的Python 3.9或3.10PyTorch 2.0.1或2.1.0CUDA 11.8ultralytics最新版直接pip install ultralyticstorchvision和torch版本對(duì)應(yīng)安裝用conda創(chuàng)建虛擬環(huán)境最省心conda create -n yolo python3.9 conda activate yolo pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics說實(shí)話版本不必追新。2024年發(fā)布的PyTorch 2.3、2.4之類對(duì)YOLOv8沒有硬性支持增強(qiáng)反而可能引入一些兼容性問題。穩(wěn)定優(yōu)先。3.2 YOLOv8n/s/m/l/x選哪個(gè)YOLOv8按參數(shù)規(guī)模分了五個(gè)版本從輕到重依次是模型參數(shù)量(百萬)mAP50-95(COCO)推理速度(ms)適用場(chǎng)景YOLOv8n3.237.30.99移動(dòng)端、嵌入式、低算力YOLOv8s11.244.91.20課程設(shè)計(jì)首選YOLOv8m25.950.21.83畢業(yè)設(shè)計(jì)主力YOLOv8l43.752.92.39高精度要求算力充足YOLOv8x68.253.93.53攻關(guān)精度上限對(duì)于跌倒檢測(cè)這個(gè)任務(wù)我給你的建議是期末大作業(yè)選yolov8s畢業(yè)設(shè)計(jì)選yolov8m。原因很簡(jiǎn)單——我們的數(shù)據(jù)集規(guī)模通常在幾千到一萬幀之間n版本可能欠擬合x版本又嚴(yán)重過擬合且訓(xùn)練時(shí)間不可接受。我在1660Ti上實(shí)測(cè)下來yolov8s在640分辨率、batch_size16的情況下單輪epoch大概30到40秒訓(xùn)練100輪也就一小時(shí)左右yolov8m同樣條件下單輪約70到90秒100輪兩到三小時(shí)。這個(gè)量級(jí)對(duì)學(xué)生來說完全可控。3.3 預(yù)訓(xùn)練權(quán)重的選擇與下載YOLOv8支持三種訓(xùn)練形式從零訓(xùn)練隨機(jī)初始化、從預(yù)訓(xùn)練權(quán)重微調(diào)、從訓(xùn)練中斷的checkpoint繼續(xù)訓(xùn)練。我們的事例中大部分情況下選“從預(yù)訓(xùn)練權(quán)重微調(diào)”。from ultralytics import YOLO # 自動(dòng)下載yolov8s.pt權(quán)重在COCO上預(yù)訓(xùn)練過 model YOLO(yolov8s.pt)這里有個(gè)底層原理值得理解YOLOv8在COCO數(shù)據(jù)集上已經(jīng)學(xué)會(huì)了對(duì)80類常見物體包括person的通用特征提取跌倒檢測(cè)本質(zhì)上是一個(gè)“基于人的特征進(jìn)行二次分類”的任務(wù)復(fù)用COCO預(yù)訓(xùn)練權(quán)重比從零開始訓(xùn)練要省大量時(shí)間最后精度也更高。但要注意COCO預(yù)訓(xùn)練權(quán)重里沒有“跌倒”這個(gè)類別。所以第一次訓(xùn)練時(shí)模型會(huì)經(jīng)歷一個(gè)“遺忘”過程把原來對(duì)person類別的認(rèn)知遷移到你的跌倒類別上。如果訓(xùn)練輪數(shù)太少比如只有10輪最后的檢測(cè)效果會(huì)非常不穩(wěn)定——因?yàn)槟銢]有給它足夠的輪數(shù)去完成知識(shí)遷移。4. 訓(xùn)練實(shí)操命令、參數(shù)、日志可視化全解讀4.1 數(shù)據(jù)配置文件YAML怎么寫這是最容易出錯(cuò)的一步先給一個(gè)可以直接套用的模板# fall_dataset.yaml path: D:/projects/fall_detection/dataset train: train/images val: val/images test: test/images nc: 2 names: [ person, fall ]這里有兩個(gè)坑值得注意第一個(gè)是path字段的路徑分隔符Windows下建議用絕對(duì)路徑且使用正斜杠不要用反斜杠否則在某些版本的ultralytics里會(huì)報(bào)路徑錯(cuò)誤第二個(gè)是在訓(xùn)練前打開數(shù)據(jù)集的索引確認(rèn)類別id有沒有搞反如果你把name列表寫成了[fall, person]但標(biāo)注txt文件里類別0是person那模型訓(xùn)練出來就是混亂的。4.2 訓(xùn)練命令與關(guān)鍵參數(shù)說明在終端里直接執(zhí)行這一條就能開始訓(xùn)練yolo detect train \ datafall_dataset.yaml \ modelyolov8s.pt \ epochs100 \ batch16 \ imgsz640 \ device0 \ patience20 \ save_dirruns/detect/fall_exp按我自己的經(jīng)驗(yàn)把幾個(gè)最常用的參數(shù)解釋一下方便答辯時(shí)講得清楚參數(shù)建議值作用備注epochs100訓(xùn)練輪數(shù)數(shù)據(jù)集量小、用預(yù)訓(xùn)練權(quán)重時(shí)100輪足夠batch16每批樣本數(shù)顯存不夠就降到8不要強(qiáng)行拉高imgsz640輸入圖像尺寸大圖檢測(cè)精度好但顯存和耗時(shí)線性增加patience20早停容忍輪數(shù)如果20輪內(nèi)驗(yàn)證集指標(biāo)不再提升自動(dòng)停止device0使用顯卡編號(hào)CPU訓(xùn)練極度不推薦速度慢到懷疑人生lr00.01初始學(xué)習(xí)率大多場(chǎng)景默認(rèn)值就行不要亂動(dòng)workers4數(shù)據(jù)加載線程數(shù)Windows下設(shè)置過高容易報(bào)錯(cuò)最容易被忽視的是workers參數(shù)。在Windows系統(tǒng)上workers設(shè)置為大于0時(shí)ultralytics需要ifname main保護(hù)否則會(huì)報(bào)多進(jìn)程錯(cuò)誤。如果你習(xí)慣用Jupyter Notebook訓(xùn)練直接把workers設(shè)為0是最省事的做法。4.3 訓(xùn)練過程中怎么實(shí)時(shí)看效果YOLOv8會(huì)在訓(xùn)練結(jié)束后生成一張results.png這張圖包含了所有訓(xùn)練指標(biāo)的變化趨勢(shì)上面通常有box_loss、cls_loss、dfl_loss、precision、recall、mAP50、mAP50-95這8條子圖。判斷訓(xùn)練是否正常的標(biāo)準(zhǔn)是loss曲線應(yīng)當(dāng)整體呈下降趨勢(shì)最終在某個(gè)區(qū)間內(nèi)小幅震蕩mAP50曲線應(yīng)當(dāng)逐步上升然后趨于平緩實(shí)線的train_loss和虛線的val_loss之間的差距如果越來越大說明模型在過擬合。如果訓(xùn)練過程中想實(shí)時(shí)看效果可以打開runs/detect/fall_exp/目錄下的train_batch*.jpg圖片這些是每個(gè)batch傳入網(wǎng)絡(luò)的增強(qiáng)后圖片你一眼就能看出當(dāng)前輪次的訓(xùn)練數(shù)據(jù)長(zhǎng)什么樣這是判斷數(shù)據(jù)增強(qiáng)設(shè)置是否合理的直觀手段。還可以在訓(xùn)練結(jié)束后運(yùn)行測(cè)試腳本把模型的結(jié)果可視化輸出到圖片上比單看曲線更容易建立直覺。4.4 想要自己畫loss曲線怎么操作如果你不想用ultralytics內(nèi)置的results.png想畫一張個(gè)性化的loss曲線放論文里可以直接讀取訓(xùn)練日志——YOLOv8會(huì)在訓(xùn)練時(shí)把每個(gè)epoch的指標(biāo)記錄到results.csv里用pandas讀出來再用matplotlib畫就行。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/fall_exp/results.csv) df.columns [c.strip() for c in df.columns] plt.figure(figsize(10, 6)) plt.plot(df[epoch], df[train/box_loss], labeltrain box_loss) plt.plot(df[epoch], df[val/box_loss], labelval box_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.title(Box Loss Curve) plt.legend() plt.grid(True) plt.savefig(box_loss_curve.png, dpi300)這里有個(gè)小坑results.csv的列名里有些帶前導(dǎo)空格讀取之后要記得strip一下否則直接按列名索引會(huì)報(bào)KeyError。另外如果用了早停機(jī)制epoch可能到不了你設(shè)置的100——這是正常的說明模型在約80輪左右就已經(jīng)收斂了。5. 模型評(píng)估與部署別讓畢設(shè)停在“能跑”這一步5.1 評(píng)估指標(biāo)的解讀訓(xùn)練結(jié)束后YOLOv8會(huì)運(yùn)行驗(yàn)證集評(píng)估并輸出一個(gè)PR曲線Precision-Recall曲線、混淆矩陣、F1曲線等文件。答辯時(shí)被問最多的幾個(gè)指標(biāo)請(qǐng)你務(wù)必爛熟于心Precision精確率預(yù)測(cè)為跌倒的樣本中真正是跌倒的比例。反映了模型“報(bào)得準(zhǔn)不準(zhǔn)”。Recall召回率所有實(shí)際跌倒的樣本中被模型正確找出來的比例。反映了模型“找得全不全”。mAP50IoU閾值為0.5時(shí)各類別AP的均值是目標(biāo)檢測(cè)最常用的指標(biāo)。mAP50-95IoU閾值從0.5到0.95變化時(shí)AP的平均值評(píng)價(jià)更嚴(yán)格論文里寫這個(gè)更有分量。跌倒檢測(cè)這個(gè)場(chǎng)景里我更關(guān)注Recall而不是Precision——漏報(bào)一個(gè)跌倒的后果遠(yuǎn)比誤報(bào)一次嚴(yán)重得多。換句話說寧可讓系統(tǒng)偶爾把“蹲下?lián)鞏|西”誤報(bào)成跌倒也不能讓真實(shí)跌倒事件被漏掉。因此調(diào)參時(shí)可以適當(dāng)降低置信度閾值犧牲一些precision換取更高的recall。5.2 圖片、視頻、攝像頭的實(shí)際測(cè)試驗(yàn)證集評(píng)估是輸出指標(biāo)但論文里還需要你貼幾張測(cè)試圖片的檢測(cè)效果圖讓人直觀看到模型在“沒見過的數(shù)據(jù)”上的表現(xiàn)。用代碼跑一下推理from ultralytics import YOLO model YOLO(runs/detect/fall_exp/weights/best.pt) results model.predict(test_video.mp4, conf0.35, saveTrue, device0)如果測(cè)試結(jié)果里跌倒目標(biāo)沒有被識(shí)別出來排查方向優(yōu)先級(jí)是置信度閾值是否太高、測(cè)試數(shù)據(jù)是否跟上訓(xùn)練數(shù)據(jù)有較大分布差異、模型是否欠擬合。試過一遍后發(fā)現(xiàn)大多數(shù)情況下調(diào)低conf就能解決。電腦沒有攝像頭也能測(cè)給模型傳入一張圖片或者一段MP4視頻YOLOv8會(huì)自動(dòng)處理完并保存帶標(biāo)注的新的視頻文件。5.3 模型導(dǎo)出與嵌入式部署思路如果你有余力把模型導(dǎo)出成ONNX格式可以在論文里講一句“模型可部署到邊緣設(shè)備”這是不少答辯老師的加分點(diǎn)。yolo export modelruns/detect/fall_exp/weights/best.pt formatonnx imgsz640導(dǎo)出后的ONNX文件可以用ONNX Runtime在CPU上離線推理也可以進(jìn)一步轉(zhuǎn)成NCNN/TensorRT適配手機(jī)或嵌入式設(shè)備。但這里要提醒一句YOLOv8導(dǎo)出的ONNX在推理時(shí)輸入輸出和PyTorch版本略有差異如果要用ONNX Runtime做推理注意輸入的圖片預(yù)處理letterbox縮放必須和訓(xùn)練時(shí)保持一致否則檢測(cè)框會(huì)偏移。5.4 把跌倒檢測(cè)從“單幀”升級(jí)成“時(shí)序判斷”這是把課程設(shè)計(jì)變成畢業(yè)設(shè)計(jì)的關(guān)鍵一步。單幀檢測(cè)只能告訴你“這一瞬間畫面里的人是站著還是躺著”但在真實(shí)場(chǎng)景里人躺著睡覺、坐著刷手機(jī)會(huì)被誤報(bào)成跌倒。正確做法是在檢測(cè)框的基礎(chǔ)上引入時(shí)序信息連續(xù)3到5幀內(nèi)人體檢測(cè)框的高度急劇變小、寬高比從大于1變?yōu)樾∮?同時(shí)檢測(cè)框中心點(diǎn)的移動(dòng)速度超過閾值這時(shí)候才判定為跌倒事件。這部分代碼不復(fù)雜核心就是維護(hù)一個(gè)隊(duì)列存儲(chǔ)最近N幀的檢測(cè)框信息from collections import deque class FallDetector: def __init__(self, history_len10): self.history deque(maxlenhistory_len) def update(self, box): # box [x1, y1, x2, y2] self.history.append(box) if len(self.history) 3: return False w box[2] - box[0] h box[3] - box[1] aspect_ratio w / max(h, 1e-6) prev_box self.history[-3] prev_h prev_box[3] - prev_box[1] height_ratio h / max(prev_h, 1e-6) # 連續(xù)多幀寬高比超過閾值并且高度驟降 if aspect_ratio 1.2 and height_ratio 0.6: return True return False時(shí)序判斷方案在答辯時(shí)特別好講故事它既體現(xiàn)工程能力又天然銜接“老人獨(dú)居環(huán)境下的跌倒監(jiān)護(hù)”這個(gè)應(yīng)用場(chǎng)景。6. 實(shí)戰(zhàn)中的高頻問題與排查記錄6.1 從數(shù)據(jù)到模型的全流程問題速查表現(xiàn)象可能原因排查建議訓(xùn)練loss不降反升學(xué)習(xí)率過高、數(shù)據(jù)集有錯(cuò)誤標(biāo)注觀察前幾個(gè)epoch把lr0降到0.001試試mAP50接近0類別id寫反、配置文件路徑錯(cuò)誤打開一個(gè)標(biāo)注txt逐行對(duì)照?qǐng)D片檢測(cè)框偏移不準(zhǔn)標(biāo)注框坐標(biāo)沒有歸一化、letterbox預(yù)處理沒有對(duì)齊運(yùn)行時(shí)預(yù)處理和訓(xùn)練保持一致驗(yàn)證集指標(biāo)很高但測(cè)試集很差數(shù)據(jù)泄漏同視頻幀被分到了訓(xùn)練和驗(yàn)證按視頻維度重新劃分?jǐn)?shù)據(jù)集顯存不足OOMbatch_size太大先把batch降到8甚至4Windows下訓(xùn)練卡死workers多進(jìn)程沖突workers設(shè)為0或在if __name__中運(yùn)行導(dǎo)出的ONNX推理結(jié)果不對(duì)預(yù)處理不一致檢查letterbox縮放參數(shù)和歸一化方式6.2 關(guān)于loss曲線的一些心法看loss曲線我習(xí)慣分三段看。前20輪重點(diǎn)看下降速度如果box_loss到第20輪還沒降到1.0以下說明學(xué)習(xí)率不合適或者數(shù)據(jù)集有問題20到60輪重點(diǎn)看驗(yàn)證集loss和訓(xùn)練集loss之間的間距間距持續(xù)拉大就是過擬合的早期信號(hào)最后20輪重點(diǎn)看波動(dòng)幅度如果曲線震蕩特別劇烈可以適當(dāng)降低學(xué)習(xí)率或者加大batch size來穩(wěn)定訓(xùn)練。還有一點(diǎn)YOLOv8的class loss和dfl loss在訓(xùn)練后期可能出現(xiàn)“鋸齒狀”波動(dòng)只要幅度不大是正?,F(xiàn)象不必恐慌。真正需要警惕的是val loss在某個(gè)epoch之后突然大幅上升這種時(shí)候直接停止訓(xùn)練回到上一個(gè)checkpointYOLOv8會(huì)在每個(gè)epoch保存last.pt和best.ptbest.pt就是驗(yàn)證集指標(biāo)最好的權(quán)重。6.3 和數(shù)據(jù)有關(guān)的三個(gè)獨(dú)家提醒第一公開數(shù)據(jù)集通常只包含“跌倒”和“正常行走”兩類但真實(shí)場(chǎng)景里還有“蹲下”“坐下”“躺下”這些容易被誤判的行為。建議在這些干擾行為上額外采集一些負(fù)樣本否則模型做出來的誤報(bào)率會(huì)高到?jīng)]法演示。第二標(biāo)注時(shí)不要只框一個(gè)全身框就完了跌倒檢測(cè)對(duì)人體的姿態(tài)變化很敏感如果標(biāo)注框里包含了過多的背景區(qū)域比如框得太大模型學(xué)到的特征會(huì)摻雜背景信息。建議標(biāo)注時(shí)緊貼人體輪廓。第三數(shù)據(jù)平衡問題。跌倒樣本在真實(shí)場(chǎng)景中天然稀缺如果訓(xùn)練集中fall類別的圖片只有100張person類別有2000張模型會(huì)把所有目標(biāo)都預(yù)測(cè)為person。解決方式要么是給fall類別增加損失權(quán)重要么是復(fù)制跌倒樣本并做增強(qiáng)讓兩個(gè)類別的樣本數(shù)量接近1:1或者2:1。7. 項(xiàng)目復(fù)盤與個(gè)人經(jīng)驗(yàn)做一個(gè)YOLOv8跌倒檢測(cè)項(xiàng)目最核心的收獲不是跑通代碼而是建立起“數(shù)據(jù)質(zhì)量決定模型上限”這個(gè)意識(shí)。我見過太多同學(xué)花兩周時(shí)間調(diào)參mAP始終上不去最后發(fā)現(xiàn)是標(biāo)注文件里有一半的框坐標(biāo)畫錯(cuò)了——模型在垃圾數(shù)據(jù)上學(xué)到的只能是垃圾規(guī)律。依賴關(guān)系管理上建議一開始就把requirement.txt鎖好版本不要東一個(gè)pip install西一個(gè)conda install說不定哪天某個(gè)依賴升級(jí)就把結(jié)果弄變了。我們項(xiàng)目組曾經(jīng)因?yàn)镹umPy版本升級(jí)導(dǎo)致某個(gè)數(shù)據(jù)集加載腳本出現(xiàn)神秘bug排查到后半夜才發(fā)現(xiàn)是版本問題。資源有限的條件下我的實(shí)際體驗(yàn)是先拿小模型yolov8s跑通全流程確定數(shù)據(jù)和配置沒問題后再換大模型yolov8m或yolov8l做最終訓(xùn)練。這樣可以避免一次訓(xùn)練幾十個(gè)小時(shí)后發(fā)現(xiàn)數(shù)據(jù)標(biāo)錯(cuò)了白白浪費(fèi)時(shí)間。最后想說的是跌倒檢測(cè)這個(gè)題目雖然被做爛了但它是少數(shù)幾個(gè)能把模型訓(xùn)練、數(shù)據(jù)處理、時(shí)序分析、工程部署全都串起來的題目。只要老老實(shí)實(shí)把每一步做扎實(shí)答辯時(shí)根本不需要刻意準(zhǔn)備什么“亮點(diǎn)”因?yàn)槊恳豁?xiàng)拿出來都是實(shí)打?qū)嵉某晒?。希望你也能從這個(gè)項(xiàng)目中拿到的不只是學(xué)分更是對(duì)深度學(xué)習(xí)落地流程的完整理解。本文還有配套的精品資源點(diǎn)擊獲取