釋出報告 · 跌倒偵測
2026-08-05 · session:模型訓練 · 範圍:ISMS「PM 視角:🧠 訓練 / 驗證 (172 隻)」內跌倒 21 支
一、模型
https://pub-478929a98a5c440cb22c2241c0bde314.r2.dev/fall_sq_v20260805/best.pt
SHA 檔案大小 17,011,733 bytes
二、用法
person_yolo26m_v20260715,imgsz=1280、conf=0.25。
import torch, timm
import torchvision.transforms as T
from PIL import Image
from ultralytics import YOLO
det = YOLO("person_yolo26m_v20260715.pt")
ck = torch.load("best.pt", map_location="cpu", weights_only=False)
IH, IW = ck["img_size"] # (384, 384)
class FallNet(torch.nn.Module):
def __init__(s):
super().__init__()
s.backbone = timm.create_model(ck["backbone_name"], pretrained=False,
num_classes=0, global_pool="avg")
s.dropout = torch.nn.Dropout(0.3)
s.cls = torch.nn.Linear(ck["feat_dim"], 1)
def forward(s, x):
return s.cls(s.dropout(s.backbone(x)))
m = FallNet(); m.load_state_dict(ck["model_state"]); m.eval().cuda()
tf = T.Compose([
T.Resize((IH, IW)), # 不保持長寬比
T.ToTensor(),
T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
PAD = 0.15
def detect_falls(img_path, thr):
im = Image.open(img_path).convert("RGB"); W, H = im.size
r = det.predict(img_path, imgsz=1280, conf=0.25, verbose=False)[0]
crops, boxes = [], []
for b in (r.boxes.xyxy.cpu().numpy() if r.boxes is not None else []):
x1, y1, x2, y2 = b[:4]; bw, bh = x2 - x1, y2 - y1
if bw < 8 or bh < 8: # 太小的框直接丟掉
continue
crops.append(tf(im.crop((
int(max(0, x1 - bw * PAD)), int(max(0, y1 - bh * PAD)),
int(min(W, x2 + bw * PAD)), int(min(H, y2 + bh * PAD))))))
boxes.append((x1, y1, x2, y2))
if not crops:
return []
with torch.no_grad():
p = torch.sigmoid(m(torch.stack(crops).cuda())).float().cpu().numpy()[:, 0]
return [(bx, float(s)) for bx, s in zip(boxes, p) if s >= thr]
三、門檻
同一個模型,門檻不同會得到完全不同的行為。三種設定都附「抓到率 / 誤報率」, 數字是在該鏡頭的考試用資料上實測的,不是估的。
上面是全體的數字,實際請用下一節的逐鏡頭門檻。 每支鏡頭的視角、人流、光線都不同,統一套一個值會顯著變差。
四、逐鏡頭
判定標準:建議設定下抓到率 ≥ 95% 且誤報率 ≤ 3%, 且考試用樣本雙邊足夠(倒地 ≥ 10、沒倒地 ≥ 20)。
| 鏡頭 | 考試用 倒地 | 考試用 沒倒地 | AP | 設定 A · 不漏報優先 | 設定 B · 不吵優先 | 建議設定 | |||
|---|---|---|---|---|---|---|---|---|---|
| 門檻 | 抓到 / 誤報 | 門檻 | 抓到 / 誤報 | 門檻 | 抓到 / 誤報 | ||||
| 新東陽 ch10 | 41 | 172 | 1.000 | 0.35 | 100% / 0.0%漏 0・誤 0 | 0.16 | 100% / 0.0%漏 0・誤 0 | 0.64 | 95% / 0.0%漏 2・誤 0 |
| 新東陽 ch20 | 129 | 121 | 1.000 | 0.65 | 100% / 0.0%漏 0・誤 0 | 0.18 | 100% / 0.0%漏 0・誤 0 | 0.77 | 95% / 0.0%漏 6・誤 0 |
| 新東陽 ch22 | 35 | 63 | 1.000 | 0.22 | 100% / 0.0%漏 0・誤 0 | 0.22 | 100% / 0.0%漏 0・誤 0 | 0.22 | 100% / 0.0%漏 0・誤 0 |
| 新東陽 ch23 | 33 | 36 | 1.000 | 0.85 | 100% / 0.0%漏 0・誤 0 | 0.56 | 100% / 0.0%漏 0・誤 0 | 0.88 | 97% / 0.0%漏 1・誤 0 |
| 新東陽 ch24 | 25 | 48 | 1.000 | 0.28 | 100% / 0.0%漏 0・誤 0 | 0.07 | 100% / 0.0%漏 0・誤 0 | 0.45 | 96% / 0.0%漏 1・誤 0 |
| 新東陽 ch6 | 21 | 55 | 1.000 | 0.67 | 100% / 0.0%漏 0・誤 0 | 0.09 | 100% / 0.0%漏 0・誤 0 | 0.71 | 95% / 0.0%漏 1・誤 0 |
| 新東陽 ch8 | 41 | 1,607 | 1.000 | 0.57 | 100% / 0.0%漏 0・誤 0 | 0.21 | 100% / 0.0%漏 0・誤 0 | 0.89 | 95% / 0.0%漏 2・誤 0 |
| 興農 151-11 | 47 | 207 | 1.000 | 0.73 | 100% / 0.0%漏 0・誤 0 | 0.22 | 100% / 0.0%漏 0・誤 0 | 0.75 | 98% / 0.0%漏 1・誤 0 |
| 興農 151-14 | 44 | 208 | 1.000 | 0.48 | 100% / 0.0%漏 0・誤 0 | 0.17 | 100% / 0.0%漏 0・誤 0 | 0.93 | 95% / 0.0%漏 2・誤 0 |
| 興農 152-1 | 43 | 168 | 1.000 | 0.76 | 100% / 0.0%漏 0・誤 0 | 0.09 | 100% / 0.0%漏 0・誤 0 | 0.78 | 95% / 0.0%漏 2・誤 0 |
| 興農 152-14 | 47 | 763 | 1.000 | 0.65 | 100% / 0.0%漏 0・誤 0 | 0.55 | 100% / 0.0%漏 0・誤 0 | 0.78 | 96% / 0.0%漏 2・誤 0 |
| 興農 152-6 | 41 | 189 | 1.000 | 0.61 | 100% / 0.0%漏 0・誤 0 | 0.43 | 100% / 0.0%漏 0・誤 0 | 0.95 | 95% / 0.0%漏 2・誤 0 |
| 興農 155-1 | 48 | 73 | 0.996 | 0.47 | 96% / 0.0%漏 2・誤 0 | 0.23 | 96% / 0.0%漏 2・誤 0 | 0.47 | 96% / 0.0%漏 2・誤 0 |
| 興農 155-5 | 47 | 84 | 0.994 | 0.58 | 100% / 1.2%漏 0・誤 1 | 0.17 | 100% / 1.2%漏 0・誤 1 | 0.81 | 96% / 1.2%漏 2・誤 1 |
| 興農 155-7 | 51 | 354 | 1.000 | 0.53 | 100% / 0.0%漏 0・誤 0 | 0.38 | 100% / 0.0%漏 0・誤 0 | 0.84 | 96% / 0.0%漏 2・誤 0 |
| 愛烙達 頻道16-3樓走道+貨梯 | 21 | 50 | 0.994 | 0.95 | 95% / 0.0%漏 1・誤 0 | 0.70 | 95% / 0.0%漏 1・誤 0 | 0.95 | 95% / 0.0%漏 1・誤 0 |
| 天銳國際 測試1 | 44 | 28 | 0.997 | 0.24 | 98% / 0.0%漏 1・誤 0 | 0.20 | 98% / 0.0%漏 1・誤 0 | 0.27 | 95% / 0.0%漏 2・誤 0 |
| 天銳國際 測試2 | 32 | 34 | 1.000 | 0.60 | 100% / 0.0%漏 0・誤 0 | 0.11 | 100% / 0.0%漏 0・誤 0 | 0.69 | 97% / 0.0%漏 1・誤 0 |
| 鏡頭 | 考試用 倒地 | 考試用 沒倒地 | AP | 設定 A · 不漏報優先 | 設定 B · 不吵優先 | 建議設定 | |||
|---|---|---|---|---|---|---|---|---|---|
| 門檻 | 抓到 / 誤報 | 門檻 | 抓到 / 誤報 | 門檻 | 抓到 / 誤報 | ||||
| 新東陽 ch12 考試用樣本太少(沒倒地僅 16 人),算出的誤報率不可信 —— 需補測試資料 | 52 | 16 | 0.988 | 0.95 | 81% / 0.0%漏 10・誤 0 | 0.14 | 92% / 6.2%漏 4・誤 1 | 0.43 | 90% / 6.2%漏 5・誤 1 |
| 新東陽 ch21 考試用樣本太少(沒倒地僅 14 人),算出的誤報率不可信 —— 需補測試資料 | 23 | 14 | 0.997 | 0.55 | 96% / 0.0%漏 1・誤 0 | 0.18 | 96% / 0.0%漏 1・誤 0 | 0.55 | 96% / 0.0%漏 1・誤 0 |
| 愛烙達 頻道15-3樓後方走道 考試用樣本太少(沒倒地僅 17 人),算出的誤報率不可信 —— 需補測試資料 | 48 | 17 | 0.991 | 0.49 | 92% / 0.0%漏 4・誤 0 | 0.22 | 92% / 0.0%漏 4・誤 0 | 0.05 | 96% / 23.5%漏 2・誤 4 |
五、限制
| 條件 | 影響 | 怎麼確認 |
|---|---|---|
| 畫面解析度 | 畫面中一個人若小於約 40 × 80 像素,裁切後放大到 384×384 會嚴重失真,判斷力大幅下降 | 實測:某鏡頭串流只有 480×240,人只有 17×41 像素,308 個人全部判成沒倒地。 換成同一支的高畫質畫面(人約 89×167)後 AP 達 1.000 |
| 人員偵測是前提 | 偵測不到人就不會有判斷。遠景、重疊、遮擋都會影響 | 先確認偵測器在該鏡頭的召回率,再談分類準度 |
| 蹲姿與彎腰 | 是最容易被誤判成倒地的姿勢 | 模型在這帶會給 0.15–0.70 的中間分數。若場域常有蹲姿作業,建議用設定 B |
六、這一版怎麼來的
考試用資料這一輪從 2,396 筆擴充到 5,220 筆, 原本三支完全無法評估的鏡頭補到只剩測試樣本不足的問題, 21 支鏡頭現在全部都有實測數字。
產出:模型訓練 session · 2026-08-05 · 5090-2 · runs/fallcls_fall_sq_pat16