1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| import torch import torch.nn as nn
class SeatbeltMisuseDetector(nn.Module): """ 安全带误用检测器 输入: 1. 摄像头图像特征(安全带可见性+位置) 2. 张力传感器读数 3. 织物压力分布 4. 扣具状态 输出: 1. 佩戴状态(正确/手臂下/背后/未扣/过松) 2. 置信度 3. 建议动作 """ def __init__(self): super().__init__() self.camera_encoder = nn.Sequential( nn.Linear(64, 128), nn.GELU(), nn.Linear(128, 64) ) self.tension_encoder = nn.Sequential( nn.Linear(5, 32), nn.GELU(), nn.Linear(32, 16) ) self.pressure_encoder = nn.Sequential( nn.Linear(20, 64), nn.GELU(), nn.Linear(64, 16) ) self.classifier = nn.Sequential( nn.Linear(64 + 16 + 16 + 1, 64), nn.GELU(), nn.Linear(64, 6) ) def forward(self, camera_feat, tension, pressure, buckle): c = self.camera_encoder(camera_feat) t = self.tension_encoder(tension) p = self.pressure_encoder(pressure) b = buckle x = torch.cat([c, t, p, b], dim=-1) logits = self.classifier(x) return { "classification": logits, "misuse_detected": logits.argmax(dim=-1) != 0, "confidence": torch.softmax(logits, dim=-1).max(dim=-1).values }
detector = SeatbeltMisuseDetector()
scenarios = { "正确佩戴": {"tension": torch.tensor([[30, 28, 31, 29, 30]]), "buckle": torch.tensor([[1.0]]), "expected": "correct"}, "手臂下方": {"tension": torch.tensor([[15, 14, 16, 15, 14]]), "buckle": torch.tensor([[1.0]]), "expected": "arm"}, "未扣": {"tension": torch.tensor([[0, 0, 0, 0, 0]]), "buckle": torch.tensor([[0.0]]), "expected": "unbuckled"}, "过松": {"tension": torch.tensor([[5, 5, 6, 5, 5]]), "buckle": torch.tensor([[1.0]]), "expected": "loose"}, }
for name, data in scenarios.items(): camera_feat = torch.randn(1, 64) pressure = torch.randn(1, 20) result = detector(camera_feat, data["tension"], pressure, data["buckle"]) pred = ["correct", "arm", "behind", "unbuckled", "loose", "child"][result["classification"].argmax(1).item()] print(f"{name:<12} 预测: {pred:<12} 误用: {'❌' if result['misuse_detected'].item() else '✅'}")
|