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.

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%vs94.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
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)
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.

