简介:视频数据标注是计算机视觉模型训练的关键前置环节。这份PPT基于EasyDL目标跟踪功能,完整演示了视频数据标注的核心流程,涵盖创建模型、创建数据集、上传目标跟踪数据、在线标注、添加标签、标注目标第一/第二关键帧、标注目标消失帧等实操步骤,适合算法工程师、数据标注人员以及希望入门视频标注的AI学习者。资源为单个PPTX演示文稿,大小3.13MB,以分步截图配操作说明的形式呈现,步骤编号清晰,便于对照练习与复盘。目前已有1114人学习浏览。通过该案例,读者可快速掌握在线标注工具的使用逻辑,理解视频目标跟踪数据集构建的关键节点与常见注意事项,从而能独立完成从数据准备到标注结果交付的完整过程,为后续模型训练提供高质量数据支撑。
1. 视频数据标注不是给每帧画框:EasyDL目标跟踪案例到底在标什么
视频数据标注是计算机视觉项目里最容易被低估的环节,尤其是目标跟踪。很多人以为视频标注就是把每一帧当图片来画框,真正上手才发现,目标在动、画面在变、遮挡和出画都在发生。这份案例正是用百度EasyDL做目标跟踪视频标注的完整流程:从创建模型、创建数据集、上传视频,到在线标注第一关键帧、第二关键帧、目标消失帧,最后把标注数据交给模型训练。数据标注的核心在这里不是“画了多少框”,而是“有没有把目标在时间轴上的完整生命周期交代清楚”。适合的人群很明确:刚接触视频数据集、准备做目标跟踪训练的算法工程师,以及要给数据团队培训标注规范的从业者。接下来先拆一下这个标注框架为什么这么设计。
2. 先看懂目标跟踪的标注框架:首帧、中间帧与消失帧的数据逻辑
2.1 目标跟踪与图像检测的标注差异:从“单个框”到“一串框”
图像检测标注面对的是静止图片,操作是“框出所有目标+打标签”,一个目标对应一个框,任务在单帧内闭环。但视频目标跟踪完全不是这个逻辑,目标会在视频里移动、转向、被遮挡、甚至离开画面再重新进入。标注人员如果按照图像检测的思路去逐帧画框,产出的数据在训练阶段基本是废的——每一帧的框在视觉上是独立的,模型学不到帧与帧之间目标的位置变化关系。
EasyDL目标跟踪任务的标注方式绕开了“逐帧画框”这个蠢办法,它要求你在关键帧上画框:目标首次清晰出现时打第一关键帧,目标移动一段距离后打第二个关键帧修正轨迹,目标即将消失时打消失帧。模型训练时,先用首帧的框初始化目标,后续帧靠跟踪网络自行预测,遇到你标注过的关键帧就做位置校准。所以关键帧不是“每帧都标”的替代品,而是模型的纠偏样本——数据标注在视频场景里的核心工作,就是选好这些纠偏点。
理解这一点后,再回头看案例里的第八步“目标消失帧”就有意思了:图像检测数据集里从来不需要标注目标“消失”这个状态,因为它根本不存在时间维度。目标跟踪任务里如果没有消失帧,模型在训练时就会认为目标永远存在,推理时会把已经出画的目标硬生生续到下一位,产生最讨厌的ID Switch错误。
2.2 三个关键帧的语义与标注时机
| 关键帧类型 | 标注时机 | 数据意义 | 不标会怎样 |
|---|---|---|---|
| 第一关键帧 | 目标首次清晰出现的帧 | 轨迹起点,跟踪模型初始化 | 模型不知道目标从哪一帧开始存在 |
| 第二关键帧 | 目标移动一段距离后 | 轨迹中段修正,显式标记目标仍在运动中 | 轨迹只依赖插值,转弯或变速场景会跟丢 |
| 目标消失帧 | 目标即将出画或被完全遮挡前 | 轨迹终点,告诉模型目标生命周期结束 | 模型会错误延续轨迹,导致ID串接 |
案例里“第一关键帧”和“第二关键帧”容易误导新人,以为只能标两帧。实际上这两个名词代表的是轨迹锚点的起止关系,中间帧可以根据目标运动复杂度随意增补。我一般这样落地:目标低速直线移动,每隔30到50帧标一个修正框就够;目标在转弯、变速或者频繁被遮挡,关键帧密度提到每隔3到10帧一个。关键帧密度不是均匀分布的,要跟着轨迹复杂度走,这对很多新入行的标注同学来说是反直觉的。
2.3 标注在EasyDL闭环里的位置:从模型到部署的完整链路
EasyDL目标跟踪的完整流程是:创建目标跟踪模型→创建数据集→上传视频→在线标注→模型训练→部署。标注处在中游,但它决定了整个链路的天花板。平台训练的目标跟踪模型效果不好时,算法工程师第一反应是调结构、调参数,但绝大多数情况下真正的瓶颈在标注质量——框贴不贴目标、标签统不统一、消失帧标没标,这些数据层面的问题在后端训练时几乎无法被参数弥补。
案例里把“创建模型”放在第一步,这个顺序是有讲究的。EasyDL按任务类型组织资源,目标跟踪模型对应的是视频数据集和轨迹标注界面;如果先创建了图像分类模型,后面数据集的类型、标注工具栏的交互都和视频目标跟踪完全不同。很多人在这一步踩坑,把模型建成了图像任务,上传视频时才发现数据集类型不匹配,只能回去重建。数据标注这个活儿,前期流程规划错了,后面全是无用功。
3. 从创建模型到上传视频:目标跟踪数据集初始化的完整步骤
3.1 创建模型:任务类型选错是第一个隐蔽坑
进入EasyDL后选择视频,点击目标跟踪卡片里的【立即使用】,进入目标跟踪模型训练页。这一步操作本身很简单,但任务类型的选择直接决定后面所有流程。目标跟踪模型对应的是“视频+轨迹框”标注,而视频分类模型对应的是“给整段视频打一个标签”,两者的数据集结构、标注页面布局完全不同。
我见过最典型的翻车是:创建模型时没注意任务类型,随手选了视频分类,数据集也建了、视频也传了,到标注环节发现只能在视频上打分类标签,根本画不了框。此时数据已经导入平台,重来一遍的代价是重新创建模型和数据集,视频数据本身没变,但所有流程都要走第二次。所以创建模型后先确认训练页标题里明确写着“目标跟踪”,再往下一步。
3.2 创建数据集:类型与命名规范
在导航栏的“数据总览”页面点击【创建数据集】。这里有一个容易忽略的细节:数据集要挂在你刚创建的目标跟踪模型项目下,类型选择与视频目标跟踪匹配的数据集类型。平台支持创建多个数据集,不要把不同项目的视频混在一个数据集里,否则后续按类目做训练集、验证集划分时会非常痛苦。
数据集的命名我建议带项目名和版本号,例如“traffic_cam_v1.2”或者“goods_detect_202401”。这个习惯在实验迭代时价值很大:每次训练用的哪一批数据、哪个版本,看数据集名就能对上;如果统一叫“新建数据集”,等到模型效果变差想回溯数据版本时,只能一个一个点开看,完全是浪费命。数据标注项目里,命名规范就是最便宜的管理工具。
3.3 上传前本地整理:用脚本完成格式预检与文件规范
上传视频数据看起来只是拖文件进浏览器,实际上翻车概率不小。常见做法是先把视频文件在本地整理一遍,再批量上传。推荐一个针对视频数据标注场景的整理脚本:
# 创建按场景划分的目录结构 mkdir -p ./video_dataset/camera01 ./video_dataset/camera02 # 预检非视频文件,避免把图片或压缩包混进数据集 for f in ./*/*; do if ! file "$f" | grep -qi "video\|Media"; then echo "[warn] 非视频文件: $f" fi done # 统计每个目录的视频文件数量和总大小,评估上传批次 find ./video_dataset -type f \( -name "*.mp4" -o -name "*.mov" \) -exec ls -lh {} \; | awk '{print $5, $9}' # 统一重命名格式:采集日期_场景编号_序号 for f in ./video_dataset/camera01/*.mp4; do base=$(basename "$f") mv "$f" "./video_dataset/camera01/$(date +%Y%m%d)_camera01_${base}" done逻辑说明:第一节先用mkdir把视频按采集场景分好目录,目标跟踪数据集最好按场景分文件,因为不同场景的光线、遮挡情况差异大,后续训练时方便按场景做数据均衡。第二节用file命令做格式预检,它虽然不能识别编码细节,但能快速揪出混进来的非视频文件。第三节用find配合awk统计文件数量和大小,目的是在上传之前就预估总量,避免一次性塞几千个文件时上传中断。第四节把文件名改成“日期_场景_序号”的格式,平台侧搜索和管理会方便很多,尤其是标注到后期需要筛某个场景的视频时,文件名就是最直接的索引。
参数说明:grep -qi的-q表示静默匹配,只返回退出码不输出匹配行,配合if做条件判断用;date +%Y%m%d生成的是纯数字日期字符串;上面脚本里的重命名用了${base}保留原文件名,实际生产中我一般会再用sed把原文件名里的空格替换成下划线,因为平台上传后如果文件名带空格,在下载导出时会偶发路径解析问题。视频文件本身建议统一转成H.264编码的MP4,这是在线标注工具兼容性最稳妥的组合。
上传完成后回到“数据总览”页面,能看到数据集里每个视频文件的上传状态。如果某个视频上传失败或状态异常,不要反复重传,先下载到本地用播放器打开确认是不是文件损坏,很多“上传失败”其实是原始视频文件本身已经损坏,重传十次也一样失败。
4. 关键帧标注实操:第一框、跟随框与消失帧的标注节奏
4.1 进入在线标注页面:先完整看一遍视频再动手
数据集上传完成后,在数据总览页面找到对应数据,点击“查看与标注”进入在线标注任务。打开标注页面后不要急着画框,先把视频完整播放一遍,心里过一遍这几个问题:这个视频里出现了几个目标?目标分别是什么时候出现、什么时候消失?画面里有没有遮挡区域?目标之间会不会交叉?
这套预看动作用不了几分钟,但能避免绝大多数漏标。目标跟踪标注最怕的就是标着标着突然发现画面后段又出现了一个新目标,回头去补第一关键帧,中间还要把已经标好的关键帧位置重新捋一遍。数据标注的返工成本远高于一次标对,多花三分钟预看,能省下三十分钟返工时间。
4.2 添加标签:先建标准标签词典,再开始标注
标注页面右上角点击【添加标签】,输入标签名称,标签添加成功后会在右侧标签栏显示,同时支持修改标签名称和开启“连续标注”功能。
标签管理是数据标注里最考验细节的环节。一个视频里可能有多个目标属于同一类别,也可能同时出现多个类别的目标,标签名称就是模型最终的输出类别名。如果标注团队里有人用“car”,有人用“汽车”,有人用“vehicle”,模型训练后会被迫把同一个类别拆成三个类别输出,预测结果的可用性直接下降。正确的做法是在开始标注之前,先把整个项目的标签词典建好,后续标注过程中禁止个人新建标签,一切新增走审核。EasyDL虽然提供了修改标签名称的功能,但改名后已经标注的所有目标框都要重新确认标签绑定,比一开始定好规范麻烦得多。
“连续标注”是一个值得讲清楚的功能:开启后标完一个目标的关键帧,系统会自动进入下一个目标的标注框创建。它适合单目标、运动规律的视频;如果画面里有多个目标且频繁交叉遮挡,连续标注容易串框,这种情况下我一般会关掉它,一个一个目标手动标。
4.3 第一与第二关键帧:框选、拖拽与关键帧密度
第一关键帧是整个目标轨迹的初始化样本。操作方式是在视频画面中框选出目标,并选择对应标签。画框的准则只有一条:紧贴目标边缘。图省事把框放大一圈,把背景路面、建筑边缘、旁边的人包进去,跟踪模型会把背景纹理当成目标特征学进去,后续帧的跟踪框会被背景带着走——这就是目标跟踪里最经典的跟丢原因之一。
第二关键帧是第一帧的延续:播放视频,待目标移动一段距离后暂停,此时不要新建框,而是选中已有标注框,将它拖动到目标当前位置,再根据目标在画面中的大小变化调整框的尺寸。如果目标转身、姿态变化导致外形比例变了,也需要同步调整标注框的宽高比。
关键帧的间隔节奏没有绝对标准,但可以参考下面这张表:
| 目标运动状态 | 关键帧间隔建议 | 说明 |
|---|---|---|
| 静止不动 | 只标首帧 | 目标动起来之前不需要额外关键帧 |
| 低速直线运动 | 每30-50帧标一个 | 轨迹接近直线,帧间插值就能对齐 |
| 中速且方向变化多 | 每10-20帧标一个 | 转弯处要加密,直线段可以放松 |
| 快速运动或频繁遮挡 | 每3-5帧标一个 | 轨迹变化剧烈,锚点太少会直接跟丢 |
这张表的价值在于纠正一个常见的标注误区:关键帧不是“每隔固定帧数标一个”,而是要跟着目标的运动复杂度走。目标静止时狂标关键帧,等于给模型喂重复样本,浪费标注产能;目标快速转弯时关键帧间隔太长,插值出来的轨迹会切弯,训练出来的跟踪器在弯道容易跳框。
4.4 目标消失帧:当目标即将消失时终结轨迹
目标即将消失在画面中,或者将被其他物体完全遮挡时,需要在目标还可见的最后一帧标注目标消失帧。操作方法是:播放视频到目标即将出画那一帧,暂停,将标注框放在目标当前位置,即便目标只剩半边身体,也要把框贴住剩余可见部分,然后标记该目标的轨迹结束。
这个步骤在目标跟踪数据标注里权重极高。很多视频里目标并不是简单地从画面边缘离开,而是被遮挡物盖住。如果只标了遮挡前的关键帧,没有标消失帧,模型的轨迹逻辑会默认目标继续存在,然后在下几帧把遮挡物误认成目标,或者把画面里另一个相似目标续接到原ID上。ID Switch一旦发生,这条数据样本基本作废。
真实项目里还有一类“遮挡恢复帧”经常被忽视:目标被遮挡后重新出现在画面中,建议在它重新完整可见时,打一个新的关键帧并绑定原目标ID。这等于告诉模型“同一个目标在遮挡后又回来了”,很多跟踪算法在目标重新出现时容易新建轨迹而不是延续原轨迹,这个标注动作可以直接压缩这类错误的发生率。案例里没有单独列这一项,但做多了之后你就会发现,填上这个坑,训练效果会明显变稳。
5. 目标跟踪标注避坑:五个常见翻车现场与排查思路
5.1 上传后视频黑屏无法打开
现象:数据集上传显示成功,点击“查看与标注”后视频画面黑屏或者一直转圈,连一帧都出不来。
原因:视频编码格式不兼容。手机拍摄的很多视频是HEVC(H.265)编码,部分运动相机和无人机也会输出为H.265,而在线标注工具对H.264的支持最稳定,遇到H.265视频时播放链路已经断了,标注页面自然只留下黑屏和加载动画。
解决:在上传前本地转码,统一转成H.264编码的MP4格式:
ffmpeg -i input.mov -vcodec h264 -acodec aac -movflags +faststart output.mp4逻辑说明:-vcodec h264强制视频编码为H.264,-movflags +faststart是关键参数,它把moov元数据块移动到文件头部。在线播放时,播放器需要先读到moov才能开始加载画面,如果没有faststart,标注工具会等整个文件下载得差不多才出画面,视频一大就在黑屏和转圈里来回卡。参数说明:-acodec aac把音频也做一次编码,目标跟踪标注用不到音频,但保持音轨转码可以避免封装器兼容性问题;如果你测试过画面正常但进度条拖动后会卡顿,也优先检查是不是少了faststart。
5.2 标了二十分钟,退出后全部白标
现象:一个视频标到后段,中途切出去回了个消息,再回来发现之前标注的所有关键帧全部消失了。
原因:在线标注是分段保存机制,标注数据先缓存在浏览器端,手动保存后才写入到平台数据存储。中间切走页面或者网络断了一下,缓存里的数据没来得及提交,就全部丢了。
解决:每标完一个目标或者每处理完一个视频片段,立即手动保存一次。保存操作通常只需要几下点击,成本极低。数据标注的血泪经验就是“保存永远不嫌多”。平台是否支持自动保存不在本案例的默认示例里,实操中我会强制团队把“完成一个目标就点一次保存”写进标注规范,并且每个标注批次里安排一个人抽查保存习惯。注意,这里说的保存是标注页面的保存按钮,不是数据集的上传状态,这两者在很多新人那一里是混的。
5.3 首帧框选太松,训练后跟踪框一路漂移
现象:第一关键帧框选得比较宽,把目标周围的背景都包进去了,训练完成后模型在验证视频上跟踪一两秒就漂到旁边的人行道或树干上。
原因:跟踪模型初始化用的就是首帧框内的特征,框里包含大量背景纹理时,模型会把背景高频特征也学习成目标的关联特征。目标稍微移动一下,背景特征从框里漏出去,模型就丢失了主要参照,开始跟着残留的背景特征走,表现就是框越漂越远。
解决:第一关键帧的框必须紧贴目标外轮廓,宁可稍微收紧一点,不要多包背景。收紧的标准是:框的边缘能看到目标边缘的反差,框外部紧挨着的像素都是背景,而不是目标的一部分被切掉,也不是背景被大块包进来。复核时可以把关键帧的截图放大到50%以上逐目标过一遍,这一步很花时间,但确实能压住跟踪漂移的返工率。
5.4 忘记标消失帧,模型给目标续了一段错误轨迹
现象:验证视频里目标已经出画,模型输出的跟踪框还在画面边缘处卡了几帧,然后跳回画面里绑到了另一个行人类目标身上,输出的轨迹明显是错误拼接线。
原因:标注阶段没给该目标打目标消失帧。模型在训练时看到的正样本序列里,这个目标的轨迹一直没有结束,目标出画后模型尝试用特征匹配延续轨迹,匹配不到原目标时就会找相似目标来补位,这个补位过程就是ID Switch。
解决:标注规范里明确“目标即将完全离开画面或完全被遮挡前的最后一帧,必须标注消失帧”,并且在质检回放时逐条查看轨迹终点是否落在目标还可见的位置。目标被建筑物挡住时也一样处理,消失帧打在遮挡即将完成前的最后一帧。
5.5 标签名不统一,一个类别在训练后变成两个类别
现象:训练完的模型在预测结果里把同一类物体输出成了两个类别名,置信度还不低,比如“person”和“人体”同时出现。
原因:标注阶段多人协作,有人用“person”,有人用“人体”,系统把它们当成两个独立的标签类别了。这类问题在数据量大时非常隐蔽,因为每一帧的标注看起来都合理,只有统计标签分布时才能发现一个类别被拆成了两个。
解决:开标前在标签栏把完整标签词典建好,字典之外的标签一律不允许新建。标注过程中如果确实需要加类别,走统一流程:先由项目负责人确认,再新增标签并同步给所有人。EasyDL支持修改标签名称,但改完已有标注的绑定关系要逐个复核,比一开始定好规范麻烦得多,所以这类问题要以预防为主。
6. 标注完不是终点:用一次小训练验证标注质量的技巧
6.1 回放检查的固定动作
全部视频标注完成后,不要直接点训练。先在数据总览里重新打开几个标得最多的视频,按目标逐条回放,重点看三处:第一关键帧的框有没有紧贴目标边缘;中间关键帧是不是沿着目标运动轨迹平滑推进,有没有突然的框位置跳变;消失帧是不是打在目标可见的最后一帧。回放检查建议同步做标注统计,看每个标签的框数量分布是否合理,如果一个类别的框数量是另一个的几十倍,先怀疑是不是标签拆分或者漏标,而不是急着训练。
6.2 拿一批代表视频先跑一次短训练
数据准备好后,不要用全部数据直接训练。先按场景各挑几个视频组成小验证集,跑一轮短迭代训练,然后把模型放到验证集上去看跟踪效果。重点观察:高速运动的场景是不是频繁跟丢,目标交叉时有没有ID互换,遮挡恢复后框能不能正确绑定回原ID。如果某个场景持续出问题,不要先调参数,回到标注数据里对齐时间轴,去找那一帧的关键帧框是否贴准了目标。这是效率最高的问题定位路径——很多跟踪失败案例翻到最后,都是标注阶段某个关键帧框歪了或者消失帧漏标了,模型本身并没有问题。
从那以后我每次交付视频数据标注项目,都强制自己走一遍“回放检查+一次短训练”,一开始是为了保险,后来发现它能提前干掉至少八成返工风险。模型训练参数可以慢慢调,数据里的坑如果不提前排除,后面每一次实验都会被同一块石头绊倒。希望帮到你。
本文还有配套的精品资源,点击获取