ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CVAT Points 点集标注实战:68 点自动收尾与单点线性插值背后的源码

CVAT Points 点集标注实战:68 点自动收尾与单点线性插值背后的源码 CVAT Points 点集标注实战68 点自动收尾与单点线性插值背后的源码【免费下载链接】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在 CVATComputer Vision Annotation Tool中Points 图形模式是人脸关键点、姿态 landmarks 等标注任务的标准工具。本文从一个常见疑问出发——为什么多点点集轨迹不做线性插值——带你走通Number of points设置、绘制、编辑到轨迹插值的全流程并用 cvat-canvas 与 cvat-core 的真实代码解释每个行为。一个反直觉的行为在 CVAT 里给视频画矩形轨迹两个关键帧之间的中间帧会自动填充插值后的框。但换成一个 5 个点的点集轨迹同样操作中间帧却不移动看起来像被定格在左关键帧。如果你标注过人脸关键点大概率会撞上这个现象。它的原因藏在数据模型的一条if里本文最后把它翻出来。先跑通最短路径。30 秒上手单点轨迹的最短路径在标注页左侧控制面板选中Points工具弹出 Draw new points 窗口把Number of points填为1点击Track按钮进入绘制模式在画布上左键落点——形状会立即自动完成官方文档原话shape will be automatically completed即落一个点即成稿往后跳几帧把点拖到新位置该帧成为新关键帧中间帧由 CVAT 自动线性填充。这个单点轨迹之后可以按普通插值轨迹管理用Outside隐藏中间帧、拖拽关键帧换帧等完整步骤见官方文档 liner-interpolation-with-one-point.md。操作全解如何设置 68 个点并让绘制自动完成Draw new points 窗口里POLYGON、POLYLINE、POINTS共用同一个Number of points输入框。填了值绘制在达到该数量时自动停笔——人脸 68 点标注就是点 68 下自动完稿留空则点数不限结束要自己动手。输入框带min{minimumPoints}下限Points 的下限是 1其变更处理逻辑在 draw-shape-popover.tsxInputNumber onChange{(value) { if (typeof value undefined || value null) { onChangePoints(undefined); // 留空点数不限 } else { // 低于下限被抬到 minimumPoints再取整 onChangePoints(Math.floor(clamp(value, minimumPoints, Number.MAX_SAFE_INTEGER))); } }} /也就是说填 0 会被抬到 1小数会被取整超大值在Number.MAX_SAFE_INTEGER截断。输入框下方是Shape与Track两个按钮悬停提示 Press N to draw again——结束一次绘制后按 N 可再次进入同参数绘制批量标注时很省。绘制中自动分组、结束与删除单个点点击Shape进入绘制后最核心的行为是自动分组从开始到结束之间落下的每个点都归属同一个对象。一次点击序列产出的是一个可整体拖拽的点集对象而不是 N 个互不相干的点。结束方式有两种再按一次N或点顶部面板的Done。点错了怎么办删除单个点有两条路按住Ctrl单击该点或右键点选Delete point。绘制过程中右键还有另一个用途——撤销最近落下的那个点源码层解释见下文。目标很小时绘制中可以直接滚轮缩放按住鼠标中键拖动平移画布高分辨率图上落点不会被糊掉。向已有图形追加点与绘制后编辑按住Shift单击点集对象会打开 points shape 编辑器你可以在已画好的图形上追加新点——点集不是只能删也能长。对象画完后可以整体拖拽绘制结束后也能单独拖动某个控制点微调位置。能精确点到某一个点的依据在命中检测点集没有面points-shape.ts 的静态distance方法返回鼠标位置到图形内每一个点的最小欧氏距离。命中永远按点计算与删点、微调操作按点进行互相呼应。它为什么这样工作按 UI 入口 → 画布绘制 → 数据模型的顺序看三条链路。画布层numberOfPoints 是自动完稿计数器点绘制的入口是 drawHandler.ts 的drawPoints()它创建一个完全透明opacity: 0的隐形多边形做载体把实际工作交给drawPolyshape()。那里有一行关键代码L903let size this.drawData.shapeType cuboid ? 4 : this.drawData.numberOfPoints;递减逻辑紧随其后let size this.drawData.shapeType cuboid ? 4 : this.drawData.numberOfPoints; // ... const sizeDecrement (): void { if (--size 0) { // 计数归零自动完成本次绘制 setTimeout((): void this.drawInstance.draw(done)); } };每落一个点size减 1归零就触发draw(done)收笔。注意留空则手动结束也有了代码层面的答案Number of points为空时size是undefined--size得到NaNNaN 0永远为假自动完成条件永不成立。右键的undopoint事件执行反向的sizeL947所以撤销最后一个点时计数也会回补绘制不会被提前掐断。绘制中渲染的控制点半径按controlPointsSize / geometry.scale计算如 L1429缩放越大半径越小控制点在屏幕上保持视觉大小稳定——这正是绘制中可放心缩放平移的交互基础。数据模型点数下限校验对象成形后进入数据模型。points-shape.ts 中PointsShape继承自PolyShape构造函数把shapeType置为POINTS并调用校验函数该函数在 object-utils.ts 里对每种图形类型分别把关} else if (shapeType ShapeType.POINTS) { if (points.length / 2 1) { // points 是 [x1, y1, x2, y2, ...] 扁平数组至少 1 个点2 个数字 throw new DataError(Points must have at least 1 points, but got ${points.length / 2}); } }点数不足下限直接抛DataError非法对象构造不出来——UI 输入框下限是 1数据层校验也是 1两道闸口径相同。多点点集轨迹为何不做线性插值选Track而非Shape产出的是 points-track.ts 的PointsTrack。构造函数对轨迹中每一帧图形都执行checkNumberOfPointsL26-L28保证各关键帧点数一致。插值策略在interpolatePositionL31-L52protected interpolatePosition(leftPosition, rightPosition, offset) { // 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((v, i) v (rightPosition.points[i] - v) * offset), // ... }; } return { points: [...leftPosition.points] /* 多点多帧复制左关键帧不插值 */ }; }points是坐标扁平数组length 2恰好表示只有 1 个点。左右关键帧都只有一个点时坐标按offset逐维线性插值多点点集则落到下面一行原样复制左关键帧。为什么只敢对单点插值第 i 个点 ↔ 第 i 个点的对应关系在单点情形下唯一确定多点点集的关键帧之间点数可能不同、点的顺序也可能不同逐坐标猜测对应关系会画出错误的轨迹实现因此选择了最保守的策略宁可不插值。官方文档 Linear interpolation works only with one point 说的就是这件事想要视频里自动填充Number of points填 1 并选Track多关键点视频没有这个自动填充可用。踩坑与进阶留空别指望自动停笔留空意味着点数不限必须按N或点Done结束。批量 68 点任务一定要填数字否则每一帧都要手动收笔。绘制中的右键是撤销绘制过程中右键取消的是最后一个落下的点和已有对象右键菜单里的Delete point不是一回事。多点点集轨迹中间帧不动这是设计行为而非 bug。需要逐帧精度的多关键点视频只能多打关键帧再手动微调中间帧或用 AI 预标注先生成点再修正。单点是插值唯一入口单点 Track是中间帧能自动画出来的唯一点数组合。常见错误快答Q填了 68为什么点完 68 下不停A确认数值填进了Number of points输入框、之后才点的Shape/Track。留空就是不限点数只能手动结束另外输入值低于 1 会被自动抬到 1。Q点集能不能是 0 个点A不能。checkNumberOfPoints对 0 个点抛DataErrorobject-utils.ts L25-L28输入框下限同样是 1。Q多点点集轨迹的中间帧为什么不跟着动APointsTrack.interpolatePosition只在左右关键帧都为单点时线性插值否则复制左关键帧源码见 points-track.ts L31-L52。Q删除单个点 / 向已有图形加点A删Ctrl 单击该点或右键 →Delete point加Shift 单击图形打开编辑器在其中追加新点。相关文件文档points-in-shape-mode.mdliner-interpolation-with-one-point.md数据模型points-shape.tspoints-track.tsobject-utils.tsUI 与画布draw-shape-popover.tsxdrawHandler.ts【免费下载链接】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),仅供参考
返回列表