尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CVAT 单点线性插值实战:用 Points 工具高效标注移动目标

CVAT 单点线性插值实战:用 Points 工具高效标注移动目标 CVAT 单点线性插值实战用 Points 工具高效标注移动目标【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat本篇技术指南基于 CVAT 官方文档 Linear interpolation with one point 展开讲解如何在 CVAT 中使用Points形状配合Track模式仅靠一个关键点keyframe就让中间帧自动线性插值从而高效标注视频中的移动目标。读完本文你不仅能掌握完整的操作步骤还能理解 CVAT 前端核心库cvat-core中插值算法的实现细节——包括关键帧定位、线性插值公式以及仅单点才触发插值这一设计约束在源码中的落地位置。为什么用单点 线性插值标注移动目标在视频标注中对连续移动的物体逐帧打点成本极高。CVAT 的Points形状支持可变数量的点并且Track模式会对关键帧之间的中间帧做位置插值。文档给出的核心思路是线性插值linear interpolation只在单个点上生效所以必须把Number of points设为 1在首帧创建一个点再向后跳到若干帧移动该点到新位置两个位置就构成了两个关键帧CVAT 会自动在两帧之间按线性规律画出中间帧的位置。这一约束并非仅仅是 UI 层面的提示在cvat-core的插值实现中有明确的体现下文会结合源码说明。操作步骤详解文档给出的完整操作流程如下对应 官方文档选择Points工具在标注页面的形状选择区域选中Points弹出 Draw new points 设置窗口。设置Number of points为 1线性插值只对单点生效因此在绘制前必须把点数固定为 1。该输入框位于绘制设置面板中在 绘制形状设置面板 源码里可以看到Number of points输入控件对POLYGON、POLYLINE、POINTS三种形状开放输入值会被向下取整并限制在最小点数以上。选择Track模式在绘制模式中选择Track而非Shape使该点成为可跨帧追踪的对象。单击画布创建点进入绘制模式后左键点击画布即可创建点此时形状自动完成单点无需闭合。前移若干帧并移动该点前进几帧后拖动点移动到新位置这一动作会创建一个新的关键帧两个关键帧之间的中间帧会被自动画出。此时它可以像任何插值 Track 一样操作用Outside隐藏对象、增删/移动关键帧等。最终得到基于Points的线性插值结果移动目标的位置随帧线性变化。源码深度解析插值是如何实现的关键帧的定位boundedKeyframesTrack类是所有轨迹型对象的基类位于 Track 基类。当请求某一帧的对象状态时get(frame)方法会先调用boundedKeyframes(frame)遍历对象内部shapes记录的所有关键帧计算出prev目标帧之前最近的关键帧next目标帧之后最近的关键帧first/last首个与末个关键帧。随后getPosition拿到左右两个关键帧的位置并把(targetFrame - leftFrame) / (rightFrame - leftFrame)作为插值偏移量传给子类实现的interpolatePosition。这个比值就是线性插值中的经典参数 t取值 0~1。单点约束的落地PointsTrack.interpolatePosition单点线性插值的具体实现在 PointsTrack核心逻辑非常直白protected interpolatePosition(leftPosition, rightPosition, offset): InterpolatedPosition { // interpolate only when one point in both left and right positions if (leftPosition.points.length 2 rightPosition.points.length 2) { return { points: leftPosition.points.map( (value, index) value (rightPosition.points[index] - value) * offset, ), rotation: leftPosition.rotation, occluded: leftPosition.occluded, outside: leftPosition.outside, zOrder: leftPosition.zOrder, }; } return { points: [...leftPosition.points], // ... }; }要点说明CVAT 中坐标以扁平数组[x, y, x, y, ...]存储因此**单点在代码中表现为points.length 2**。只有左右两个关键帧都是单点时才会对 x、y 分别执行left (right - left) * offset的线性插值若任一侧关键帧是多点则回退为直接沿用左侧点坐标不做插值这正是文档强调必须先设置Number of points为 1的根本原因rotation、occluded、outside、zOrder等属性不做插值直接取左侧关键帧的值。点数的合法性校验点数约束还有第二道防线checkNumberOfPoints 在创建PointsShape/PointsTrack时校验points.length / 2 1即抛出DataError保证Points对象至少包含 1 个点。单帧外推与 Outside 语义在 Track.getPosition 中还有一个值得注意的细节当目标帧只有单侧关键帧首帧之前或末帧之后时getPosition不做插值而是直接复制该单侧关键帧的坐标并且若该单侧位于右侧则强制outside: true——即超出轨迹范围的对象会被标记为 Outside在界面上默认不显示。这也解释了文档中you can hide it using theOutside的说明来源。关键帧的编辑语义文档提到move around keyframes等操作。从 Track.saveKeyframe 可以看到关键帧的增删是一等公民操作将某帧设为关键帧时会调用copyShape(this.get(frame))把该帧当前的插值结果物化为真实的关键帧数据shapes[frame]取消关键帧则直接从shapes中删除该帧记录位置重新交还给插值计算。因此标注流程是在关键帧 A 建点 → 跳到关键帧 B 移动点 → 中间帧自动生成若需要修正中间某帧的位置只需在该帧提升为关键帧并微调其余帧会自动重新插值。小结要素说明源码依据单点约束Number of points必须为 1 才能触发插值PointsTrack.interpolatePosition 中points.length 2判断插值公式x left (right - left) * offsetoffset为帧间线性比例Track.getPosition关键帧定位prev/next/first/last四元组Track.boundedKeyframes点数下限校验Points至少 1 个点checkNumberOfPoints单侧帧外推轨迹范围外沿用单侧关键帧坐标并标记 OutsideTrack.getPosition按照上述步骤你可以在 CVAT 中用极少的关键帧完成移动目标的长轨迹标注并借助关键帧编辑机制快速修正中间帧显著提高视频标注效率。如需进一步了解Points的其他用法如多点标注可参考同目录下的 Points 形状总览。【免费下载链接】cvatComputer Vision Annotation Tool (CVAT) is a leading platform for building high-quality visual datasets for vision AI. It offers open-source, cloud, and enterprise products, as well as labeling services, for image, video, and 3D annotation with AI-assisted labeling, quality assurance, team collaboration, analytics, and developer APIs.项目地址: https://gitcode.com/GitHub_Trending/cvat/cvat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表