产生 10,000 张无用图像的错误

将视频转换为训练数据的明显方法是提取每一帧。感觉很彻底。这几乎是你能做的最糟糕的事情。

30 fps 视频的连续帧间隔 33 毫秒。除非相机或拍摄对象快速移动,否则第 1,001 帧与第 1,000 帧几乎相同 — 相同的姿势、相同的光照、相同的背景,只有几个像素的差异。包含 10,000 个此类帧的数据集不包含 10,000 个示例。它包含大约 300 种不同的情况,每种情况重复三十次。

这对训练的影响是具体且具有破坏性的。注释成本随图像数量而变化,因此您为相同的信息支付了三十倍的费用。训练时间也有规模。最重要的是,如果这些接近重复的结果出现在训练/验证分割的两侧,则模型实际上已经看到了验证集 - 您得到的验证分数毫无意义。

所以第一个决定不是工具设置。它是:在帧算作新示例之前,内容必须改变多少?

选择采样间隔

从场景中的运动中导出,而不是从源帧速率中导出。一些工作起点:

  • 静态相机,缓慢主体 (监视、植物生长、队列)- 每 2-10 秒 1 帧。任何更密集的东西都是多余的。
  • 静态相机,活跃主体 (在长凳上工作的人、交通)- 每 0.5–2 秒 1 帧。
  • 移动相机 (手持设备、无人机、行车记录仪)- 每秒 2-5 帧。背景不断变化,因此帧保持清晰。
  • 姿势本身就是标签的快速操作 (运动、手势识别)- 每秒 5-15 帧,但仅限包含动作的片段。

解决方法:每隔几个时间间隔提取一分钟的测试片段,并并排查看结果。如果您可以翻阅它们并且每张图像都告诉您一些新的内容,那么间隔就是正确的。如果感觉像活页簿,请将其展开。

提取前先进行算术运算。 帧 = 持续时间 × 目标速率。每秒 1 帧的 90 分钟镜头包含 5,400 张图像——这似乎是一周的注释。如果每 5 秒 1 帧,则为 1,080,这是几天的时间。这个决定值得考虑五分钟。

提取器,“时间间隔”模式直接以秒为单位获取间隙,并且帧计数会在您键入时显示 - 因此上面的数字在您提交之前是可见的,而不是之后发现。

对下游至关重要的提取设置

格式:PNG 或 JPEG

诚实的答案是,它通常并不像人们期望的那么重要,但在实际情况下确实如此值得了解。

使用 PNG 当任务对精细细节或压缩伪影敏感时 - 表面缺陷检测、OCR 相邻工作、医学或科学成像,以及以后可能测量像素值的任何内容。使用 JPEG 为 90–95% 用于一般对象检测和分类,其中模型对于轻度压缩具有鲁棒性,并且存储差异为五到十倍。

无论选择如何,都有一个一致性规则:不要混合。不同质量的一半 PNG 和一半 JPEG 的数据集为模型提供了虚假信号,并且模型非常擅长查找虚假信号。

决心

以源分辨率提取并缩小比例您的预处理管道,而不是在提取时。您无法恢复丢弃的细节,一年后您可能需要从以 224 提取的素材中进行 512 像素的裁剪。存储比重新提取便宜,特别是如果源素材存档在不方便的地方。

命名

零填充连续名称,宽度足以容纳您将制作的最大集合。 frame_00001.png,而不是 frame_1.png。将文件名排序为文本的工具将排序 frame_10 之前 frame_2,如果时间顺序在您的管道中的任何地方很重要,则该错误是微妙且难以发现的。

在路径中包含源而不是文件名,以便保留出处:

dataset/
                  raw/
                    cam01_2026-03-14/
                      frame_00001.png
                      frame_00002.png
                    cam02_2026-03-14/
                      frame_00001.png
                  splits/
                    train.txt
                    val.txt
                    test.txt

将分割保留为列出路径的文本文件 - 而不是将图像物理复制到 train/ 和 val/ 目录中 - 意味着您可以重新分割无需重新复制,您就可以准确地看到内容到了哪里。

真正重要的拆分规则

这是值得阅读两遍的部分,因为它是您可以信任的基准与您不能信任的基准之间的区别。

按源视频分割,而不是按帧分割。

如果您随机播放所有帧并随机进行 80/20 分割,则来自同一视频同一秒的帧会落在两侧。验证集几乎是训练集的副本,验证准确性衡量记忆力。以这种方式训练的模型通常会报告 97–99%,然后在真正的新素材上失败,这种失败令人费解,直到您查看分割是如何进行的。

正确的方法:分配整个视频进行训练、验证和测试。如果您只有一个长视频,请按时间将其分成连续的块 - 第一个 70% 的训练,接下来的 15% 的验证,最后 15% 的测试 - 并丢弃每个边界两侧的几秒钟,这样就不会出现几乎重复的对跨越它。

如果可能,请更进一步:保留整个录制内容 会话、相机或测试集的位置。这衡量模型是否跨条件而不是跨时间戳进行概括,这几乎总是您真正关心的问题。

在本地工作,以及为什么它在这里通常很重要

针对该领域的实用说明:研究和工业视频通常是无法随意上传的材料 - 患者录音、同意研究而不同意云服务的人员的镜头、专有生产线、出版前实验。

基于浏览器的提取将文件保留在计算机上;没有任何内容被转移,当约束是道德批准或数据处理协议而不是偏好时,这一点很重要。您可以确认这一点,而不是相信它——加载页面,断开网络连接,然后提取。如果它仍然有效,那么什么都不会发生。 验证方法 大约需要一分钟。

同样清楚这些限制。帧在下载之前保存在内存中,因此需要在时间范围块中处理长源。对于数百个文件的可重复管道,本地 FFmpeg 脚本是正确的工具 - 浏览器用于探索性工作、一次性提取以及您希望在决定间隔时查看帧的情况。

注释开始前的清单

注释是昂贵的步骤。在开始之前捕获这些内容可以节省大部分时间:

  1. 翻阅 50 个随机帧。 它们彼此之间有明显不同吗?如果不是,请扩大间隔并重新提取 - 现在,而不是在标记之后。
  2. 检查类平衡。 统一时间采样为您提供的帧与屏幕上事物的显示时间成正比,而不是与您对它们的关心程度成正比。罕见事件需要从其特定时间范围内进行有针对性的提取。
  3. 删除死帧。 淡入淡出、剪切处的黑框、镜头眩光、某人的手放在镜头上。它们是噪音,而且会耗费注释时间。
  4. 确认按视频或时间块分割,不是通过打乱的帧。
  5. 记录出处。 源文件、间隔、提取日期、格式和质量以及数据集。六个月后,您将需要复制或扩展它,并且从图像中重建“我使用了什么间隔”是令人不愉快的。

这一切都不困难。它只是在提取之前决定,而不是在注释之后发现,这就是全部区别。