ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek工业不安全动作预警:行为识别与大模型协同落地指南

DeepSeek工业不安全动作预警:行为识别与大模型协同落地指南 简介在化工、电力、矿山等生产现场视频监控已广泛覆盖但人工盯屏难以捕捉瞬间发生的危险动作。行为识别技术通过姿态估计与时序分类提取人体骨架和动作标签解决了“看见”的问题而DeepSeek等大语言模型则承担语义理解与处置建议生成的职责将结构化标签转化为可执行的告警指令两者协同构建起完整的预警闭环。这种“视觉识别语言决策”的架构既能提升对攀爬护栏、靠近运转设备等行为的响应效率又能根据区域危险等级和上下文灵活调整处置策略。本文从模型选型、检测管线搭建、预警闭环设计到避坑调参拆解了一套可复现的工程实施方案为EHS工程师和智能化改造团队提供了从0到1的落地路径。1. DeepSeek工业不安全动作预警先回答眼和脑分开这个核心设计化工、电力、矿山这类生产现场摄像头早就装满了可真正盯着屏幕看的人没几个。工人翻越护栏、摘安全帽、靠近运转设备、在皮带上站人——这些动作发生在一两秒内值班员低头喝口水的功夫就错过了。DeepSeek工业生产人员不安全动作预警方案就是冲着这个空档去的底层用行为识别算法把视频流里的人体骨架和动作标签提取出来上层再让 DeepSeek 这类大语言模型把动作标签上下文翻译成值班员看得懂、处置得了的告警话术和干预建议。这套思路最反直觉的一点是DeepSeek 本身并不看视频也不直接做逐帧的危险动作检测它是预警链路里的调度和解释中枢。真正认动作的是姿态估计和时序分类模型DeepSeek 负责把置信度 0.82 的climb变成一句2#皮带廊东侧有人员攀爬护栏持续约 3 秒置信度 0.82建议先声光制止并派人到场确认。适合读这份方案的人是工厂 EHS 工程师、做智能化改造的系统集成商以及准备在企业里部署行为识别模型的算法工程师。接下来我把这个方案拆成可复现的落地步骤从模型选型、检测管线、预警闭环到避坑经验一次讲清楚。2. DeepSeek 在预警链路里的真实分工身体用姿态模型语义交给文本模型2.1 行为识别算法只走完一半路动作标签不等于预警事件一条完整的工业不安全动作识别链路常见做法是四级串联目标检测锁定人 → 姿态估计提取关键点 → 时序模型判断动作类别 → 业务规则决定是否报警。前三级解决的是这个人正在做什么输出通常是climb0.82或者fall0.91这类数字。但生产现场需要的不是数字而是谁在哪干了什么、严重到什么程度、现在该怎么处置。这一步恰恰是行为识别算法本身不负责的。把姿态模型的输出直接接进声光报警器是很多项目第一版翻车的原因。原因很简单行为识别算法对动作敏感对场景完全无感。同样是弯腰这个动作在检修设备时是正常作业在皮带运行时靠近辊筒就是危险接近同样是倒地在平整地面可能只是休息在陡坡或高温区域就是必须立刻响应的紧急事件。这类判断靠分类网络做不了需要把动作标签、人员身份、区域属性和设备状态的上下文揉在一起形成一条有明确处置建议的事件记录。DeepSeek 在这种方案里接的正是这一棒。从工程效率上讲把文本生成环节交给大语言模型而不是自己写一整套 if-else 规则树收益在于规则维护成本大幅度下降。EHS 管理人员可以直接用自然语言提需求例如夜班时段靠近危化品库房的动作优先级调高交给 DeepSeek 按新规则重写事件判定配置不用再去改检测模型的代码。2.2 DeepSeek 在预警方案里能干的四件事和一件干不了的事结合开源社区里 DeepSeek 的部署实践在工业预警这个场景里真正值得让 DeepSeek 承担的任务有四类第一是告警话术生成。把姿态识别输出的结构化数据动作类型、置信度、坐标框、人员编号、区域编号翻译成值班室大屏上的一句话要求简洁、无歧义、包含位置和处置建议。这类任务对推理速度不敏感200 到 300 个 token 就够用远程 API 或本地小模型都能跑。第二是交接班巡检报告。把一天内的不安全动作事件按班组、区域、时段聚合生成摘要文本指出高发时段和典型违规动作。这是典型的离线批处理任务可以在凌晨低峰期跑一次。第三是事件检索与复盘。值班员用自然语言提问昨天下午爬护栏的有哪几个人、分别在什么位置系统把问题转成结构化查询回放对应视频片段。这一步本质上是把 DeepSeek 当成语义查询入口背后接的还是事件数据库和录像存储。第四是联动规则的解释和编排。把广播喊话—通知班长—抓拍留存—标记复核这套处置流程用自然语言描述给 DeepSeek让它转换成可执行的策略配置再交给规则引擎落地。干不了的那件事是实时逐帧视觉推理。视频流 25 到 30 帧每秒每一帧都送进大语言模型做图文理解无论在线 API 还是本地 vLLM 部署都扛不住这个延迟和成本。所以方案里不会出现DeepSeek 直接看视频找危险动作这种设计视觉部分必须由专门的检测和姿态模型完成。2.3 选型标准什么任务交给规则模板什么任务才值得交给 DeepSeek判断一个预警环节要不要引入 DeepSeek我的习惯标准是看两条一是这一环是否确实需要自然语言理解和生成二是输出是否能容忍几百毫秒甚至几秒的延迟。两条都满足才交给它否则老老实实写模板。实时告警播报这种场景延迟超过 500 毫秒值班员就会觉得卡所以第一级报警用固定模板拼接不经过大模型生成保证从检测到推送到大屏在 1 秒内完成。只有需要人工介入复核的告警才把完整上下文发给 DeepSeek 生成处置建议文本。巡检报告、统计分析、事故复盘说明这类的非实时任务延迟要求低但文本质量要求高是 DeepSeek 最舒服的区间。部署形态上厂区网络通常与公网隔离数据合规要求严。常见做法是两条路并行轻量场景直接调用 DeepSeek 在线 API数据脱敏后只传关键点序列和事件描述不传原始图像敏感场景用 vLLM 在厂内 GPU 服务器上跑 DeepSeek 的蒸馏模型或者干脆在 Jetson Orin 这类边缘设备上本地部署小参数版本保证数据不出厂。两种路线在后面的预警闭环章节会给出具体的调用和部署方式。3. 搭危险动作检测管线关键点、角度与时序判定一条龙3.1 最小闭环YOLO-Pose 关键点提取加角度规则判定先跑通一条能用的最小管线再谈复杂动作分类。我一般用 YOLO-Pose 系列做人体关键点提取它把目标检测和姿态估计合在一个网络里输出每个人体的 17 个关键点坐标和置信度。拿到关键点之后很多典型的工业危险动作可以用关节角度和位置关系直接判断不需要训练分类模型。下面这段代码是这条最小闭环的核心逻辑是对视频流逐帧做人体检测与姿态估计然后根据关键点坐标计算几个关键夹角和位置特征判断是否存在攀爬栏杆、摔倒、靠近禁区这三类危险行为。注意代码里的阈值都是可调参数后面第 6 章会专门讲怎么用历史录像把这些参数调稳。import cv2 import numpy as np from ultralytics import YOLO # 加载姿态估计模型输入视频流输出每人 17 个关键点COCO 顺序 model YOLO(yolo11n-pose.pt) # 关键点索引常量按 COCO 17 点定义 NOSE, LEFT_SHOULDER, RIGHT_SHOULDER 0, 5, 6 LEFT_ELBOW, RIGHT_ELBOW 7, 8 LEFT_HIP, RIGHT_HIP 11, 12 LEFT_KNEE, RIGHT_KNEE 13, 14 LEFT_ANKLE, RIGHT_ANKLE 15, 16 def calc_angle(a, b, c): 以 b 为顶点计算向量 ba 与 bc 的夹角用于判断肢体弯曲程度 ba np.array(a[:2]) - np.array(b[:2]) bc np.array(c[:2]) - np.array(b[:2]) cos np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc) 1e-6) return np.degrees(np.arccos(np.clip(cos, -1.0, 1.0))) def detect_unsafe(kpts, conf, region_box): 输入单帧关键点、置信度、禁区框返回动作标签列表 labels [] # 关键点置信度低于阈值的点不可信先做掩码过滤 if conf[NOSE] 0.5: return labels # 人体姿态不完整直接跳过角度计算 # 摔倒检测髋部与脚踝垂直距离骤降同时躯干接近水平 hip (kpts[LEFT_HIP] kpts[RIGHT_HIP]) / 2 ankle (kpts[LEFT_ANKLE] kpts[RIGHT_ANKLE]) / 2 torso_h abs(hip[1] - ankle[1]) if torso_h 0.35 * conf[NOSE]: # 躯干高度的经验比例阈值 labels.append(fall) # 攀爬检测膝盖弯曲角度小于 90 度持续出现且头部 y 坐标低于肩部 knee_angle calc_angle(kpts[LEFT_HIP], kpts[LEFT_KNEE], kpts[LEFT_ANKLE]) head_above_shoulder kpts[NOSE][1] kpts[LEFT_SHOULDER][1] if knee_angle 90 and head_above_shoulder: labels.append(climb) # 禁区闯入检测人体中心点是否落入指定多边形区域 center (int((kpts[LEFT_HIP][0] kpts[RIGHT_HIP][0]) / 2), int((kpts[LEFT_HIP][1] kpts[RIGHT_HIP][1]) / 2)) if region_box and region_box[0] center[0] region_box[2] \ and region_box[1] center[1] region_box[3]: labels.append(forbidden_zone) return labels这段代码里有三个必须说清的点。第一个是角度计算函数它把三个关键点转成两条向量再求夹角这是骨架角度阈值法的基本操作比直接比较坐标距离更抗摄像机远近变化。第二个是摔倒检测里的torso_h 0.35 * conf[NOSE]这里用鼻子置信度当身体尺度参考是因为纵深变化会导致像素距离不可靠用同一个人身上的比例关系做阈值更稳。第三个是禁区判断直接用人体髋部中心点而不是整个检测框避免手臂挥舞把中心点带偏。这段逻辑的问题也很明显单帧判定噪声大一个偶然的低头就可能触发fall。所以工程上必须加时序平滑后面第 5 章的误报避坑会专门展开。3.2 从规则升级到学习用骨架序列训练动作分类模型角度阈值法适合攀爬、摔倒、深弯腰这类几何特征鲜明的动作但拉扯、推搡、跨越传送带这类动作的关节角度变化并不规律定性判断很容易误报。这时候就该上时序动作分类模型常见做法是用 ST-GCN时空图卷积网络或者 TCN把一段连续帧的骨架序列当作图结构数据来分类。ST-GCN 的输入是一个五维张量形状是 (N, C, T, V)N 是批大小C 是特征通道数x, y, 置信度T 是时间窗口帧数V 是关键点数量。模型自动学习关键点之间的空间依赖和跨帧的时间依赖。下面是一段训练代码的简化骨架数据加载部分省略重点展示模型构建和训练循环中容易被忽略的参数设置。import torch import torch.nn as nn from torch.utils.data import DataLoader class SimpleSTGCN(nn.Module): 一个简化的两层 ST-GCN 分类器适合 5~10 类动作的小样本场景 def __init__(self, num_classes, num_frames32, num_joints17, in_channels3): super().__init__() # 先做时间维度的卷积再切到空间图卷积这里用普通卷积代替图卷积演示 self.temporal_conv nn.Sequential( nn.Conv2d(in_channels, 64, kernel_size(5, 1), padding(2, 0)), nn.BatchNorm2d(64), nn.ReLU(), ) self.spatial_conv nn.Sequential( nn.Conv2d(64, 128, kernel_size(1, 3), padding(0, 1)), nn.BatchNorm2d(128), nn.ReLU(), ) self.pool nn.AdaptiveAvgPool2d((1, 1)) self.fc nn.Linear(128, num_classes) def forward(self, x): # x 形状: (N, C, T, V) x x.permute(0, 1, 3, 2) # 调整为 (N, C, V, T) x self.temporal_conv(x) x self.spatial_conv(x) x self.pool(x) x x.view(x.size(0), -1) return self.fc(x) def train_one_epoch(model, loader, opt, criterion, device): model.train() total_loss, correct, total 0.0, 0, 0 for frames, labels in loader: frames, labels frames.to(device), labels.to(device) opt.zero_grad() out model(frames) loss criterion(out, labels) loss.backward() # 梯度裁剪很关键骨架序列样本间差异大不裁剪容易跑飞 nn.utils.clip_grad_norm_(model.parameters(), max_norm5.0) opt.step() total_loss loss.item() * frames.size(0) correct (out.argmax(1) labels).sum().item() total frames.size(0) return total_loss / total, correct / total # 训练数据来自标注好的关键点序列每段 32 帧叠加随机时序裁剪增强 # dataset SkeletonSequenceDataset(...) # loader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4) # model SimpleSTGCN(num_classes6).to(cuda) # optimizer torch.optim.AdamW(model.parameters(), lr1e-3, weight_decay1e-4)这段代码里最值得强调的是时间窗口和批大小。时间窗口定为 32 帧在 25fps 视频里大约是 1.28 秒覆盖摔倒这类动作的完整过程又不会长到把两个无关动作混进一个样本。训练时要注意数据增强常见的做法是把 32 帧窗口在 40 帧的样本里随机裁剪让模型对动作起始位置不敏感。另外梯度裁剪 max_norm 设到 5.0骨架关键点偶尔出现抖动尖峰不裁剪的话 loss 会在某个 batch 突然冲到几十。3.3 动作清单与标注规格把现场隐患翻译成模型能学的东西不管用规则还是用 ST-GCN第一步都是建立一份动作清单。我在项目里一般按后果严重度 × 发生频率两个维度筛选优先覆盖高后果动作而不是贪多求全。下面这张表是典型的不安全动作、关键点特征和标注建议可以直接拿去做数据标注规范的底稿。动作关键点特征建议阈值/时序配置最容易混的误报源攀爬护栏膝盖弯曲 90°头部高于肩部髋部上升持续 0.5 秒以上触发蹲下系鞋带摔倒髋部与脚踝垂直距离突然缩小躯干接近水平持续 0.3 秒且速度变化大于阈值躺卧休息禁区闯入髋部中心点进入多边形区域停留 2 秒以上报警在区域边界外弯腰摘安全帽手部关键点与头部距离 阈值且头部无帽特征持续 1 秒挠头跨越皮带髋部 y 坐标短时间内上升又下降水平位移大动作时长 1.5 秒正常跳跃手扶运行设备手部关键点靠近设备检测框并保持不动停留超过 3 秒短暂触摸标注格式上推荐直接用 JSON Lines 存骨架序列每条样本包含视频片段 ID、起止帧、人员 ID、动作类别和关键点数组。不建议把原始视频直接丢给标注平台关键点序列去标识化之后既减小存储压力也避免人脸入镜带来的隐私合规问题。标注时一个容易被忽视的点是动作开始和结束的边界要卡准ST-GCN 对时间窗口内的动作对齐敏感边界标偏了等于给模型喂噪声。4. 预警干预闭环从动作标签到值班员能行动的告警4.1 事件结构化把检测结果变成一张可消费的 JSON 事件单检测模型输出的是动作标签DeepSeek 能理解的是文本预警系统里流转的是结构化事件。所以第一步要定义一个统一的事件结构把人员、位置、动作、置信度、现场上下文全部塞进一张 JSON 单子里。这张单子既是告警的载体也是后面调用 DeepSeek 生成话术的输入还是事后检索的索引。{ event_id: EVT-20250612-143322-017, version: 1.0, camera_id: CM-2F-BELT-EAST, area: 2#皮带廊东侧, timestamp: 2025-06-12T14:33:2208:00, person: { person_id: P-8821, track_id: 17, position: [482, 310, 720, 890] }, action: { type: climb, label: 攀爬护栏, confidence: 0.82, duration_ms: 3200, keypoints_sequence: [] }, context: { shift: day, device_running: true, area_danger_level: high, nearby_person_count: 1 }, level: warning }这个结构有几个字段必须重点说明。keypoints_sequence只保存点坐标和置信度不存原图像帧这是隐私合规和数据最小化原则的落地。area_danger_level是区域危险等级同一个攀爬动作在不同危险等级的区域预警级别可以完全不同这是规则引擎和 DeepSeek 协同判断的关键输入。duration_ms是动作持续时间单帧误报通过持续时间过滤这个字段在后面的去抖逻辑里是主键。4.2 让 DeepSeek 生成处置建议API 调用、Prompt 设计和降级策略事件单组装好之后交给 DeepSeek 去做的事是读事件单输出给一线人员看的处置建议。这一步要控制生成的不确定性不能让值班员每天看到风格不同的告警措辞。我一般把 temperature 压到 0.2 左右并且在 Prompt 里明确要求输出格式限定不要生成指令之外的内容。import os import httpx # 使用 OpenAI 兼容接口调用 DeepSeek企业内可配置代理 API_URL os.getenv(DEEPSEEK_API_URL, https://api.deepseek.com/chat/completions) API_KEY os.getenv(DEEPSEEK_API_KEY, ) SYSTEM_PROMPT 你是一名工厂安全生产值班调度员。 请根据给定的事件单输出一条处置指令要求 1. 先说动作和位置再说处置动作 2. 处置动作限定为声光广播、通知班长到现场、远程停机、拨打急救电话 3. 不超过80字不要输出理由直接给指令文本。 def generate_alert_message(event: dict) - str: payload { model: deepseek-chat, messages: [ {role: system, content: SYSTEM_PROMPT}, {role: user, content: f事件单{event}} ], temperature: 0.2, max_tokens: 200, stream: False, } # 超时设 3 秒预警链路不能等大模型慢慢想 with httpx.Client(timeout3.0) as client: resp client.post(API_URL, headers{ Authorization: fBearer {API_KEY} }, jsonpayload) resp.raise_for_status() data resp.json() return data[choices][0][message][content]这里有两个容易被忽略的细节。第一个是timeout3.0告警链路是实时系统DeepSeek 生成失败必须快速降级到模板话术不能因为模型超时把整个告警流程阻塞住。第二个是max_tokens200生成任务只需要短文本给太长限制反而让模型有空间输出废话。如果 API 调用失败我一般直接走模板拼接攀爬护栏2#皮带廊东侧请班长到场确认保证告警不中断。4.3 厂内自建推理服务用 vLLM 本地部署 DeepSeek 的两种方案数据敏感的企业通常不允许视频关键点序列出园区所以需要在内网搭一套针对 DeepSeek 的推理服务。vLLM 是目前最常见的部署框架支持 OpenAI 兼容接口改动量最小。GPU 资源充足的厂区可以在中心机房部署中等参数量的 DeepSeek 蒸馏模型作为全厂统一的语义服务边缘场景比如海上平台或小型变电站则用 Jetson Orin 这类设备部署小参数模型只服务本地的预案文本生成。# 中心机房部署使用 vLLM 启动 OpenAI 兼容服务 # 模型名按实际下载的 DeepSeek 蒸馏系列选择这里以 7B 量级为例 vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \ --host 0.0.0.0 \ --port 8000 \ --max-model-len 8192 \ --gpu-memory-utilization 0.85 \ --served-model-name deepseek-factory # 边缘盒子部署Jetson Orin 上加载量化版小模型 # 通常配合 llama.cpp 或 ollama端口保持与主服务一致 ollama run deepseek-r1:1.5b --keep-alive 10m部署参数上gpu-memory-utilization建议留出 15% 的显存余量给请求并发峰值调到 0.85 是我常用的保守值太高容易在长文本请求时触发 OOM。max-model-len控制在 8192 就够用预警事件单很短不需要追求长上下文反而能降低显存占用、提高并发吞吐。边缘方案里 ollama 的--keep-alive参数很关键设为 10 分钟可以让模型常驻显存避免每来一条告警都重新加载权重那种冷启动延迟有十几秒预警场景完全等不起。5. 上线前必看的避坑清单误报、遮挡、超时与合规5.1 误报淹没人角度阈值过于乐观单帧判定翻车现象系统上线第一天摔倒告警一天触发两百多次值班员看了一眼直接关掉广播联动。原因单帧角度阈值判断太敏感工人蹲下系鞋带、弯腰捡工具都被识别成摔倒而且没有做持续时间去抖。解决把告警判定从单帧触发改成持续 N 帧触发摔倒类动作要求连续 8 帧约 0.3 秒满足条件才报警另外把角度阈值放宽比如摔倒的躯干倾斜角度从 90 度放宽到 60 度用更极端的姿态换更低的误报率。精度和召回永远是对立的上线初期宁可漏报一点也别让误报把系统信誉打没了。5.2 关键点被遮挡半边身体在机柜后面时姿态模型会乱猜现象工人从立柱后方走过姿态模型把被遮挡的手肘补成一个诡异的位置角度计算直接失效该识别的攀爬动作漏报了。原因单目 2D 姿态估计在自遮挡和物体遮挡下关键点置信度会骤降但很多工程实现没有把低置信度关键点过滤掉模型输出的猜测坐标照样参与角度计算。解决算角度之前先查关键点的置信度低于 0.4 的点直接置为无效一条完整动作链路里超过 3 个关键点无效就放弃这一帧的判定用前后帧的插值补位。本质原则是不可信的数据不参与决策靠补出来的坐标写进告警事件是给自己挖坑。5.3 DeepSeek 调用超时把整个预警链路堵死现象告警高峰期所有事件都在等 DeepSeek 生成处置建议API 响应一慢消息队列积压连实时广播都延迟了十几秒。原因把大模型生成放到同步调用链路上没有做超时控制和降级策略模型抖动直接传导给核心告警通道。解决第一级实时告警不经过大模型直接模板拼接秒发DeepSeek 生成只用于第二级的深度处置建议放入独立异步队列并把超时压到 3 秒超时后自动降级为默认处置方案。另外给 API 调用加熔断连续失败 5 次就暂停调用 1 分钟避免雪崩。5.4 夜间与逆光场景行为识别模型的集体翻车点现象夜间厂区灯光不足或窗户逆光姿态模型在白天测试指标很好晚上漏报率飙升到四成。原因行为识别算法依赖视觉特征光照变化直接影响目标检测的召回人一旦处于背光位置躯干和背景对比度低关键点根本提不出来。解决这类场景不要指望纯视觉方案硬扛按摄像头点位做场景分级逆光严重的点位优先补红外补光灯另一个经验是模型训练时做亮度扰动数据增强把图像的亮度、对比度、色温随机调整后再喂给模型这个方法能把夜间漏报率降一半以上。永远用厂区真实夜班视频做验收别信白天录像的指标。5.5 隐私合规别把原图传给外部大模型现象为了生成更准确的告警描述有人直接把检测框裁剪出的原图发给云端 API结果人脸和工位环境都出了厂区。原因没有在事件链路里做数据脱敏图像直接进了大模型输入。解决坚持骨架序列和结构化数据出区原始图像一律留在厂内确需图文分析时先在厂内把图像里的人脸区域打码再处理。合规问题不是上线之后补的要在设计事件表结构那天就定死边界凡是出园区的数据必须保证无法还原出人脸和可识别的现场特征。6. 用历史录像回放调参网格搜索把阈值调稳再放行6.1 建正负样本集从历史录像里挖出真实事件片段调参之前先准备评测集。我在项目里的做法是拉一周的历史录像让安全员标出所有真实的不安全动作时间点再随机抽同样数量的正常作业片段作负样本。每个片段截成 10 秒正样本必须包含动作完整过程负样本要覆盖相似干扰动作比如蹲下系鞋带、正常行走、挥手。评测集规模不用大每个动作类别 50 个正样本、100 个负样本就够用重点是把真实场景里的噪声带进来。6.2 网格搜索三个关键参数角度阈值、持续帧数、置信度下限有了正负样本调参就变成一个标准的三维网格搜索问题。角度阈值控制动作几何判定松紧持续帧数控制时间维度去抖强度置信度下限控制关键点质量门槛。下面的脚本自动遍历这三组参数的组合输出每个组合的精确率、召回率和 F1直接按结果选一组上线。import itertools # 待搜索的参数空间 angle_thresholds [50, 60, 70, 80] # 摔倒躯干角度阈值 min_frames_list [4, 6, 8, 12] # 动作持续最少帧数 conf_thresholds [0.3, 0.4, 0.5] # 关键点置信度下限 best (0, None) for angle_thr, min_frames, conf_thr in itertools.product( angle_thresholds, min_frames_list, conf_thresholds): # evaluate() 用第 3.1 节检测函数重跑评测集返回 (precision, recall, f1) p, r, f1 evaluate(angle_thr, min_frames, conf_thr) print(fangle{angle_thr}, frames{min_frames}, conf{conf_thr} fp{p:.3f}, r{r:.3f}, f1{f1:.3f}) if f1 best[0]: best (f1, (angle_thr, min_frames, conf_thr)) print(最优参数:, best[1], 最佳 F1:, round(best[0], 3))网格搜索里两个容易被忽视的点。一个是evaluate()必须在同一份评测集上跑更换任何一条测试视频调参结果都不能跨版本对比所以评测集要固定版本号管理起来。另一个是选参数不要只看最优 F1还要看误报集中在哪个动作上。如果误报全部来自蹲下类负样本说明持续帧数该加大而不是角度阈值该放宽。6.3 灰度上线先只做记录再开声光报警参数调完不要急着全量打开联动。我的上线习惯是分三步走第一周只做事件记录和统计不接任何输出设备第二周打开值班室屏幕提示但不触发广播确认告警准确率稳定后再开声光报警和短信通知。每一级灰度都要有人盯着误报记录把新的误报案例补进评测集重新跑一遍网格搜索。这套流程跑下来系统上线后收到的投诉会少很多。做行为识别预警项目这几年我最深的体会是模型精度只决定上限阈值配置和降级策略才决定体验。很多项目死在第一步不是算法不行而是误报太多把现场人员烦到关系统。先让系统闭嘴再让它开口是工业落地最实用的纪律。希望这套方法能帮你在自己的厂区少踩几个坑把预警系统真正用起来。本文还有配套的精品资源点击获取
返回列表