Fall Detection
🧓🏻

Fall Detection

Expertise
YOLOv8n-Pose
Deep Learning
LSTM
For more information, please follow the Github Link: fall-detection
Hệ thống phát hiện hành vi té ngã theo thời gian thực dựa trên trích xuất khung xương người (Skeleton-based Fall Detection). Dự án tối ưu hóa hiệu năng bằng cách kết hợp mô hình thị giác YOLOv8-Pose để trích xuất đặc trưng động học và mạng hồi quy LSTM để phân loại chuỗi hành vi theo thời gian.
Video preview

1. Mục tiêu dự án (Objective)

  • Xây dựng Pipeline AI hoàn chỉnh: Có khả năng nhận diện hành vi té ngã (Fall Detection) từ luồng video trực tiếp (Camera Stream) với độ trễ cực thấp và độ chính xác cao.
  • Giải quyết bài toán thực tế: Ứng dụng trong y tế, giám sát an toàn cho người cao tuổi hoặc bệnh nhân tại nhà và bệnh viện.
  • Bảo vệ quyền riêng tư (Privacy-preserving): Thay vì truyền hoặc lưu trữ video gốc, hệ thống chỉ xử lý dữ liệu ma trận tọa độ khung xương (skeleton), tránh lộ thông tin cá nhân nhạy cảm và tối ưu hóa băng thông truyền tải trên các thiết bị Edge/Embedded.

2. Bộ dữ liệu huấn luyện (Dataset)

  • Nguồn gốc: Bộ dữ liệu chuẩn hóa IMVIA Le2i Fall Detection Dataset.
  • Nguồn tiếp cận: Được khai thác qua phiên bản lưu trữ trên Kaggle: FallDataset IMVIA
  • Bối cảnh dữ liệu: Video ghi hình các hành vi sinh hoạt thường ngày (ADL - Activities of Daily Living) và các pha té ngã mô phỏng tại nhiều không gian phòng khác nhau (Coffee_room_01, Home_01,...).
Nhãn
Số mẫu
Tỷ lệ
0 — ADL (Bình thường)
7,628
75.6%
1 — Fall (Té ngã)
2,463
24.4%
Tổng
10,091
Sự chênh lệch 3:1 giữa hai lớp tạo ra bài toán Imbalanced Classification — thách thức cốt lõi của toàn bộ pipeline.

3. Phương pháp thực hiện (Methodology)

3.1. Chuẩn hóa không gian (Spatial Normalization)

Tọa độ 17 keypoints từ YOLOv8-Pose được dịch chuyển gốc tọa độ về tâm hông (hip center), sau đó chia cho chiều cao động của cơ thể trong frame. Kỹ thuật này giúp vector khung xương bất biến với khoảng cách camera — người đứng gần hay xa đều cho ra đặc trưng đồng nhất.

3.2. Trích xuất đặc trưng động học (Kinematic Feature Engineering)

Thay vì chỉ dùng tọa độ tĩnh (x, y), hệ thống tính thêm vi phân bậc 1 và bậc 2 theo thời gian:
Vị trí → 17 × 2 = 34 đặc trưng Vận tốc → 17 × 2 = 34 đặc trưng (diff bậc 1) Gia tốc → 17 × 2 = 34 đặc trưng (diff bậc 2) ───────────────────────────────────── Tổng đầu vào 102 đặc trưng / frame
Điều này giúp model phân biệt được "ngồi xuống nhanh" (gia tốc đều, có kiểm soát) với "ngã quỵ đột ngột" (gia tốc đột biến, mất kiểm soát).

3.3. Xử lý mất cân bằng nhãn (Imbalanced Data Handling)

  • Focal Loss (α=0.75, γ=2.0) thay thế Binary Cross Entropy truyền thống — tự động hạ trọng số các ca dễ (ADL chiếm đa số) và tập trung gradient vào các ca ngã khó, buộc model phải học đặc trưng té ngã thay vì "lười biếng" đoán toàn bộ là bình thường.
  • Skeleton Jittering bơm nhiễu Gaussian N(0, 0.02) ngẫu nhiên vào các mẫu Fall trong quá trình huấn luyện, tạo ra các biến thể tư thế té ngã đa dạng mỗi epoch, giúp model tổng quát hóa tốt hơn thay vì học thuộc lòng.

3.4. Chiến lược lựa chọn mô hình (Model Selection Pipeline)

Quá trình được thực hiện theo 2 giai đoạn độc lập:
Giai đoạn 1 — Lựa chọn kiến trúc (5-Fold Cross Validation): Ba kiến trúc được so sánh khách quan trên toàn bộ dữ liệu:
Kiến trúc
Đặc điểm
LSTM
Bộ nhớ dài hạn, phù hợp chuỗi thời gian có phụ thuộc xa
GRU
Biến thể nhẹ hơn LSTM, hội tụ nhanh hơn
CNN-1D
Trích xuất đặc trưng cục bộ theo thời gian
Stratified K-Fold đảm bảo tỷ lệ nhãn Fall/ADL đồng đều trong mỗi fold, tránh rò rỉ dữ liệu và cho kết quả đánh giá khách quan. Kiến trúc có Mean Recall cao nhất được chọn cho giai đoạn 2.
Giai đoạn 2 — Tối ưu siêu tham số (Grid Search): Kiến trúc thắng được Grid Search trên 3 trục tham số:
hidden_size : [32, 64] num_layers : [1, 2] lr : [0.001, 0.005] → 8 tổ hợp, mỗi tổ hợp chạy 35 epoch với early stopping
Model cuối cùng được đánh giá trên Test set độc lập hoàn toàn với threshold tối ưu tìm bằng Youden Index trên Validation set.

4. Kết quả thực nghiệm (Experimental Results)

4. 1. Bảng so sánh hiệu năng 5-Fold Cross Validation

Kiến trúc Mô hình
Mean Accuracy
Mean Recall
Mean F1-Score
LSTM (Optimized)
93.91%
85.71%
87.29%
GRU
93.44%
84.69%
86.29%
CNN-1D (TCN)
89.24%
72.96%
76.73%
→ Lựa chọn LSTM

4.2. Grid Search — Lựa chọn siêu tham số

Sau khi quét 8 tổ hợp tham số, cấu hình tối ưu được xác định:
Tham số
Giá trị tối ưu
Hidden Size
64
Num Layers
1
Learning Rate
0.001

4.3. Quá trình huấn luyện chi tiết

Model hội tụ ổn định qua 50 epoch với các quan sát đáng chú ý:
  • Early stopping kích hoạt tại epoch 50 sau 12 epoch không cải thiện — model đã đạt điểm bão hòa, không bị overfit cưỡng bức.
  • Khoảng cách Train/Val Accuracy cuối cùng là 98.3% vs 94.5% — chênh lệch ~4% là mức chấp nhận được, không có dấu hiệu overfit nghiêm trọng.
  • Threshold tối ưu = 0.3415 (thấp hơn mặc định 0.5) — Youden Index đã hạ ngưỡng quyết định để ưu tiên bắt ca Fall hơn là tránh báo nhầm, phù hợp với bài toán y tế.

4.4. Kết quả trên tập Test độc lập

Chỉ số
Giá trị
Ý nghĩa
Accuracy
90.03%
90/100 mẫu được phân loại đúng
Recall
90.00%
Bắt đúng 9/10 ca té ngã thật
F1-Score
81.52%
Cân bằng giữa Precision và Recall

4.4 Phân tích Confusion Matrix

notion image
Hai đường chéo đối xứng hoàn hảo (0.90 / 0.90) — model không bị lệch về phía nào, xử lý cả hai lớp với độ nhạy ngang nhau. Đây là kết quả lý tưởng cho bài toán mất cân bằng nhãn 3:1, chứng minh Focal Loss + Skeleton Jittering + Threshold tối ưu đã giải quyết triệt để vấn đề thiên lệch về lớp đa số.
Trong bối cảnh ứng dụng y tế: False Negative 10% (bỏ sót 1/10 ca ngã) là mức cần tiếp tục cải thiện trong các phiên bản tiếp theo, có thể bằng cách tăng dữ liệu thực tế hoặc kết hợp thêm đặc trưng góc khớp xương.

4.5. Phân tích biểu đồ huấn luyện (Training History Analysis)

notion image
a. Biểu đồ Loss
Nhận xét tổng thể: Quá trình huấn luyện diễn ra đúng hướng và ổn định.
Train Loss giảm liên tục và mượt mà từ ~0.076 xuống ~0.008 sau 50 epoch — đường cong hội tụ đẹp, không có dấu hiệu bất thường, chứng tỏ model đang học được đặc trưng thực sự từ dữ liệu.
Val Loss có hai giai đoạn rõ rệt. Từ epoch 1–25 giảm từ ~0.070 xuống ~0.034, song song với Train Loss. Từ epoch 25–50 bắt đầu dao động và có xu hướng tăng nhẹ lên ~0.055. Đây là dấu hiệu overfitting nhẹ bắt đầu từ epoch 25 — tuy nhiên mức độ không nghiêm trọng do early stopping đã kích hoạt đúng lúc và model được lưu tại epoch 38 (điểm Val score tốt nhất).
Khoảng cách giữa Train Loss (~0.008) và Val Loss (~0.042) ở cuối quá trình là 5.25x — mức chênh lệch này là bình thường với bài toán có augmentation vì Train set được jitter noise còn Val set thì không.
b. Biểu đồ Accuracy
Train Accuracy tăng đều đặn từ 83% lên 98.3% — đường cong mượt, không có điểm gãy bất thường.
Val Accuracy tăng nhanh trong 10 epoch đầu (83% → 92%), sau đó dao động trong vùng 92–94.5% và ổn định ở đó cho đến cuối. Biên độ dao động ±1–2% là do batch size nhỏ (=8) kết hợp với tập val không lớn — hoàn toàn bình thường.
Điểm đáng chú ý là Val Accuracy không sụt giảm dù Train Accuracy vẫn tiếp tục tăng sau epoch 25, cho thấy model chưa overfit về mặt phân loại dù Val Loss có nhích lên. Điều này giải thích được vì sao kết quả Test set vẫn đạt 90% Accuracy và 90% Recall.