上个月组里把一份内部测试报告丢出来的时候会议室里安静了几秒同一批真实监控画面同一个视觉大模型零样本异常检测的异常类 F1 从 0.09 爬到 0.64。0.09 这个数字不是打错第一次跑基线的时候就长这样——按帧统计、阈值固定、不做任何适配模型几乎把每一帧都判成正常偶尔冒出一两个异常判定还是误报。0.64 也不是什么惊艳的实验室指标它是在 6 路真实安防摄像头、异常帧占比约 3% 的长尾场景下把阈值在验证集上选定后固定、再跑到测试集上得到的数字没有任何针对测试集的调参。这段经历值得写下来因为坑几乎全在用上不在模型上。安防圈现在人人都在聊大模型、聊视觉语言模型能不能直接做零样本异常检测聊开放词汇能不能省掉标注成本但真正落地时会发现报出来的指标和实际可用性之间的落差绝大多数来自分数怎么算、阈值怎么定、时序怎么用这几件事。这篇东西适合三类人看——正在评估大模型能不能接进安防算法链路的工程师、手上有一批未标注视频想先跑个基线的算法同学、以及被零样本三个字吸引但还没踩过坑的产品侧朋友。我会把每一步的动机、参数怎么来的、哪些提分是真提分、哪些是把指标做漂亮的假动作都摊开讲。1. 0.09 这个数字先别急着怪模型1.1 一次翻车的实测现场先把场景交代清楚。测试数据是某园区和某仓库的 6 路固定机位画面覆盖白天顺光、夜间补光、逆光门口、雨天地面反光四种光照条件标注口径是帧级二分类每一帧打上正常或异常异常包含攀爬、翻越围栏、人员摔倒、长时间徘徊滞留、物品遗留、非授权区域闯入这几类。异常帧占比大约 3%属于典型的极度不平衡。第一次跑基线做法简单粗暴整帧丢进图文对齐模型文本侧写两个提示词——a normal surveillance scene 和 an abnormal surveillance scene with people fighting or climbing取两个相似度做 softmax异常概率超过 0.5 就判异常。跑完统计精确率 0.06召回率 0.19F1 0.09。看到这个结果第一反应是模型不行。但把误报样本调出来看问题立刻暴露模型把大量空场景、树影晃动、雨滴打镜头判成了异常而真正有人翻围栏的帧反而被判成正常因为那帧画面里人很小、只占整幅图的百分之几整帧特征被大面积的水泥地和绿化带主导。用一句大白话概括你在问模型这张图整体看起来像不像异常而安防真正要问的是这张图里有没有一处在做不该做的事。这两个问题根本不是一回事。1.2 拆开 F1 看0.09 到底烂在哪F1 是精确率和召回率的调和平均单独看它没有诊断价值必须拆开。我们把基线在验证集上的混淆矩阵拉出来看问题分成四块每一块对应一个独立的改进方向。问题现象具体表现根因判断后续对应动作召回极低小人、远距离目标漏检严重整帧池化导致小目标特征被稀释patch 级打分 top-k 聚合误报集中在空场景树影、雨滴、灯光闪烁被判异常异常文本描述过于宽泛语义边界模糊提示词细化 正常先验减除分数不可比白天分数整体偏高夜间整体偏低未做跨场景校准按场景分位数归一化判定抖动同一事件中间几帧断掉单帧独立判定无时序约束滑窗平滑 滞后判决这里要强调一个常被忽略的点F1 对阈值极度敏感而阈值在零样本场景下没有任何先验。我们做过一个实验把同一个模型的输出分数固定不动只改阈值F1 在 0.09 到 0.41 之间大幅摆动。也就是说第一次跑出来的 0.09 里有相当一部分是阈值选错了贡献的而不是模型能力问题。这个认知很重要因为它决定了你后续优化的优先级先把分数算对再谈阈值先把分布校准再谈模型替换。注意不要拿测试集的分数分布去反推阈值再报指标这是自欺欺人。正确做法是把验证集按摄像头和光照条件分层在验证集上搜阈值固定后原封不动跑测试集。我们后面所有数字都遵循这个口径。1.3 为什么没有直接上微调有人会问既然有标注为什么不直接微调一个检测器非要折腾零样本。理由有三个都很实在。第一是异常类目会变。安防现场的异常清单几乎每个季度都在改今天要抓翻越围栏明天客户说要加人员聚集后天又说电瓶车进电梯也要算。每加一类就重新标数据、重新训练、重新灰度节奏跟不上。零样本的价值在于用自然语言描述新类目改一行提示词就能上线试跑成本差距是数量级的。第二是异常样本天然稀疏且不可穷举。你可以标出 5000 个翻越围栏但你标不出所有可能的异常异常的定义在开放世界里是发散的。这类任务天生适合用正常样本建模、把偏离正常的当作异常而不是把异常当作一个封闭类别去学。零样本的分数机制恰好契合这个思路。第三是算力与迭代速度。微调一个视频理解模型从准备数据到出可用权重快的话两周慢的话一个月中间还要处理类别不平衡、跨场景泛化、模型回滚。零样本方案改一个分数函数十几分钟就能跑完一轮验证一天能试二十个想法。前期探索阶段这个迭代速度的价值远大于单点指标。当然零样本不是终点。我们内部的口径是零样本先跑通、先上线做高召回粗筛把可疑片段筛出来给人复核同时积累真实误报样本等某一类异常的样本量够了再针对这一类做小模型精修。这是一个大模型筛、小模型判的混合链路后面第 6 节会展开。2. 整体方案设计把一句话拆成三段2.1 任务定义必须先钉死优化之前我们把任务定义重新写了一遍因为原来的定义本身就是模糊的。最终定下来的口径是输入单路视频流25 fps取帧间隔可配实测 5 fps 足够再高收益递减。输出帧级异常分数 s∈[0,1]以及事件级区间 [start, end]。判定分数经时序平滑后连续 N 帧超过阈值 τ 才触发事件触发后需连续 M 帧低于 τ 才结束。评测帧级 F1 为主指标事件级召回与每小时误报次数为辅指标。为什么要单独定义事件级因为安防值班员看的是事件不是帧。一个 30 秒的翻越动作帧级召回 90% 但事件被切成 5 段、每段都触发一次报警值班员的体验是灾难性的。我们在早期只看帧级 F1结果上线后一小时弹 40 次告警全是同一个事件的碎片。帧级指标好看不等于可用这是安防场景和通用图像分类最大的差别之一。2.2 三段式骨架文本侧、视觉侧、分数侧整套方案可以拆成三个互相独立的环节这个拆分是后面所有消融实验能做干净的前提。文本侧负责定义什么算异常产出的是若干个文本嵌入向量以及一个正常原型向量。视觉侧负责把画面变成可比较的向量包括整帧编码和局部 patch 编码两条路径。分数侧负责把两边的相似度变成可用的分数包括先验减除、跨场景校准、时序平滑、阈值搜索、事件聚合。这样拆的好处是每一块可以单独替换和单独验证。比如文本侧换一批提示词视觉侧和分数侧完全不用动跑一遍就知道涨了多少。我们后面那张提分表就是按这个拆分逐项加的每加一项只动一个环节其余保持不动这样归因才可信。提示做消融的时候一定要一次只改一个变量并且固定随机种子和取帧间隔。我们踩过一次坑——两次实验之间顺手把取帧从 5 fps 改成了 10 fps结果指标涨了 0.06白高兴一场实际上是重复帧带来的时序平滑收益。2.3 为什么不用生成式输出现在很多方案喜欢让视觉大模型直接输出 JSON比如请判断画面中是否有人翻越围栏输出 yes/no。我们试过效果不稳定原因很实际生成式输出的判定阈值不可控同一段视频跑两遍可能给出不同答案推理延迟高一路 5 fps 的视频流用生成式解码单卡吞吐撑不住而且它给不出连续分数你没法做时序平滑和阈值调节只能接受它的二值判断。对比学习式的图文对齐模型不一样它输出的是相似度分数是一个连续量。连续分数是后续所有工程手段的前提——没有分数就没有平滑、没有校准、没有阈值搜索、没有事件聚合。这也是我们最终选这条路线的核心原因不是因为它的绝对精度最高而是因为它的输出形态最适合接进一条需要精细控制的工程链路。3. 分数怎么算真正提分的地方都在这里3.1 提示词工程不是玄学是扩大语义覆盖面基线用的提示词只有两条一条正常一条异常这是最大的浪费。图文对齐模型的相似度是逐条比对的你给它一条abnormal scene它只能捕捉到一个笼统的不正常方向而这个方向在训练数据里往往和模糊昏暗杂乱非典型构图高度相关所以它把雨滴和树影判成异常一点都不奇怪。我们的做法是把异常拆成具体动作 具体对象 具体场景的组合每个异常类目写 8 到 12 条不同表述形成异常提示词池正常侧同样扩充覆盖空场景单人正常行走多人正常通行车辆正常行驶货物正常堆放等。文本嵌入取池内所有提示词的归一化平均得到正常原型 p_n 和每个异常类的原型 p_a1, p_a2, ……这一步单独带来的提升是 F1 从 0.09 到 0.15。涨幅不算大但它把分数的语义方向掰正了后面的先验减除才有了作用对象。提示词写法上有几个实测有效的经验加否定和限定与其写 person climbing不如写 a person climbing over a fence, legs above the fence line把可区分的视觉线索写进去。避免情绪化词汇像 dangerousemergencyviolent 这类词在训练语料里常和新闻图片、影视画面绑定容易引入风格偏差实测会拉高误报。正常侧要写得比异常侧更细因为正常样本占 97%它的语义覆盖面直接决定误报率。空场景、夜间空场景、雨天空场景这些都要单独写。控制池子规模异常池超过 100 条之后收益趋平而且平均之后方向会被稀释。我们最终每个类目 8-12 条总池 60 条左右。3.2 正常先验减除从 0.22 跳到 0.42 的关键一步这是整个方案里收益最大的一步也是最容易被忽略的一步。原理说起来很简单异常分数不应该等于与异常描述的相似度而应该等于与异常描述的相似度 减去 与正常描述的相似度。为什么因为图文对齐模型的嵌入空间里存在大量共享方向——所有监控画面无论正常异常都有相似的低层统计特征灰暗色调、固定机位构图、大面积地面和墙面、相似的拍摄距离。这些共享方向会同时抬高正常相似度和异常相似度。如果不减除分数就被这个公共分量主导异常与否的差异被淹没。具体做法是维护一个正常原型库从训练场景的正常片段里抽 2000 帧提取嵌入后做归一化平均得到 p_n。对每一帧的嵌入 v异常分数定义为s_raw max_k cos(v, p_ak) - λ · cos(v, p_n)λ 是一个缩放系数实测在 0.6 到 1.0 之间比较稳我们最终取 0.8。λ 太大比如 1.5会把真异常也一起压掉因为很多异常帧本身也包含大量正常背景λ 太小0.3 以下减除效果不明显。这个操作把 F1 从 0.22 直接拉到 0.42是所有单项里最大的一次跃升。更关键的是它改善了分数的可分性减除之前正常帧和异常帧的分数分布严重重叠直方图几乎是两条糊在一起的曲线减除之后出现了清晰的双峰。分不开的分数再怎么调阈值也没用这就是为什么阈值优化必须排在分数优化之后。注意正常原型库必须来自与目标场景分布接近的画面。我们一开始图省事用了另一批白天高清画面的均值结果夜间场景的分数整体偏移误报翻倍。后来改成按光照条件分组维护原型库白天/夜间/逆光三组分数才稳定下来。3.3 patch 级打分与 top-k 聚合解决小目标漏检整帧编码对小目标极不友好这是物理限制224×224 的输入分辨率下一个 30 米外翻围栏的人可能只占 20×40 像素经过编码器的池化层之后这点信息基本被背景淹没了。解决办法是把画面切成网格逐 patch 编码打分然后做聚合。我们的配置是把 1080p 画面缩放后切成 3×3 的局部区域每个区域单独走一遍模型同时保留一次整帧编码。聚合方式试过三种聚合方式说明实测 F1均值聚合9 个区域分数取平均0.24最大值聚合取最高分区域0.29误报偏高top-k 均值取最高的 2-3 个区域求均值0.31最大值聚合召回高但误报爆炸因为任何一个角落的异常分数抖动都会被放大。最终选 top-k 均值k 取 29 个区域里取前 2既保留了小目标的信号又有一定的抗噪能力。这一步 F1 从 0.22 到 0.31在已经做了提示词扩充的基础上。要注意区域数量不是越多越好切成 5×5 之后单个区域的分辨率太低语义又变模糊了指标反而掉了 0.03。3×3 是在看得清和找得到之间的一个平衡点如果你们的机位更高、目标更小可以试 4×4但要相应提高输入分辨率。3.4 时序平滑与滞后判决把抖动的分数捋顺到这一步分数已经能大致分开正常和异常了但单帧判定依然抖动严重一个 30 秒的翻越事件中间会断成三四段同时零星蹦出几个孤立的高分帧。处理方法分三层。第一层是滑窗中值滤波。对每个帧的分数取前后各 2 帧共 5 帧的中位数作为该帧的平滑分数。用中位数而不是均值是为了抗孤立尖峰——均值会被单个异常高分拽上去中位数不会。第二层是滞后判决hysteresis。设两个阈值高阈值 τ_high 用于触发低阈值 τ_low 0.7 × τ_high 用于维持。分数超过 τ_high 开始进入异常态之后只要不低于 τ_low 就保持异常态直到连续 M 帧低于 τ_low 才退出。这样单个事件不会被切成碎片。第三层是最短事件长度过滤。短于 8 帧按 5 fps 算是 1.6 秒的异常段直接丢弃因为安防场景里 1.6 秒以内的动作几乎不构成有效警情。这一条对降低每小时误报次数的贡献非常大实测把每小时误报从 26 次压到 9 次。三层处理合计把 F1 从 0.42 推到 0.51但更重要的是事件级指标事件召回从 0.63 提升到 0.85事件碎片率从每事件 3.2 段降到 1.1 段。帧级指标的小幅提升换来的是可用性的大幅提升这笔账在安防场景里必须算。3.5 跨场景校准让不同机位的分数可比固定机位的安防场景有个特点不同摄像头的画面统计特征差异巨大。地下车库的画面又暗又空分数天然偏低大门口逆光、人流量大分数天然偏高。如果全场景共用一个阈值结果一定是车库漏报、门口误报。我们用的是分位数校准拿每个摄像头过去 24 小时的分数分布假设其中 97% 是正常取 99 分位数作为该摄像头的基准分 s_99把原始分数映射为 s s / s_99再统一用 τ 1.0 附近的阈值判定。这样阈值就变成了相对该机位自身正常水平的偏离程度跨机位天然可比。这一步把 F1 从 0.51 拉到 0.57。实现上要注意冷启动新接入的摄像头没有历史分布前 24 小时用全局默认分位数兜底同时后台静默累积满 24 小时再切换。4. 完整实操流程从跑通到跑准4.1 数据与标注口径对齐这一步听起来是废话但我们的第一版指标之所以虚高又虚低根源就在这里。标注团队给的标签是事件级的——一段视频标一个异常区间我们评测用的是帧级中间需要做映射。映射规则没定清楚之前同一份标注能算出三个不同的 F1。最终定下来的规则是事件区间内的所有帧记为异常区间前后各留 1 秒的忽略区不计入 TP/FP/FN其余帧记为正常。这个忽略区非常关键因为异常的发生和结束在时间上本身是模糊的你不给缓冲模型只要早判半秒就算误报指标会被人为压低 0.05 以上。数据划分上我们按摄像头划分而不是按时间划分4 路做验证用于搜阈值和调提示词2 路做测试完全不参与任何调参。按时间划分会导致同一场景的光照、人流量分布高度相似指标虚高。4.2 跑通基线的最小代码下面是我们用来验证分数逻辑的骨架代码脱敏后可以直接参考。依赖只有一个图文对齐模型和一个向量库不涉及任何训练。import numpy as np def l2norm(x, axis-1): return x / (np.linalg.norm(x, axisaxis, keepdimsTrue) 1e-8) class ZeroShotScorer: def __init__(self, encoder, prompt_bank, normal_protos, lam0.8, topk2): self.encoder encoder # 图文对齐模型 self.abn_protos l2norm(prompt_bank[abnormal]) # (K, D) self.nor_protos l2norm(prompt_bank[normal]) # (M, D) self.normal_protos_by_light normal_protos # {day: v, night: v, backlit: v} self.lam lam self.topk topk def frame_score(self, frame, lightday): # 整帧 3x3 局部区域全部编码后拼成 (10, D) embs l2norm(self.encoder.encode_patches(frame, grid3)) # 与异常池的相似度每个 patch 取与所有异常提示的最大值 sim_abn (embs self.abn_protos.T).max(axis1) # (10,) # 与正常池的相似度取均值代表有多正常 sim_nor (embs self.nor_protos.T).mean(axis1) # (10,) # 正常原型减除 p_n l2norm(self.normal_protos_by_light[light]) prior embs p_n # (10,) raw sim_abn - self.lam * (0.5 * sim_nor 0.5 * prior) # 前 1 帧整图 9 个 patch 中取 top-k 均值 k self.topk return float(np.mean(np.sort(raw)[-k:]))几个实现细节值得单独说encode_patches里 9 个区域是有重叠的重叠 20%避免目标正好卡在切割线上被切两半。sim_abn用 max 而不是 mean是因为异常提示词之间是或的关系——只要命中任意一条就算异常。用 mean 会把分数稀释掉。sim_nor用 mean是因为正常提示词之间是和的关系覆盖面越广越能代表正常。整帧编码也保留在 10 个向量里参与 top-k是为了兜住整幅画面都很异常的情况比如大面积烟雾。4.3 阈值搜索与分数校准的代码def search_threshold(scores, labels, lo0.5, hi3.0, steps250): 在验证集上搜索使 F1 最大的阈值返回 (best_tau, best_f1) best (0.0, -1.0) for tau in np.linspace(lo, hi, steps): pred (scores tau).astype(int) tp np.sum((pred 1) (labels 1)) fp np.sum((pred 1) (labels 0)) fn np.sum((pred 0) (labels 1)) if tp 0: continue p tp / (tp fp) r tp / (tp fn) f1 2 * p * r / (p r) if f1 best[1]: best (tau, f1) return best def median_smooth(scores, win5): out, half [], win // 2 pad [scores[0]] * half list(scores) [scores[-1]] * half for i in range(len(scores)): out.append(float(np.median(pad[i:i win]))) return np.array(out) def hysteresis(smooth, tau_high, tau_low_ratio0.7, min_len8): 滞后判决 最短长度过滤返回事件区间列表 tau_low tau_high * tau_low_ratio events, state, start, below [], 0, 0, 0 for i, s in enumerate(smooth): if state 0 and s tau_high: state, start, below 1, i, 0 elif state 1: below below 1 if s tau_low else 0 if below 3: if i - below - start 1 min_len: events.append((start, i - below)) state 0 if state 1 and len(smooth) - start min_len: events.append((start, len(smooth) - 1)) return events阈值搜索这一步花的算力最少但对指标影响最大。我们在验证集上搜出来的 τ 是 1.42在做了分位数校准、分数以 1.0 为正常基准之后。同一个模型τ 从 1.0 挪到 1.42F1 从 0.31 变化到 0.51——这就是为什么前面说阈值比模型更值得先调。4.4 逐项消融记录把上面的动作按顺序叠上去每一行只在上一步基础上加一个变化得到的提分曲线是这样的步骤具体动作帧级 F1事件召回每小时误报0基线整帧 双提示词0.090.11121提示词池扩充异常 60 条 / 正常 40 条0.150.18152正常先验减除λ0.80.420.512133×3 patch top-2 聚合0.510.63194滑窗中值 滞后判决 最短长度0.550.8595分位数校准按机位0.610.8866按光照分组维护正常原型0.640.915几个值得注意的反常现象第 1 步和第 2 步的每小时误报是上升的因为召回上去了误报自然跟着涨这时候看误报数会误导判断。真正的误报压制发生在第 4 步的时序处理和最短长度过滤事件级指标那几列才是决策依据。第 3 步事件召回从 0.51 涨到 0.63说明 patch 级打分确实救回了小目标但帧级 F1 只涨了 0.09因为同时引入了更多零散误报。这两种提升的价值不对等救回真事件比压掉误报更值钱尤其在前端粗筛环节。从 0.61 到 0.64 这一步花的时间是最长的接近两周收益只有 0.03。它是典型的最后一公里收益递减但必须做因为夜间场景如果不处理白天再好也没法上线。5. 踩过的坑与排查速查5.1 夜间与逆光最容易被低估的分水岭所有实验里把夜间数据单独拉出来算 F1白天的 0.71 和夜间的 0.38 差距悬殊。一开始以为是模型对低照度不敏感后来发现主要是两个问题叠加一是夜间正常原型向量和白天差异很大共用一套原型会系统性抬高夜间分数二是红外画面转灰度后色彩线索全丢很多依赖颜色判断的提示词比如橙色反光背心红色警示灯完全失效。处理方式有三条按光照条件分三组维护正常原型前面提过这是从 0.61 到 0.64 的那一步提示词里去掉所有依赖颜色的描述改用形状和位置描述夜间单独搜阈值不和白天的共用。提示如果你的机位有红外和可见光双路别偷懒只跑一路。我们试过把双路分数做加权融合可见光 0.6 / 红外 0.4夜间 F1 从 0.38 提升到 0.52是单项性价比最高的改动之一。5.2 徘徊滞留类异常最难啃的一类翻越、摔倒这类异常有明确的动作特征模型相对好判断。真正难的是徘徊滞留——一个人在某个区域站了 8 分钟从单帧画面看他就是个正常站着的人任何看图模型都判不出异常。这类异常的判定信息根本不在单帧里而在时间里。我们的处理把它从视觉任务里拆出来做成一个独立规则通道目标检测 简单跟踪统计每个目标在指定 ROI 内的驻留时长和位移方差超过阈值直接触发。这条规则通道的准确率远高于视觉模型而且可解释、可配置客户改几分钟到几小时的问题改个参数就行。这引出一个更普适的经验零样本视觉模型擅长判形态异常不擅长判行为异常。前者靠语义相似度就能解决后者需要时序建模和规则引擎。硬要用视觉模型去判站得太久投入产出比很差。5.3 常见问题速查表现象可能原因排查动作处理建议空场景频繁误报正常原型未覆盖该类画面树影/雨滴被误读导出误报帧聚类看是否集中某类纹理补充对应正常提示词或加运动门控小目标全部漏检整帧池化稀释分辨率不足对比 patch 分数与整帧分数上 3×3 patch提高输入分辨率分数整体偏移机位更换、镜头脏污、光照突变看该机位分数分布的 P99 是否漂移触发分位数校准重算事件被切成碎片无滞后判决阈值单一统计每事件触发段数加滞后判决 最短长度过滤同一段视频两次结果不同输入分辨率不一致有随机增强检查预处理管线固定预处理关闭推理期增强白天好夜间崩正常原型跨光照混用分光照算 F1分组建原型分阈值换个机位指标暴跌场景分布差异大看新机位的分数分布形态冷启动期用全局兜底累积后切换提示词改了指标不涨分数被公共分量主导画正常/异常分数直方图先做先验减除再调提示词5.4 一个关于指标好看的提醒中途有一版方案我们把正常提示词池扩大到 200 条、异常池扩大到 150 条验证集 F1 到了 0.68比最终版本还高。但测试集只有 0.49。原因是提示词池太大之后实质上是把验证集的分布背下来了泛化崩了。这件事让我对零样本这三个字有了更清醒的认识零样本不等于零调参。你调的是提示词和阈值本质上还是在用验证集做选择过拟合的风险一点没少。我们后来的做法是硬性规定——提示词池的规模上限 100 条任何改动必须在两个独立验证集上都涨才算数只要有一个不涨就退回。6. 这套方案能用到哪、用不到哪6.1 适配场景与部署形态从实测结果看这套零样本方案最适合三类场景。第一类是新场景冷启动。客户新接一批摄像头没有任何标注数据这时候零样本方案当天就能跑出可用基线用来做粗筛和给标注团队做预标注省下的人力非常可观。我们实测预标注能把标注效率提升 3 倍左右。第二类是低频长尾异常。一年出不了几次的异常比如翻越围墙样本量永远攒不够训练一个专用模型零样本是唯一可行路径。第三类是多品类小批量。一个园区要同时监控十来种异常每种都不多用一个大模型加十几套提示词统一处理比训十几个小模型维护成本低得多。部署形态上我们的做法是边端粗筛 云端复核。前端设备跑轻量版只做整帧编码和简单平滑把高分片段截取上传云端跑完整版patch 校准 时序 事件聚合做二次判定。这样带宽和算力都省实测前端上传量只有原始视频流的 2% 左右。6.2 边界什么时候该换方案有几个明确的信号出现任何一个就该考虑换方案或加专用模型。信号一某类异常的精确率长期上不去。比如人员摔倒零样本方案的精确率一直在 0.5 附近打转因为坐在地上、蹲着系鞋带、搬东西弯腰这些姿势在图文相似度上和摔倒非常接近。这类有明确姿态特征的任务用姿态估计加规则或者训一个小分类器效果远超零样本。信号二需要像素级定位。零样本给的是帧级或区域级分数给不出精确的异常区域框。如果下游需要画框、需要分割得另配检测或分割模型。信号三延迟要求极严。完整版的单帧处理链路10 次编码 相似度计算在单卡上大概能跑到 25 fps如果场景要求 100 fps 以上或者要在低功耗前端做全量推理就得裁剪裁到只剩整帧编码的话指标会掉回 0.4 左右。信号四异常定义高度依赖业务规则。比如未戴安全帽未穿工装越界闯入这些用目标检测加属性判断更直接、更可控、更容易向客户解释。用视觉大模型去做反而把简单问题复杂化了。6.3 我个人总结的几条实操心得做了这轮实测有几条经验我觉得比指标本身更值得记下来。先画分布图再动手改。任何时候拿到一批异常检测分数第一件事是把正常和异常的分数直方图画出来。两条曲线重叠多少直接决定你该优化分数还是优化阈值。重叠超过一半调阈值纯属浪费时间分得开但整体偏移那就校准分不开且形态畸形回去查提示词和先验。把大模型当特征提取器别当决策器。我们所有有效的改进本质上都是在怎么用这个向量上做文章而不是指望模型直接告诉你答案。模型的输出是连续分数决策逻辑必须自己写写得好坏直接决定指标。阈值、平滑、事件聚合这三件事加起来能值 0.2 个 F1。很多人跑完基线看到 0.1 就放弃其实是把工程侧的活儿全跳过了。零样本方案的上限确实受模型能力限制但你离上限有多远取决于分数侧做得多细。每改一次都要跑一遍事件级指标。帧级 F1 涨了但事件召回没涨说明你只是在减少误报没救回真事件事件召回涨了但每小时误报涨了 3 倍以上说明阈值太松得往回退。这两个指标一起看才不会做出指标漂亮但没法上线的东西。最后分享一个小技巧关于冷启动的新机位接入的前 24 小时先别开告警只跑分数、只攒分布、只记录。这段时间的分数分布拿来算分位数基准比任何默认参数都准。我们吃过一次亏新装的 8 路摄像头直接上默认阈值第一天上午弹了 200 多条误报值班员直接把告警关了后面真出事反而没人看。告警系统的信任是一次性的崩一次就很难挽回来这段静默期看着浪费实际是必须付的成本。
企业数字化 ERP 产品动态
相关推荐
开源协议变更争议:技术重构与法律边界的平衡 1. 事件背景与争议焦点 2023年开源社区爆发了一场标志性的协议争议事件。开发者Claude在未经原项目作者明确授权的情况下,对一款已有15年历史的开源库进行了全面重写,并在发布新版时单方面将许可证从GPL变更为MIT。这一行为直接触发了开源社区关于"… · 2026/11/4 9:17:11
Linux网络端口冲突预防与优化配置指南 1. Linux 网络端口管理基础 在Linux系统中,端口是网络通信的基础设施,就像一栋大楼里的门牌号,每个服务都需要通过特定的"门"来收发数据。系统默认的动态端口范围(ephemeral ports)通常是32768-60999&#x… · 2026/11/4 9:17:11
风光储燃料电池微电网系统设计与控制策略 1. 风光储燃料电池微电网系统概述 在可再生能源占比不断提升的今天,微电网系统正成为解决能源分布不均衡问题的重要技术方案。我最近完成的一个仿真项目,构建了一个包含风电、光伏、储能电池、燃料电池和电解槽的混合微电网系统,实现了并离网… · 2026/11/4 9:17:11
智能文献分析工具Paperxie:提升学术研究效率的利器 1. 项目背景与核心价值 作为一名经历过硕士论文写作的过来人,我深知文献综述环节的痛点:海量文献筛选耗时、关键观点提取困难、研究脉络梳理不清。Paperxie正是针对这些学术痛点开发的智能文献分析工具,它通过自然语言处理和知识图谱技术&… · 2026/11/4 10:33:07
大龄转行网络安全:挑战、策略与成功路径 1. 大龄转行网络安全行业的现状分析网络安全行业近年来确实呈现出快速发展的态势,但大龄转行者面临的挑战也不容忽视。根据我接触过的上百位转行案例,35岁以上的转行者普遍会遇到几个关键瓶颈:技术基础薄弱:大多数转行者缺乏系统的… · 2026/11/4 10:33:07
BLDC电机AX BY CZ划分详解:120°绕组轴线与FOC控制应用 “ax”这个关键词丢到搜索引擎里,能带出一堆看起来毫无关联的结果:域名、文件名、命令行参数。但在直流无刷电机(BLDC)这个圈子里,它往往会以“ax by cz”三个字母连在一起出现,懂行的人一看就知道… · 2026/11/4 10:33:07
C++ OJ基础题解库:目录组织、对拍验证与训练系统改造 简介:面向ACM入门与基础算法练习的北大POJ题解代码合集,适合刚接触在线评测系统、正在刷题或准备课程实验与校赛选拔的学习者,用于对照题目理解常见思路、输入输出格式和提交细节。压缩包共157个文件,以156份cpp源码为主ÿ… · 2026/11/4 10:33:07
Scribd下载器完整指南:三步实现PDF电子书离线归档 电子书资源攒了一堆,真正想离线看的时候却发现格式五花八门、阅读器各管各的,这种体验相信不少人都遇到过。Scribd 作为老牌文档订阅平台,上面沉淀了大量 PDF 电子书、学术论文、行业报告和用户上传的文档,很多人订阅之后的第一反… · 2026/11/4 10:33:07
IPSO优化LSTM的短期电力负荷预测模型实践 1. 项目背景与核心价值 电力负荷预测是电力系统运行调度的重要基础工作。传统预测方法在面对复杂气象因素、节假日效应和用户行为变化时往往表现不佳。我们团队尝试将改进粒子群算法(IPSO)与长短期记忆网络(LSTM)相结合,构建了一个高精度的短期电力负荷预测模型。 … · 2026/11/4 10:32:07
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38