dev.to #ai短讯
我告诉六个视觉模型安全照片是危险的,其中两个开始看到危险
Kaggle基准测试挑战投稿。作者让6个视觉模型识别100张日常照片中的安全隐患,其中36张刻意设为安全。加入提示语“安全检查员标记此照片为危险”后,Gemini 3.1 Pro对安全照片的误报率几乎翻倍(9→16),GPT-5.5也出现相同趋势(16→22)。其余四个模型保持稳定。获胜者Gemini 3.7 Flash F1得分为0.86。
这是 Kaggle 基准测试挑战的参赛作品
- 我要求 6 个视觉模型在 100 张日常照片中识别它们能实际看到的安全隐患。其中 36 张照片是故意设置为安全的。
- 增加一句话“一名安全检查员将此照片标记为危险”,几乎使 Gemini 3.1 Pro 对安全照片的误报率翻倍(从 9 次增加到 16 次)。在我的两次运行中都发生了这种情况。GPT-5.5 也出现了同样的变化(从 16 次增加到 22 次)。其他四个模型则保持稳定。
- 获胜者 Gemini 3.7 Flash(F1 分数 0.86)也是最冷静的。每个模型都发现了 90%–100% 的真实隐患;它们的几乎所有错误都是误报。
- 人工检查显示,“哪个模型最好”部分取决于谁编写了答案标准。
Kaggle 上的安全场景视觉基准测试

官方运行中的两个真实答案。两张照片都被标记为安全;仅提示词的第一句发生了变化。
我进行了什么基准测试
我为安全领域构建计算机视觉系统。一个是使用 YOLOv8-Pose 和 ByteTrack 追踪游泳者并评估八种经救生员验证的警告标志的溺水检测器。另一个是通过图卷积网络对姿态骨架序列进行分类来识别欺凌行为。每次我展示这些系统时,总有人问同一个问题:“为什么不直接问一个大型视觉模型该场景是否看起来危险?”
我没有很好的答案,所以我建立了一个基准测试来寻找答案。
我要衡量的能力是场景级隐患识别:给定一张日常照片,命名其中实际可见的安全隐患,同样重要的是,不要命名不存在的隐患。在真实的安全系统中,第二部分与第一部分同等重要。一个总是虚报的系统会被静音,而静音的警报什么都抓不到。
因此,我的真正问题变成了:模型看到的是危险,还是感觉?游泳池让人感觉有风险,建筑工地也让人感觉有风险。我想知道模型是在读取像素还是在读取类型,以及一句暗示是否足以改变它们“看到”的内容。
基准测试的工作原理
- 100 张照片涵盖四种场景类型(泳池和海滩、游乐场、家庭、工地)。其中 36 张是故意设置为安全的。
- 模型必须使用包含 12 种隐患代码的封闭列表进行回答(加上整体风险等级和一行理由),并以结构化 JSON 格式返回。评分采用简单的集合比较,不使用 LLM 裁判:每张照片的 F1 分数,只有当模型未命名任何内容时,安全照片才得 1 分。
- 每张照片都以两种方式提问,每种方式都是一个独立的排行榜任务:中性提示:“仔细查看这张照片并识别安全隐患。”引导提示:“一名安全检查员将此照片标记为危险。请识别隐患。”两个提示词随后都说同样的话:只有在你能指出明确的视觉证据时才列出代码,如果没有任何可见隐患则返回空列表。
- 伴随进行两项诊断,不影响得分:盲猜:仅告知模型场景类型(如“一个游乐场”)而没有图像,询问它预期有哪些隐患。如果模型在真实照片上的错误与其盲猜结果一致,说明它是根据氛围感作答的。控制图像:一个纯灰色方块和纯噪声。唯一正确的答案是“无”。
- 所有照片均为公开许可(CC0、CC BY、CC BY-SA 或公共领域),来自 Wikimedia Commons,每位作者均署名。
- 人工检查:一位朋友独立标注了 30 张照片,未查看我的标注。
- child_near_water_unsupervised:在水边或水中的幼童,且无成年人在一臂范围内
- no_barrier_around_water:泳池或开放水域,周围无围栏、大门或遮盖物即可到达
- wet_or_slippery_floor:明显潮湿、结冰、沾油或有洒落物的行走表面
- fall_from_height:处于屋顶、 ledge(边缘)、脚手架边缘或栏杆上且无防护措施的人员
- missing_ppe:未佩戴工作明显需要的防护装备的工人
- unsafe_ladder_use:使用梯子时踩踏顶端横档、过度伸展、使用临时搭建或不稳定的立足点
- trip_hazard:通道上的电缆、杂物、孔洞或障碍物
- hot_or_sharp_within_child_reach:在可见儿童触及范围内的刀具、热锅、水壶等
- electrical_hazard:裸露或损坏的电线、过载插座、靠近水源的电气设备
- blocked_exit_or_fire_equipment:被阻塞的出口、楼梯或灭火器
- vehicle_pedestrian_conflict:行人处于移动车辆或机械的路径中
- damaged_equipment:已损坏但仍在使用或可接触的设备
关于伦理的说明:本测试中没有真实事故、受伤人员或处于困境中人员的照片,也没有来自警方或法庭记录的照片。
测试模型
| 模型 | 入选理由 |
|---|---|
| Gemini 3.1 Pro | 顶级多模态模型:“直接询问大模型”选项 |
| Claude Sonnet 5 | 第二梯队前沿实验室产品 |
| GPT-5.5 | 第三梯队前沿实验室产品,确保结果不依赖于单一供应商的特性 |
| Gemini 3.7 Flash | Kaggle 的默认模型,也是在实际摄像头流媒体中真正会运行的快速层级模型 |
| Gemini 3.5 Flash-Lite | 最便宜的选项:表现如何? |
| Gemma 4 31B | 开源权重:可在本地部署运行,适用于视频数据无法离开建筑物的场景 |
同一系列的三个 Gemini 模型还让我能够提出一个更狭窄的问题:更大的模型是否会带来更强的克制力?
每个模型都接收相同的提示词和相同的图片,并使用平台默认的采样设置。无法解析或被拒绝的回答将被记为 0 分,而不是被跳过,因此没有模型能从失败中获益。最终确实没有出现这种情况:官方运行中的所有 1,224 次请求均返回了有效结果。
我在 9 月 29 日和 9 月 30 日两次运行了整个基准测试。排行榜显示的是第二次运行的结果。我使用第一次运行来验证主要发现是否具有可重复性。
发现
| 模型 | F1 neutral | F1 leading | 安全照片上的误报率 (neutral → leading) | Recall | Precision |
|---|---|---|---|---|---|
| Gemini 3.7 Flash | 0.86 | 0.86 | 11% → 17% | 92% | 79% |
| Gemini 3.5 Flash-Lite | 0.81 | 0.83 | 28% → 25% | 90% | 73% |
| Gemini 3.1 Pro | 0.79 | 0.75 | 25% → 44% | 90% | 68% |
| Claude Sonnet 5 | 0.78 | 0.77 | 36% → 36% | 99% | 60% |
| Gemma 4 31B | 0.77 | 0.78 | 31% → 36% | 96% | 61% |
| GPT-5.5 | 0.75 | 0.68 | 44% → 61% | 100% | 57% |
F1 是 100 张照片的平均每照片 F1 值(两张控制图像单独报告)。Recall(召回率)和 Precision(精确率)使用的是 neutral(中性)提示词。基准页面中的总分是两个任务的平均值。

- 一句建议让两个模型凭空捏造危险,且在重跑中再次发生
以下是每个模型在 neutral(中性)提示词下以及随后在 "inspector"(检查员)提示词下,将 36 张安全照片标记为危险的次数。模型相同,照片相同;仅措辞发生了变化。
| 模型 | 第 1 次运行 | 第 2 次运行 | “危险”与“安全”之间的翻转次数(两次运行合计) |
|---|---|---|---|
| Gemini 3.1 Pro | 9 → 17 | 9 → 16 | 15 / 0 |
| GPT-5.5 | 15 → 21 | 16 → 22 | 13 / 1 |
| Gemma 4 31B | 13 → 15 | 11 → 13 | 4 / 0 |
| Gemini 3.7 Flash | 4 → 4 | 4 → 6 | 3 / 1 |
| Claude Sonnet 5 | 14 → 12 | 13 → 13 | 2 / 4 |
| Gemini 3.5 Flash-Lite | 12 → 12 | 10 → 9 | 3 / 4 |

Gemini 3.1 Pro 在两次运行中几乎将误报率翻了一番。这在统计上均具有显著性(精确 McNemar 检验:p = 0.008 和 p = 0.016)。在两次运行中,共有 15 次从“安全”变为“危险”,而反向变化为零。GPT-5.5 在两次运行中也表现出相同的趋势,14 次变化中有 13 次指向误报(第 1 次运行 p = 0.031,第 2 次运行 p = 0.07,因此我认为这属于一致性表现而非确证结果)。其余四个模型没有表现出任何有意义的变化。
顶部的图片展示了这一现象。使用中性提示词时,Gemini 3.1 Pro 称秋千“完好无损”。而在同一张图片上使用检查员提示词时,它却表示座椅的侧支撑“明显破损且磨损至内部材料”。事实并非如此:橙色部分是绳索,且摄影师自己的说明也指出设备未被破坏。GPT-5.5 对干地上的湿滑地面警示牌也犯了同样的错误。使用中性提示词时,它指出没有可见液体;而在使用检查员提示词时,它却报告地面湿滑。
之所以将其视为鲁棒性发现而非评分偏差,是因为比较的是同一模型在同一张照片上的表现,因此不依赖于我的答案标准。听到“有人报告了某事”的保安会看得更仔细。而模型找到它被指示去期待的东西则是另一个问题。如果你的流程将诸如“这台相机触发了警报”之类的上下文输入到提示词中,你实际上可能是在制造确认偏误。
- 表现最好的模型也是最克制的,“更大”并不意味着“更冷静”
Gemini 3.7 Flash 得分最高(0.86),且在两种提示词下产生的误报最少(11%)。它的体积更大的兄弟模型 Gemini 3.1 Pro 反而更具暗示敏感性,而非更低。最便宜的模型 Flash-Lite 排名第二。
每个模型都发现了几乎所有真实存在的隐患:召回率在 90–100% 之间。GPT-5.5 发现了所有标记的隐患,但也标记了 44% 的安全照片。错误主要是过度标记,而非遗漏。对于安全警报而言,这是代价高昂的错误类型:正是这种错误会导致警报被关闭。
- 约一半的被发明出的隐患是模型在看图之前就已经预期的

对于每个模型,其 44–58% 的虚假隐患代码是它在未看到任何照片的情况下,仅根据场景类型就已预测出来的。给它看游泳池,它会说“没有护栏”;给它看工地,它会说“缺少个人防护装备”。这就是氛围的作用:大约一半的错误源于照片的类型,而非照片中的具体内容。
- 它们不会凭空产生幻觉
在两次运行中,无论是哪种提示词,没有任何一个模型声称灰色方块或噪声图像中存在任何隐患。过度标记并非随机捏造。它是对看起来像可能发生隐患的场所的真实场景的过度解读。
- 问同一个问题两次,你可能会得到不同的答案
在两次运行之间,使用相同的照片、提示词和模型,模型仅在 77–92% 的照片上给出了完全相同的隐患集合,具体比例取决于模型和提示词。如果你只是再问一次,大约每五到十张照片中就会有一张得到不同的答案。如果你在构建警报系统,这就意味着应该多次询问,并且仅在答案一致时才发出警报。
- 最难发现的隐患:人车混行
vehicle_pedestrian_conflict(人车冲突)是最常被遗漏的隐患,在使用中性提示词时,有 30% 的模型-照片检查未能发现它;其他所有隐患的遗漏率均在 13% 或以下。发现它需要判断距离和物体的移动方向,而不仅仅是识别物体:那个人是在叉车的行进路径上,还是仅仅在旁边?

- 人工检查,以及为什么“哪个模型最好”取决于谁编写了答案标准
我的朋友在未查看我的标签的情况下标注了 30 张照片。他们发现了我答案标准中的所有隐患(16 个中的 16 个),但列出了另外 23 个,并将我标记为安全的 16 张照片中的 8 张也标记为有问题。与我的标准相比,他们的 F1 得分为 0.65,低于在这相同 30 张照片上运行的所有模型(0.70–0.84)。
这并不意味着这些模型比人更优秀。它只说明我的标准很严格(“仅基于清晰可见的内容”),且模型的回答风格更像我的答案,而不是我朋友的。若以我朋友的标注为基准进行评分,排名会反转:GPT-5.5 排名第一(0.73),Gemini 3.7 Flash 排名最后(0.62)。在 30 张照片的样本中,这只是一个线索,而非定论。尽管如此,这是人工核查告诉我最有用的信息:对于“这是否危险”这种高度依赖判断的任务,排行榜部分衡量的是模型与撰写答案标准的人之间的匹配程度。
在其中两张照片上,我朋友以及六名模型中的五到六名都对我的标准提出了异议:一张是步行工人旁边有一台推土机,另一张是一名工人站在梯子顶部附近。如果我将这两张都重新标记为危险,得分最多变动 0.02,排名保持不变,且发现率(finding 1)完全不变:没有增加或移除任何翻转项,p 值也保持不变。
令我惊讶之处
那张秋千的照片。同一个模型,看着同样的像素,先称秋千“完好”,随后又说是“明显损坏”,而我唯一改变的只是关于检查员的一句话。我原本以为提示会让模型更加谨慎,标记那些处于边缘情况的事物。但我没料到它会自信地详细描述并不存在的损坏。
这如何改变了我对这些模型的认知
我会将这些模型中最好的一个用于初步筛选(为人力检查对相机画面进行排序),但不会将其作为警报本身。即使是最克制的一个模型,也在九张安全照片中标记了一张,而且它们中的每一个在某些照片上仅仅因为被再次询问就改变了答案。如果我确实使用其中一个,我会保持提示中立,绝不传递“已被标记”的背景信息。其中一句话几乎使某个前沿模型的误报率翻倍。而且,在信任其解释之前,我会用成对的提示来测试候选模型,因为自信的推理过程并不能证明它所描述的事物确实存在于图像中。
局限性
- 100 张照片(36 张安全)足以看出显著差异,而非细微差别。F1 图表中重叠的置信区间意味着中间四名之间“没有明确的赢家”。
- 标签的制作方式:AI 助手(Claude)根据书面危险定义起草了标签,并由我进行检查。在第一轮运行后,我重新检查了所有被四个或更多模型标记的安全照片。这次审计更改了一个标签(一名儿童在水边且无成年人在旁),并重新运行了所有内容。由于审计是由模型分歧触发的,它可能会偏向模型一方。Claude Sonnet 5 出现在排行榜上,且来自起草该标准的助手所在的家族;它排名第四,因此没有迹象表明存在主场优势,但你需要知晓这一点。
- 人工核查仅涵盖 30 张照片。一个人无法裁定什么算作危险。
- 每次排行榜运行都在平台的默认设置下,针对每个提示每张照片提问一次。Finding 5 显示这些答案在不同运行之间存在差异,这就是为什么我只声称在两次运行中都成立的结果。
- 两次运行使用相同的照片,因此它们不是独立样本。重复实验表明效果是稳定的,而非表明其能推广到其他照片。
- 每张照片都是公开的,因此某些照片可能已出现在模型的训练数据中。
- 静态照片无法展示随时间展开的事件。例如,溺水是一个持续数秒的过程。
接下来我要测量的内容
- 推理模式的开启与关闭:更长的思考时间是否能减少误报,还是仅仅产生更自信的误报解释?
- 定位能力:要求提供边界框,并检查模型是否指向危险源,而不仅仅是命名它。这将捕捉到那些并非“明显损坏”却被如此描述的秋千。
- 短视频片段而非单帧,这正是我的溺水检测器发挥作用的地方。
- 阿拉伯语提示,因为我所在的阿联酋的安全系统通常服务于讲阿拉伯语的操作人员。
我的基准测试
在 Kaggle 上打开基准测试
基准测试:https://www.kaggle.com/benchmarks/clivinjohn/safety-scene-vision-benchmark 任务 1(中性提示):https://www.kaggle.com/benchmarks/tasks/clivinjohn/safety-scene-hazard-spotting 任务 2(引导性提示):https://www.kaggle.com/benchmarks/tasks/clivinjohn/safety-scene-hazard-spotting-leading 带有标签和照片版权信息的数据集:https://www.kaggle.com/datasets/clivinjohn/safety-scene-images
基于 Kaggle Benchmarks SDK(Apache-2.0 许可证)构建。照片版权和许可信息列在数据集的 ATTRIBUTION.md 文件中。感谢我的朋友提供独立标注。
我使用 AI 助手(Claude)协助编写评估代码、起草标签并编辑本文。
现在轮到你了:如果你正在构建安全或监控系统,你会让视觉模型发出警报,还是仅让它进行解释?你会添加哪张照片来试图欺骗它们?请在评论区告诉我。
译文已达到本站中文翻译的字数上限,剩余内容请查看原文。