凌晨两点,有人在小巷 CCTV 的镜头里扔下易拉罐后消失了。计算机要从画面的几百万个数字中找到人,把人变成有 13 个关节的火柴人,再把火柴人的动作压缩成几个数字(特征),判断“是不是乱扔垃圾”。我们将一路追踪下去:人定的规则会在哪里上当,学习能纠正什么,以及为什么“掉在哪里”是最重要的线索。
CCTV 监控室里有几十块屏幕,人不可能整夜盯着所有画面。研究室接到的任务只有一个:让 AI 先察觉到乱扔垃圾的“动作”。
从 600 万个数字中找到人,把姿势压缩成 26 个数字
把 46 帧的动作概括为 4 个特征,并比较规则与学习
实时分数与暂不判定,以及这种方法会出错的地方
计算机收到的不是照片,而是每个格子里红、绿、蓝的强度(0~255)。切换查看方式,再把鼠标移到画面上看看。
全高清 CCTV 的一帧是横 1,920 × 竖 1,080 个格子,每个格子有红、绿、蓝三个数字。1,920 × 1,080 × 3 = 6,220,800 个。每秒 30 帧的话,1 秒就是 1 亿 8,662 万个。这些数字里没有任何一个贴着“人”或“垃圾桶”的标签。所以第一步,是先从这堆数字中找出什么东西在哪里。照片变成数字矩阵的过程在 4-2 中有详细讲解。
分两步。先由目标检测找出人、垃圾桶、易拉罐的方框(边界框)。接着由姿态估计在人的方框内找出 13 个关节的坐标。开关各个图层试试看。
坐标是直接从图片(1402 × 1122)上读取关节点得到的值。左上角是 (0, 0),越往下 y 越大。因为我们面对着人,所以画面左边的手臂是“右臂”。
乱扔垃圾不是一个画面,而是 3 秒内的动作。选选这六个场景看看。黄色虚线是右手腕的轨迹,下方图表是手腕速度和易拉罐的状态。
这六个场景不是真实视频,而是让关节角度随时间变化生成的合成数据。以身高为 1 的单位计量(以身高 1.7m 为基准),扔出的易拉罐受重力作用沿抛物线飞行。代码 1 的函数和这张图是同一个计算。如果是真实视频,第 3 节的姿态估计会为每一帧生成这些坐标。
把 1,196 个数字压缩成人挑选的 4 个特征。然后用两种方式判定:人定的规则,以及从数据中学习的模型。移动阈值,找找规则在哪里出错。
改变六个场景的速度(×0.8~1.25)、位置、动作幅度(×0.75~1.25),生成 600 个训练场景、300 个测试场景,并给关节坐标加上抖动(姿态估计误差)。正确答案由结果决定:易拉罐留在垃圾桶外的地面上就是乱扔。所以“远远扔出”如果用力扔进了桶里也算正常(测试中的扔出只有 52% 是乱扔)。格子里的数字是该场景被判定为乱扔的比例,与正确答案相差超过 5%p 的标为红色。
规则 1(60.7%):把 94% 的挥手判成了乱扔(误报)。慢慢丢下的乱扔则漏报了 98%。
规则 2(76.7%):加上“是否松手”后,挥手的误报消失了。但丢下仍然会漏报,连扔进桶里的正常场景也被判成乱扔。
4 个特征 + 逻辑回归(99.7%):学到的权重是 [速度 −0.33,松手 1.16,与桶的距离 3.93,远离 1.19]。手腕速度反而得到一个很小的负数。模型选出的最强线索是“易拉罐是否留在桶外的地面上”。
直接输入坐标的 MLP(92.3%):学会了扔东西的“样子”,但对扔进桶里的情况也发出了警报(误报 19 个)。即使再加上 2 个物体坐标也没有改善。在 1,288 个数字中,只靠 600 个训练样本很难找出“最后一帧易拉罐的 x 坐标是否在桶外”。
直接使用代码 2 中逻辑回归学到的权重。只用目前看过的帧重新计算 4 个特征并打分。0.6 以上发出警报,0.4~0.6 则暂不判定,交给人来处理。
误报会让无辜的人受到怀疑,漏报会让管控形同虚设。两种错误的分量不同,所以很难只定一个阈值。因此,分数模棱两可的区间(这里是 0.4~0.6)不做自动判定,而是让监控员亲自查看视频。AI 只用来决定“先看哪个画面”的顺序,最终判断和责任由人承担。多点几次“随机场景”,找找扔进桶里的扔出和扔得很轻的扔出。
火柴人和 4 个特征易于理解,也很轻量。但相应地,它遗漏的东西也很明显。
两段代码都只使用 Colab 默认安装的库。“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
计算用关节角度绘制火柴人的函数(fk)、六个场景和 4 个特征。输出与第 5 节上方表格相同的数字。想换成自己的数据,就在 clip() 返回关节坐标的位置放入姿态估计工具给出的坐标,并除以身高使其为 1。
变换场景生成 600 个训练样本和 300 个测试样本,比较 2 条规则、逻辑回归和 2 个 MLP。第 5 节的实验表和第 6 节监控室的权重都直接来自这段输出。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它提出的论文、数值和库函数,务必对照原文和官方文档核实。使用有真人出镜的视频时,先确认拍摄同意和个人信息处理规定。
与正文中黄色虚线下划线相同的词典。点击节名即可跳到首次出现的位置。
比喻是理解的第一步,也可能是误解的种子。与人类知觉相比的比喻标注了强度。直接 有证据表明实际上在做同样的事 · 部分 只有部分性质相似 · 无 尚不知道有对应的东西
| 概念 | 日常比喻 | 人类知觉比喻 | 比喻失效之处 |
|---|---|---|---|
| 目标检测 | 给照片里的每个人贴上便利贴 | 部分 一眼察觉“那里有人” | 便利贴是人准确地贴上去的,而检测器会连同置信度一起给出错误的方框 |
| 姿态估计 | 在照片上叠放铁丝人偶 | 部分 只看几个点的运动就能认出走路的人的能力(光点步行) | 人能推测出被挡住的手臂,而姿态估计在被遮挡时会把点标到错误的地方或者漏掉 |
| 特征 | 嫌疑人画像中的“身高·衣着·步态”项目 | 无 | 画像项目由人挑选。直接学习坐标的模型会自己创造项目(第 5 节的 MLP) |
| 基于规则 | 保安“跑的人很可疑”的经验判断 | 无 | 保安会根据情境修正经验判断,而规则在预设条件之外的场景中会照样出错 |
| 暂不判定 | 裁判申请视频回放 | 无 | 视频回放很少使用,而扩大暂不判定的区间会让监控员的工作量重新增加 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片与数字的出处
这是写给讲师、在职培训(OJT)负责人和辅导老师的教学指南。时间只是预估,请根据实际课堂调整。
| 对象 | 初次接触视频 AI 的大学生和上班族;在公共安全、设施管理、门店运营中考虑引入 CCTV 分析的从业者 |
|---|---|
| 预备知识 | 照片是数字矩阵(4-2)、坐标与距离计算(勾股定理)、准确率的含义 |
| 学习目标 | ① 说明 CCTV 视频 → 目标检测 → 姿态估计 → 特征 → 判定的流程 ② 举例说明规则和学习各自会在哪些场景中出错 ③ 提出同时考虑误报与漏报、暂不判定和个人信息的运营方案 |
| 预计时间 | 阅读 35~45 分钟 · 动画演示 20 分钟 · Colab 实践 25 分钟(代码 1 10 分钟,代码 2 运行 1 分钟 + 解读 14 分钟) |
导入 5 分钟(第 1 节 举报)→ 第 2·3 节 从画面到火柴人 12 分钟 → 第 4 节 六个场景 8 分钟 → 第 5 节 规则阈值实验 10 分钟 → 第 6 节 监控室 10 分钟 → 练习题 5 分钟。
第 1·3 节 15 分钟 → 用本单位现场的误报成本重新解读第 5 节实验表 20 分钟 → 第 6 节 讨论如何设定暂不判定区间 15 分钟 → 第 7 节 制作法律·偏见检查表 15 分钟 → 代码 2 运行与解读 25 分钟。
入门者只看第 2·3 节、第 5 节上方的表和第 6 节。中级学习者先手动跟踪代码 1 的 features 函数,再增加一个新特征(例如:手与垃圾桶的最小距离),在代码 2 中比较成绩。
| 节 | 停下来提问 | 操作提示 |
|---|---|---|
| 2 画面就是数字 | “600 万个数字中,人在哪里?” | 在“用数字看”中把格子大小从 64 → 16 调小试试 |
| 3 找到人 | “只留下火柴人,会失去什么、保住什么?” | 保持隐私模式开启,进入下一节 |
| 4 展开到时间上 | “挥手和扔出的曲线图哪里不同?” | 交替点击两个场景,比较黄线的高度 |
| 5 规则 vs 学习 | “阈值放在哪里,才能让六个场景全部判对?” | 把滑块拖到两端,确认“不存在”这样的阈值,然后转到实验表 |
| 6 监控室 | “得分突然上升的那一帧发生了什么?” | 播放“丢在脚下”,在罐子落地的瞬间暂停 |
| 7 局限 | “AI 发出警报了,就可以直接罚款吗?” | 把暂不判定和人工最终确认联系起来 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| AI 像人一样“看”CCTV 画面 | 它接收数字网格,逐步计算。“人”“垃圾桶”这些名字标签是由检测模型贴上的 | 第 2 节“用数字看” |
| 快速挥动手臂就是乱扔 | 挥手也很快,而丢在脚下却很慢。结果(物体最后留在哪里)是更强的线索 | 第 5 节 规则 1 |
| 准确率 99.7%,在现场也是 99.7% | 这是合成数据上的结果。在真实视频中,会因遮挡、黑暗、多人等原因而下降 | 第 5 节下方说明 3 |
| 把坐标整个输入的深度学习总是更好 | 数据少时,几个精心挑选的特征可能会胜出 | 第 5 节实验表中 MLP 的两行 |
| 只保存火柴人就没有个人信息问题 | 这只是降低风险,并没有消除风险。人也可能通过步态被认出来,安装与保存方面的规定仍须遵守 | 第 3 节 隐私模式、第 7 节 |
1920 × 1080 × 3 = 6,220,800 个。火柴人是 13 × 2 = 26 个,所以 6,220,800 ÷ 26 ≈ 239,262,火柴人约为画面的 24 万分之一。
距离 = √(0.12² + 0.08²) ≈ 0.144。用时 1/15 秒,所以 0.144 × 15 ≈ 2.16 身高/秒,超过了规则 1 的阈值 2.0。
漏报:丢在脚下(手腕很慢)。误报:用力扔出但扔进了桶里(又快又松手,但不是乱扔)。
不是。这是在其他特征(尤其是桶外距离)一同输入时它所分担的部分。桶外距离已经几乎解释了乱扔,所以速度只剩下一个作用:把像挥手那样快速但正常的场景稍微往下压。不能把单个权重拿出来单独解读。
落在暂不判定区间(0.4~0.6),所以不自动判定,而是把视频交给监控人员。如果只设一个阈值,0.52 会立刻成为乱扔警报,模糊场景的误报就会原封不动地落到人身上。
在代码 1 中加入第五个特征“松开罐子那一刻手与垃圾桶的水平距离”。把六个场景中的这个值做成表格,并用两句话说明它是否有助于区分“扔进垃圾桶”和“丢在脚下”。
把代码 2 的 make_dataset 中的训练场景数改为 100 → 25 → 400,比较逻辑回归和“关节+物体+MLP”的测试准确率。用图表报告两种方法的差距如何随数据量变化。
| 入门者 | 第 4 节的曲线图和第 5 节的实验表,只要读懂“在哪个场景出错”就足够了 |
|---|---|
| 进阶 | 让学习者用 MediaPipe 从自己拍摄的短视频(经同意的表演)中提取关节坐标,输入代码 1 的 features 试试 |
| 下一篇 | 5-2 从识别到生成 —— 在同一张特征表上把箭头方向反过来,生成动作 |
你已经读完了「5-1 CCTV 乱扔垃圾」篇。研究室成员们各用一句话为你总结。