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