3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
前言:
笔者尝试过很多3D标注软件都遇到很多问题,例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐;labelCloud没有三视图,视角难以调整标得不够精确;SUSTechPOINTS换帧麻烦、输出时存储在docker里面不方便。 CVAT是我这段时间用起来相当丝滑的一个3D目标检测的标注工具了,但是关于CVAT的3D标注教程很少,所以只能自己摸索,最后整理出了这篇教程手册供大家参考。
目录
- 1. CVAT安装教程
- 2. 3D点云标注详细流程
- 2.1 创建3D点云标注任务(Task):
- 2.2 指定任务的参数:
- 2.3 数据集上传并进入任务job:
- 2.4 标注说明:
- 2.4.1. 可使用鼠标或键盘来改变视图:
- 2.4.2. 使用长方体进行注释
- 1)==使用shape方式进行批注(适合帧间目标不连续的情况)==
- ==2)使用track方式进行批注(适合帧间目标连续的情况)==
- 2.5 导出标注结果
- 3. 标注文件格式转换代码——Datumaro 3D(json)转KITTI格式
1. CVAT安装教程
- 安装Docker
sudo apt-get update
sudo apt-get --no-install-recommends install -y apt-transport-https ca-certificates \curl \gnupg-agent \software-properties-commoncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"sudo apt-get update
sudo apt-get --no-install-recommends install -y \docker-ce docker-ce-cli containerd.io docker-compose-plugin
添加用户到docker组(以便无需sudo运行docker):
sudo groupadd docker
sudo usermod -aG docker $USER
重启系统以应用docker组的变更。
- 克隆CVAT源代码:
git clone https://github.com/opencv/cvat
cd cvat
- 安装chrome(若已安装可跳过):
cvat推荐只能用chrome浏览器
①安装包下载:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
②使用 gdebi 工具自动安装 deb 包和依赖关系:
sudo apt install gdebi
sudo gdebi google-chrome-stable_current_amd64.deb
- 运行docker容器
注意是在cvat目录下,第一次会下载需要的镜像
以后每次开机都需要在这个路径下启动cvat的docker镜像
docker compose up -d
(若docker拉取镜像时出现失败超时,可参考解决方案)
- 创建一个超级用户
docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'
注意在邮箱处可以不填,否则可能报错。
- 启动CVAT
在chrome浏览器中输入localhost:8080
2. 3D点云标注详细流程
2.1 创建3D点云标注任务(Task):
要创建任务,请在 Tasks(任务)页面上单击“+”,选择 Create new task (创建新任务)。
随后页面显示如下:
2.2 指定任务的参数:
-
在 Name 字段中,输入新任务的名称。
-
(可选)从 Projects 下拉列表中,为新任务选择一个项目。
如果不想将任务分配给任何项目,请将此字段留空(建议)。
注意:如果任务不属于项目,则以下步骤有效。
如果任务已分配给项目,则项目的标签将应用于该任务。
-
在 Constructor 选项卡上,单击 Add label (添加标签)。
标签构造函数菜单将打开:
-
在 Label name(标签名称)字段中,输入标签的名称。
-
(可选)要将标签的使用限制为特定形状工具, 从 Label shape 下拉菜单中选择形状(默认Any即可)。
-
(可选)选择标签的颜色,建议选择一些区分度比较大的颜色。
-
(可选)单击 Add an attribute 并设置其属性。(可以不设置)
-
单击 Continue 提交标签,就可以在后台保存下来,直接在label name上开始添加新标签,
单击 Cancel 终止当前标签并返回到标签列表,就会发现添加的标签已经列出来了。
2.3 数据集上传并进入任务job:
- 单击 Select files (选择文件)的虚线方框区域,或直接将文件拖拽到虚线框,以上传要注释的pcd/bin的压缩文件。(若格式bin,则cvat在标注时会直接转为pcd的格式)
压缩文件的格式如下:
注意:文件名尽量做成类似这样以数字序号命名的格式,并且是按照时间排列的顺序,这样便于后续处理。
-
单击 Submit and open 以提交配置并打开已创建的任务,或 Submit and continue 以提交配置并启动新任务。文件上传成功会有提示:
-
重新点击顶栏的Tasks即可看到新建的标注任务。
-
点击Open进入Jobs页面,再点击job#xx 就可以开始标注了
标注工作区界面如下:
2.4 标注说明:
- (注意:一定要经常保存,以免发生意外情况)
2.4.1. 可使用鼠标或键盘来改变视图:
您还可以使用键盘快捷键操作:
Action | Key |
---|---|
相机旋转 | Shift + 箭头(向上、向下、向左、向右) |
左/右 | Alt+J/ Alt+L |
上/下 | Alt+U/ Alt+O |
放大/缩小 | Alt+K/ Alt+I |
2.4.2. 使用长方体进行注释
有两个选项可用于3D标注:
• 形状:用于对象检测等任务。
• Track:使用插值来预测对象在后续帧中的位置。 将为每个对象分配一个唯一 ID,并在整个图像序列中维护。(更推荐,效率高)
1)使用shape方式进行批注(适合帧间目标不连续的情况)
要添加3D形状,请执行以下操作:
-
在对象窗格上,选择 Draw new cuboid>从下拉列表中选择标签>shape.
-
光标后面将跟着一个cuboid。 双击对应的位置,将长方体放置在3D场景中。
-
使用投影调整长方体。 单击并按住鼠标左键可编辑投影上的标签形状。
-
(可选)移动四个点中的一个以更改长方体的大小。
-
(可选)要旋转长方体,请单击中间点 ,然后向上/向下或向左/向右拖动长方体。
-
(可选)若相邻多帧均有相似大小的物体,可以选择传播(propagrate)当前帧的包围框到后续多帧以提高标注效率。
(图中笔者是从第9帧开始的,传播了10帧,故到第19帧)
2)使用track方式进行批注(适合帧间目标连续的情况)
数据集中的文件若是按照采样时间顺序来排列,则可以根据物体在帧间移动的轨迹进行插值,从而大大节省人力。
-
在对象窗格上,选择 Draw new cuboid>从下拉列表中选择标签>track.
-
为对象创建track(轨迹)(以所选container为例):
通过单击创建,然后调整3D包围框
-
但是此时会发现后面所有帧都被标注了3D框,且越往后偏离越大:
对于这种问题,CVAT中具有自动插值的功能,通过选取一些关键帧(点击标注界面右侧的label状态栏的符号空心的五角星使其变成实心的五角星,即可将该帧变为关键帧),只需要将关键帧内的包围框手动对齐,然后就会发现关键帧之间的包围框便可以自动移动到了比较合适的位置,进而只需要微调就可以了。
-
结束当前目标的轨迹
如图所示点击标注界面右侧的label状态栏的Switch Outside Property的按钮,即可终止后续帧track的操作,(注:操作了这一按钮的那一帧中对应的包围框也会消失失效)
-
如果对象只是在几个帧上不可见,然后再次出现,可以使用Merge功能合并多个单独的track合二为一,从而保证同一物体在不同帧中对应ID的一致性。
① 这里以图像标注为例,为骑行者可见的时刻创建轨迹:
② 单击Merge按钮,然后再单击第一个track的任意矩形以及第二个track的任意矩形,依此类推:
③结束时再单击Merge按钮,使更改生效。这样就统一了数据集中同一物体在不同帧中的id了。
2.5 导出标注结果
-
Save整个工程后,重新进入Task的界面,点击Export annotations:
-
输出格式调整为Datumaro 3D 1.0,它自带的kitti输出的格式会有bug(没有帧信息),save images 的开关打开以保存原始点云数据
-
如图点击顶栏跳到Requests中,然后点击刚刚导出的工程download即可
-
最终下载的是一个zip的压缩包,内容如下:
这种格式可以通过python脚本来转成KITTI数据集的格式,代码我放在最后了。 -
最后记得将整个task也做一个备份留存以供后续的二次开发
3. 标注文件格式转换代码——Datumaro 3D(json)转KITTI格式
import json
import osdef json_to_kitti(json_path, output_dir):with open(json_path, 'r') as f:data = json.load(f)labels = data['categories']['label']['labels']os.makedirs(output_dir, exist_ok=True)# 遍历每一帧for item in data['items']:item_id = item['id'] # 使用 JSON 中的 'id' 值annotations = item['annotations']# 输出 KITTI 格式文件的路径,使用 'id' 命名output_path = f"{output_dir}/{item_id}.txt"with open(output_path, 'w') as f_out:# 遍历每个标注for annotation in annotations:label_id = annotation['label_id']label_name = labels[label_id]['name']# 提取 3D 立方体信息position = annotation['position']rotation = annotation['rotation']scale = annotation['scale']# KITTI 格式字段truncated = 0 # 默认为 0,因为未提供截断信息occluded = 1 if annotation['attributes']['occluded'] else 0alpha = rotation[2] # 使用 Z 轴的旋转角作为方向角bbox_left = 0.0 # 2D 边界框位置,点云标注中通常为 0bbox_top = 0.0bbox_right = 0.0bbox_bottom = 0.0height = scale[2] # 物体高度width = scale[0] # 物体宽度length = scale[1] # 物体长度x = position[0] # 物体在相机坐标系中的 x 坐标y = position[1] # 物体在相机坐标系中的 y 坐标z = position[2] # 物体在相机坐标系中的 z 坐标rotation_y = rotation[2] # KITTI 中物体绕 Y 轴的旋转角度# 将数据写入到 KITTI 格式文件f_out.write(f"{label_name} {truncated} {occluded} {alpha} "f"{bbox_left} {bbox_top} {bbox_right} {bbox_bottom} "f"{height} {width} {length} {x} {y} {z} {rotation_y}\n")json_to_kitti('/home/zpmc/code/demo_study_project/data_convert/default.json', '/home/zpmc/code/demo_study_project/data_convert/kitti_labels')
参考链接: https://blog.csdn.net/wxtcstt/article/details/134601044
https://docs.cvat.ai/docs/
相关文章:

3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
前言: 笔者尝试过很多3D标注软件都遇到很多问题,例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐;labelCloud没有三视图,视角难以调整标得不够精确;SUSTechPOINTS换帧麻烦、输出时存储在docker里面…...

获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组
一,前言 有zabbix监控,也并不是时刻盯着数据,所以想着,每天固定某个时刻,自动发送服务器数据到指定群组,给其他人更直观的数据。 数据就可以从zabbix API获取。参考官方API文档:https://www.z…...

【spring】maven引入okhttp的日志拦截器打开增量注解进程
HttpLoggingInterceptor 是在logging-interceptor库中的:这个logging库老找不到 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor;发现这仨是独立的库 pom中三个依赖 <!-- OKHTTP3 --><...

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台
在当今高速发展的信息技术领域,特别是对于那些致力于前沿科技探索与实践的高校而言,拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台(Data Network Development Platform,简称DNDP)&am…...

Jenkins Docker Pipeline Clone Build Deploy mysqldump
本文首发在这里 先决条件 装好 Docker 的 Ubuntu钉钉机器人 Webhook curl -H Content-Type:application/json -d {"msgtype":"text","text":{"content":"hello world"}} https://oapi.dingtalk.com/robot/send?access_t…...

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道
安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性,以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题? 安全数据交换系统主要解…...

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
拖动前播放位置: 拖动后播放位置: 在Slider组件中,添加onChange方法进行监听,当视频轨道拖放结束时,触发this.seekTo()函数,其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…...

pointer-events
认识pointer-events属性 pointer-events是一个 CSS 属性,用于控制元素在鼠标事件中的表现。 一、可能的值 auto(默认值): 元素对鼠标事件的响应正常。鼠标可以与该元素进行交互,如点击、悬停等。none: 元素…...

RAG 在企业应用中落地的难点与创新分享
在2024稀土开发者大会-AI Agent与应用创新分会上,我有幸分享了我们团队在企业应用中实施RAG(检索增强生成)的难点与创新。希望通过这篇文章,与大家探讨我们在实践中遇到的问题和解决方案,为从事相关工作的朋友提供一些…...

苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群
SEO优化和搜索引擎的友好性常常是网站管理员关注的重点。苹果CMS(maccmscn)和海洋CMS都是国内常见的CMS平台,但在搜索引擎优化(SEO)和百度收录方面,苹果CMS凭借其优秀的插件生态系统,特别是泛目…...

高教社杯数模竞赛特辑论文篇-2013年B题:碎纸复原模型与算法
目录 摘要 一、问题重述 二、问题分析 三、符号说明与模型假设 3.1 符号说明 3.2 模型假设 3.3 假设说明 四、模型的建立与求解 4.1 一维碎纸复原模型 4.1.1 图像的预处理 4.1.2 碎纸特征的提取 4.1.3 基于文字特征的识别序列 4.1.4 碎纸距离的定义 4.1.5 复原 TSP 问题 4.1.6 …...

多线程面试题-28问
1、查询Java有哪些线程? public class MultiThread {public static void main(String[] args) {// 获取 Java 线程管理 MXBeanThreadMXBean threadMXBean ManagementFactory.getThreadMXBean();// 不需要获取同步的 monitor 和 synchronizer 信息,仅获…...

golang学习笔记16——golang部署与运维全攻略
推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…...

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题
———————————————————————————————————————— 本文为Unreal Fest Shanghai2024讲座内容笔记,非本人所著,原演讲人李文磊。 ————————————————————————————————————————…...

【机器学习-四-无监督学习unsupervise learning-聚类算法简介】
无监督学习unsupervise learning 聚类聚类的过程相似度度量方法聚类的方法划分式层次聚类基于密度的聚类 上一节讲的无监督学习,但是很多人可能会很疑惑,没有目标,那算法是怎么学会该怎样分类的呢?今天就简介一下其中的聚类算法。…...

IPv6路由基础
RIPng RIPng是一种较为简单的内部网关协议,是RIP在IPv6网络中的应用。RIPng主要用于规模较小的网络中,比如校园网以及结构较简单的地区性网络。由于RIPng的实现较为简单,在配置和维护管理方面也远比OSPFv3和IS-IS for IPv6容易,因…...

uniapp开发微信小程序 嵌套(uniapp开发/其他)H5,H5点击跳转微信小程序页面(通信
环境: uniapp开发微信小程序,嵌套webview,H5页面也是用的uniapp框架开发,H5页面点击商品后,需要跳转到微信小程序的详情页面 做法的原因 在微信小程序中使用web-view元素,如果要实现 H5到小程序的通信&am…...

VM虚拟机器配置网络DHCP服务
1、VM虚拟机器网络配置,centos 精简版没有配合网卡,如何配置网络 一、查看网卡信息 使用ip addr或ifconfig -a命令查看系统中现有的网卡设备名称,通常可能是eth0、ens33等类似的名称。 二、编辑网络配置文件 网络配置文件通常位于/etc/syscon…...

使用 jd.item_get API打造可读性商品介绍
在数字化时代,电子商务的蓬勃发展使得商品信息的获取变得至关重要。对于电商平台而言,如何准确、快速地获取商品信息,并以吸引人的方式呈现给消费者,成为提高销售额和用户体验的关键。本文将介绍如何利用 jd.item_get API 获取商品…...

java 通过文件下载地址读取文件内容
需求:读取文件内容,已知文件下载地址 需要引入pdfbox依赖 <dependency> <groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency>Override pub…...

打造古风炫酷个人网页:用HTML和CSS3传递笔墨韵味
需要用到的背景大家可以自己找喜欢的风格!!! 当然俺把俺用的背景放到文章最后了哦!!!!! 感谢关注和支持 长期更新哦~~~ 1. 简洁的页面布局:保持优雅和对称 在古风设计中,布局的对称性非常重要…...

vue 项目自适应 配置 px转rem 的插件postcss-pxtorem
1、安装 npm i postcss-plugin-px2rem --save -dev --force找到 postcss.config.cjs 没有的话就新建一个 module.exports {plugins: {// to edit target browsers: use "browserslist" field in package.jsonautoprefixer: {},"postcss-plugin-px2rem":…...

股票程序化交易是,第三方软件申请券商私有接口API的门槛
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...

JDK8的一些主要的新特性
JDK8(Java Development Kit 8) 是一个重要的版本,带来了许多显著的特性和改进,极大地提升了 Java 语言的功能性和开发效率。以下是 JDK 8 的一些主要新特性: 一、Lambda 表达式 1.简化匿名内部类的写法,…...

40岁的java程序员,还有出路吗?
目录 前言一、现状与挑战二、出路与机遇三、案例分析与启示四、结语 前言 40岁Java程序员的出路:挑战与机遇并存 在科技日新月异的今天,IT行业始终保持着高速的发展态势,而Java作为其中的重要一员,其地位依然稳固且充满挑战。对…...

【服务器】shell脚本之Docker创建nginx
#!/bin/bash# 定义目标目录和配置文件路径 BASE_DIR"/opt/docker/nginx"ETC_DIR"$BASE_DIR/etc" ETC_CONF_DIR"$ETC_DIR/conf.d" SSL_DIR"$ETC_CONF_DIR/ssl" LOG_DIR"$BASE_DIR/log"HTML_DIR"$BASE_DIR/html"C…...

提取蛋白质复合体结构中组装体的变换矩阵
PDB文件中,组装体变换矩阵(assembly transformation matrices)用于描述多聚体结构中各个单体之间的相对位置和取向。从蛋白质复合体 PDB 数据中提取每个组装体(assembly)的变换矩阵,通常需要解析 PDB 文件中…...

java程序员入行科目一之CRUD轻松入门教程(一)
之前在操作MySQL的时候,都是采用Navicat,或者cmd黑窗口。 无论使用什么方式和MySQL交互,大致步骤是这样的 建立连接,需要输入用户名和密码编写SQL语句,和数据库进行交互 这个连接方式不会变,但是现在需要 基…...

OpenHarmony鸿蒙开发( Beta5.0)智能油烟机开发实践
样例简介 本Demo是基于Hi3516开发板,使用开源OpenHarmony开发的应用。本应用主要功能有: 可以搜索本地指定目录的图片和视频文件,并可进行点击播放。 可以通过wifi接收来自手机的美食图片以及菜谱视频,让我们对美食可以边学边做…...

【GBase 8c V5_3.0.0 分布式数据库常用维护命令】
一、查看数据库状态/检查(gbase用户) 1.gha_ctl monitor 使用gha_ctl monitor查看节点运行情况(跟dcs的地址和端口) gha_ctl monitor -c gbase -l http://172.20.10.8:2379 -Hall |coordinator | datanode | gtm | server|dcs:必选字段。指定查看哪类集…...