
簡介基于YOLOv8的跌倒檢測項目提供完整畢業設計資料適合高校學生和開發者用于學習目標檢測與模型訓練。資源打包了精心標注的圖片數據集、Python訓練代碼、模型權重文件和說明文檔其中包含1428張跌倒與非跌倒場景圖片樣本源碼腳本覆蓋數據加載、模型配置、數據增強、訓練與評估等關鍵環節另有pt和onnx格式的模型文件可直接用于推理與部署。整個壓縮包共1437個文件容量約78MB目錄層級清晰便于按需查閱與二次開發。目前已有91人學習下載通過學習可深入理解YOLOv8的訓練原理和調參策略并掌握從數據集構造到模型部署的完整工程實踐能夠為老年人監護、智能監控等場景提供實時跌倒檢測方案是課程設計或畢業設計的優質參考。1. 從監控畫面到主動守護為什么跌倒檢測需要專門的模型獨居老人房間的攝像頭每秒產生 25 幀畫面但真正的關鍵幀可能只有倒地瞬間的那 2 秒。用傳統幀差法或人體姿態估計算法做跌倒識別要么誤報率居高不下要么對遮擋和光照變化極度敏感。這個畢業設計項目用 YOLOv8 把跌倒檢測拆成目標框回歸 類別判定兩步在 Jeston Nano 級別的設備上就能跑到 30 FPS 以上既適合課程設計提交也適合作為智能安防產品的視覺感知基線。項目核心資產是三部分帶精確標注的跌倒/正常姿態圖片數據集、YOLOv8 訓練全流程源碼、以及模型調參與部署的完整經驗。數據集中包含了 fall_249.jpg、fall_324.jpg 這類來自真實監控視角的樣本覆蓋了側倒、前撲、被遮擋等多種姿態。如果你正在做智慧養老或工地安全相關的項目這套方案可以直接作為檢測層復用——你不需要從零收集數據也省去了踩訓練環境的坑。2. YOLOv8 網絡結構拆解C2f 模塊與 Anchor-Free 頭如何適配跌倒檢測2.1 從 YOLOv5 到 YOLOv8C2f 結構的改進邏輯YOLOv8 在骨干網絡部分延續了 CSPNet 的設計思路但把 YOLOv5 的 C3 模塊替換成了 C2fCross Stage Partial with 2 convolutions and bottleneck fusion。C2f 的核心區別在于它把輸入特征圖同時送入兩個分支一個分支經過 1x1 卷積降維后直接輸出另一個分支進入 n 個 Bottleneck 堆疊最后把兩個分支的輸出在通道維度上拼接。這種設計讓梯度回傳時有更多短路徑淺層特征和深層語義特征能更充分地融合。對跌倒檢測來說這個改進直接帶來的收益是當人體姿態發生劇烈形變比如從站立到倒地模型需要同時依賴四肢展開這種局部特征和身體主軸方向突變這種全局特征。我在訓練時對比過 YOLOv5s 和 YOLOv8s 在相同數據下的表現C2f 結構在召回率上大約有 2~3% 的提升尤其是在遮擋樣本上。# ultralytics/nn/modules.py 中 C2f 的簡化實現邏輯 class C2f(nn.Module): def __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5): super().__init__() self.c int(c2 * e) # 隱藏層通道數 self.cv1 Conv(c1, 2 * self.c, 1, 1) self.cv2 Conv((2 n) * self.c, c2, 1) # 拼接后的卷積 self.m nn.ModuleList([ Bottleneck(self.c, self.c, shortcut, g, k3, e1.0) for _ in range(n) ]) def forward(self, x): y list(self.cv1(x).chunk(2, 1)) # 按通道分成兩個分支 y.extend(m(y[-1]) for m in self.m) # 第二個分支通過n個Bottleneck return self.cv2(torch.cat(y, 1)) # 拼接所有分支輸出這段代碼展示了 C2f 的 forward 流程。cv1把輸入從c1通道映射到2 * self.c然后分成兩塊其中一塊作為恒等映射直接送入最后的拼接另一塊依次通過n個 Bottleneck。最終cv2把拼接后的多尺度特征壓縮到輸出通道數。參數上需要注意e0.5控制隱藏層寬度如果你的訓練集很小少于 2000 張我建議把n從默認的 3 降到 1減少參數量也能防止過擬合。2.2 Anchor-Free 檢測頭與 TaskAlignedAssigner 標簽分配YOLOv8 把檢測頭從 YOLOv5 的 Anchor-Based 換成了 Anchor-Free直接預測物體中心點到四條邊的距離不再需要預設 anchor 的寬高比例。這個改動對跌倒檢測有一個隱性好處跌倒姿態的寬高比變化極大正常站立時高寬比可能大于 3:1倒地時接近 1:2如果用固定 anchor 列表極端長寬比樣本的匹配度會不穩定。Anchor-Free 讓每個位置直接回歸到真實框省去了 anchor 聚類的步驟。# yolov8s.yaml 關鍵配置 # Parameters nc: 2 # 類別數0-fall, 1-normal scale: 0.50 # 模型縮放系數s/m/l/x 對應不同 depth_multiple # YOLOv8.0s backbone backbone: - [-1, 1, Conv, [64, 3, 2]] # P1/2 - [-1, 1, Conv, [128, 3, 2]] # P2/4nc在跌倒檢測里設為 2因為場景只區分跌倒和正常姿態。我曾經見過有人把類別設成 1只檢測跌倒但這樣訓練時模型會把所有行人當正樣本正常行走也會被誤判。scale: 0.50對應的是 s 版本如果你用 GTX 1660 Ti 這類 6GB 顯存的卡s 版本配合batch16是可以跑動的。如果你的數據里跌倒樣本特別少可以考慮用model YOLO(yolov8s.yaml).load(yolov8s.pt)做遷移學習骨干網絡能復用 COCO 數據集學到的基礎紋理特征。2.3 損失函數組合分類的 BCE 與回歸的 CIoU DFLYOLOv8 的損失函數和 YOLOv5 最大的不同在于引入了 Distribution Focal LossDFL。DFL 將回歸目標從直接預測一個連續值改為預測一個離散概率分布然后用期望值計算最終坐標。對于跌倒檢測來說邊界框的質量決定了下游行為識別的準確性——如果框偏了把倒地的人和旁邊的椅子框在一起后面做行為判斷就會出錯。# YOLOv8 損失計算的要點訓練日志中 loss 字段含義 # box_loss: CIoU DFL 的組合損失關注預測框與真實框的重合度 # cls_loss: BCEWithLogitsLoss二分類或多分類的類別損失 # dfl_loss: Distribution Focal Loss對邊界框回歸分布建模 results model.train( datafall_detect.yaml, epochs150, imgsz640, # 訓練完成后可以從 runs/detect/train/weights/ 目錄讀取 best.pt )訓練日志里三個 loss 值要分開看box_loss下降說明模型在學人在哪cls_loss下降說明在學這個姿勢是不是跌倒dfl_loss則影響框的貼合度。如果dfl_loss降不下去通常是標注框邊界本身模糊比如標注員把倒地時接觸地面的手臂部分畫進了框內這屬于標注噪聲不必過度調參。3. 數據集構建與標注策略從 2000 張圖到能用的檢測模型3.1 數據采集公開數據集組合與場景補充策略跌倒檢測領域沒有像 COCO 那樣統一的大規模數據集實際項目中我一般用 UR Fall Detection、Le2i 等公開數據集做基礎再補充自己拍攝的樣本。這個項目自帶的數據集中fall_1411.jpg、fall_1442.jpg這類編號文件是整理好的標注樣本背后對應的是真實監控視角下的跌倒場景。數據分布要注意三個維度。第一是視角多樣性俯視攝像頭和水平視角的跌倒姿態差距極大模型在一種視角上學到的特征很難遷移到另一種視角。第二是人體尺度距離攝像頭 3 米和 10 米處的跌倒目標框大小可能差 5 倍訓練時要用imgsz640配合augmentTrue的隨機縮放來覆蓋。第三是場景干擾病床、椅子、桌子都會產生類似跌倒的幾何形狀數據里一定要包含大量蹲下、彎腰撿東西這類負樣本。3.2 使用 LabelImg 標注與數據集劃分# 安裝標注工具以 LabelImg 為例建議在 conda 環境安裝 pip install labelimg labelimg # 啟動后打開圖片目錄快捷鍵 w 畫框d 切換下一張標注完成后每張圖會生成一個同名 XML 文件里面記錄了每個目標框的xmin, ymin, xmax, ymax坐標和類別名。標注規范上我建議統一把人體與地面夾角小于 45 度作為跌倒的判定標準這樣不同標注員之間的標準一致數據集拼接時才不會出現標簽沖突。YOLOv8 需要的數據格式和 LabelImg 的輸出不同需要轉換成 YOLO 格式每個框用歸一化的class x_center y_center width height表示坐標值都在 0 到 1 之間。# 項目中的 split_datasets.py 腳本用于劃分數據集 python split_datasets.py --train_ratio 0.7 --val_ratio 0.2 --test_ratio 0.1按 7:2:1 劃分是目標檢測的常規做法。訓練集 70% 用于更新權重驗證集 20% 用于每輪評估并決定是否保存當前最優模型測試集 10% 在訓練完全結束后做最終評估。不要在訓練過程中反復查看測試集效果否則測試集信息會間接影響調參決策。3.3 數據增強把有限的數據用出 3 倍效果# data.yaml 中配置增強參數YOLOv8 支持的常見增強選項 augment: hsv_h: 0.015 # 色調變化范圍 hsv_s: 0.7 # 飽和度變化范圍 hsv_v: 0.4 # 明度變化范圍 degrees: 10.0 # 隨機旋轉角度 translate: 0.1 # 隨機平移比例 scale: 0.5 # 隨機縮放比例 fliplr: 0.5 # 水平翻轉概率 mosaic: 1.0 # Mosaic 增強的概率Mosaic 增強是 YOLO 系列最有效的數據增強手段把 4 張圖隨機裁剪拼接成一張模型被迫在更小的尺度上識別目標同時變相擴大了 batch 數量。但要注意mosaic1.0在訓練后期比如 100 輪之后建議降為 0.5 或關閉因為 Mosaic 生成的圖片和真實場景分布有差異一直開啟會讓模型在真實數據上的表現打折扣。另外跌倒檢測有一個特有的數據增強技巧——對跌倒樣本用更大的旋轉角度。人跌倒的時候身體姿態是失控的可能以任意角度倒地degrees參數可以對跌倒類樣本設為 30正常姿態類保持 10這樣模型能學到更多角度的姿態特征。如果項目源碼里沒有區分兩類樣本的增強參數最簡單的做法是把所有數據的旋轉增大到 20 度一般不會傷害正常類別的精度。4. 訓練全流程實操環境配置、超參數調優與踩坑記錄4.1 環境搭建與 GPU 驗證# 創建 Python 3.10 環境并安裝 PyTorch以 CUDA 11.8 為例 conda create -n yolov8 python3.10 -y conda activate yolov8 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics # 驗證 CUDA 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))環境配置是初學者最容易卡住的地方核心原則是 PyTorch 版本和 CUDA 驅動要匹配。如果輸出為False說明 PyTorch 安裝的是 CPU 版本需要卸載重裝 CUDA 版本。GTX 1660 Ti 這類顯存只有 6GB 的顯卡建議安裝 CUDA 11.8 而不是 12.x因為 11.8 的運行時顯存占用更小留給模型的余量更多。4.2 訓練啟動參數與逐項說明from ultralytics import YOLO model YOLO(yolov8s.pt) # 加載 COCO 預訓練權重作為起點 results model.train( datafall_detect.yaml, # 數據集配置文件 epochs150, # 訓練輪數 batch16, # 批次大小6GB顯存建議12~16 imgsz640, # 輸入圖像尺寸 patience20, # 20輪沒有提升則提前停止 lr00.01, # 初始學習率 lrf0.01, # 最終學習率lr0的1% weight_decay0.0005, # 權重衰減防止過擬合 device0, # 使用第一張GPU workers4, # 數據加載線程數 optimizerSGD, # 優化器選擇 pretrainedTrue, # 使用預訓練權重 valTrue, # 訓練時每輪結束驗證 projectruns/detect, # 訓練日志保存路徑 namefall_detect_exp1 # 本次實驗命名 )batch16不是固定的。顯存不足時優先減batch而不是imgsz——圖像分辨率對檢測性能的影響比 batch 更大。patience20的意思是如果連續 20 輪驗證集的 mAP 沒有提升訓練會提前終止。這個參數在課設項目里特別有用因為很多情況下訓練到 80 輪就已經收斂了不需要等滿 150 輪。優化器我選 SGD 而不是 Adam 系原因是目標檢測任務里 SGD 配合合適的學習率策略往往能收斂到更平坦的極小值泛化能力更好。如果數據集很小幾千張圖AdamW 可能更快達到可用狀態。4.3 顯存不足的應對方案梯度累積與 AMP# 6GB 顯存的常見報錯CUDA out of memory # 解決方向1啟用 AMP 混合精度訓練YOLOv8 默認開啟 ampTrue # 解決方向2使用梯度累積等效擴大 batch 大小 results model.train( batch8, # YOLOv8 中通過 accumulate 參數控制梯度累積 # 實際效果等效于 batch 8 * accumulate # 如果代碼版本不支持 accumulate直接調小 batch )GTX 1660 Ti 跑 YOLOv8s imgsz640時batch設置 12 會比較勉強16 大概率顯存溢出。我通常的做法是把 batch 設為 8然后靠ampTrue的混合精度把顯存占用壓下來。AMP 的原理是讓模型部分參數用 FP16 計算、部分保留 FP32顯存幾乎減半而精度損失不到 0.5%。如果你的代碼版本里沒有accumulate參數手動實現梯度累積也不難——循環里每 2 個 batch 再調用一次optimizer.step()即可。4.4 損失曲線分析與過擬合判斷訓練完成后在runs/detect/fall_detect_exp1/目錄下有results.csv文件里面記錄了每一輪的各類損失和 mAP 指標。可以用 pandas 直接讀取并畫損失函數曲線import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/fall_detect_exp1/results.csv) plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.plot(df[epoch], df[train/box_loss], labeltrain box_loss) plt.plot(df[epoch], df[val/box_loss], labelval box_loss) plt.legend() plt.subplot(1, 2, 2) plt.plot(df[epoch], df[metrics/mAP50(B)], labelmAP50, colorgreen) plt.legend() plt.tight_layout() plt.savefig(loss_curve.png, dpi150)判斷訓練狀態主要看兩條規律一是訓練損失下降但驗證損失在 30 輪后反彈說明模型開始過擬合應加大weight_decay或增加數據增強力度二是 mAP50 在第 100 輪還在緩慢上升說明訓練輪數不夠可以再加 50 輪。通常跌倒檢測的 mAP50 達到 0.85 以上誤報率就初步可用了。5. 從 best.pt 到實際可用導出 ONNX 與部署避坑指南5.1 模型導出與推理性能驗證# 導出 ONNX 格式便于用 TensorRT 或 OpenVINO 加速 yolo export modelruns/detect/fall_detect_exp1/weights/best.pt formatonnx imgsz640 # 用導出的 ONNX 模型做推理測試 yolo predict modelbest.pt sourcetest_video.mp4 conf0.35conf0.35是推理階段的可信度閾值。這個值需要根據你的應用場景調整監控場景里漏報錯過一次跌倒的代價遠高于誤報把蹲下識別成跌倒所以閾值可以調低到 0.25 左右如果是醫院的自動報警系統誤報會打擾醫護工作則應該調高到 0.5。不要只用一個閾值應對所有場景。5.2 部署到邊緣設備的關鍵問題如果部署目標是 RK3588 這類邊緣盒子導出 ONNX 后還需要做模型轉換。RK3588 的 NPU 支持 INT8 量化把 FP32 的權重壓縮到 INT8 后推理速度能提升 2 到 3 倍。但量化后精度通常會下降 2% 到 5%建議先用少量真實場景圖片做校準集約 100 張而不是直接隨機截取。# 部署后處理中的幀間投票機制防止單幀誤檢 # 連續 3 幀中有 2 幀檢測到跌倒才觸發報警 fall_frames 0 for frame in video_stream: detections model(frame, conf0.35) is_fall any(d.cls 0 for d in detections) if is_fall: fall_frames 1 else: fall_frames 0 if fall_frames 2: alarm_trigger() # 觸發報警后續接入短信/聲光通知這段后處理邏輯是工程落地中必不可少的環節。單幀的檢測結果受噪聲影響極大——攝像機抖動、人彎腰系鞋帶、坐姿不穩都可能在某一幀被識別為跌倒。加入幀間投票后誤報率能下降一個數量級而跌倒本身的持續時間通常超過 1 秒30 幀以上響應延遲不會影響告警時效。閾值設為連續 3 幀中 2 幀命中是召回率和誤報率之間比較平衡的選擇。另外一個容易被忽略的問題是模型的類別輸出約定。訓練時類別0是摔倒、類別1是正常部署代碼里一定要保持同樣的類別編號否則會出現檢測到正常行人反而觸發報警的反向烏龍。建議在部署代碼里顯式寫下CLASS_FALL 0的注釋避免后續維護人員改錯。本文還有配套的精品資源點擊獲取