ToB企服应用市场:ToB评测及商务社交产业平台

标题: 3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码) [打印本页]

作者: 雁过留声    时间: 2024-10-9 22:15
标题: 3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
媒介:
笔者实行过许多3D标注软件都遇到许多问题,例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐;labelCloud没有三视图,视角难以调整标得不敷精确;SUSTechPOINTS换帧麻烦、输出时存储在docker里面不方便。 CVAT是我这段时间用起来相称丝滑的一个3D目标检测的标注工具了,但是关于CVAT的3D标注教程很少,所以只能自己摸索,最后整理出了这篇教程手册供大家参考。

  
1. CVAT安装教程

  1. sudo apt-get update
  2. sudo apt-get --no-install-recommends install -y apt-transport-https ca-certificates \
  3.   curl \
  4.   gnupg-agent \
  5.   software-properties-common
  6. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  7. sudo add-apt-repository \
  8.   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  9.   $(lsb_release -cs) \
  10.   stable"
  11. sudo apt-get update
  12. sudo apt-get --no-install-recommends install -y \
  13.   docker-ce docker-ce-cli containerd.io docker-compose-plugin
复制代码
添加用户到docker组(以便无需sudo运行docker):
  1. sudo groupadd docker
  2. sudo usermod -aG docker $USER
复制代码
重启体系以应用docker组的变更。
  1. git clone https://github.com/opencv/cvat
  2. cd cvat
复制代码
cvat保举只能用chrome浏览器
①安装包下载:
  1. wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
复制代码
②利用 gdebi 工具自动安装 deb 包和依赖关系:
  1. sudo apt install gdebi
  2. sudo gdebi google-chrome-stable_current_amd64.deb
复制代码
  1. docker compose up -d
复制代码
(若docker拉取镜像时出现失败超时,可参考办理方案)
  1. docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'
复制代码
留意在邮箱处可以不填,否则可能报错。
2. 3D点云标注详细流程

2.1 创建3D点云标注使命(Task):

要创建使命,请在 Tasks(使命)页面上单击“+”,选择 Create new task (创建新使命)。

随后页面显示如下:

2.2 指定使命的参数:

留意:如果使命不属于项目,则以下步骤有效。
如果使命已分配给项目,则项目标标签将应用于该使命。
单击 Cancel 终止当前标签并返回到标签列表,就会发现添加的标签已经列出来了。

2.3 数据集上传并进入使命job:

留意:文件名只管做成类似这样以数字序号命名的格式,并且是按照时间排列的次序,这样便于后续处置惩罚。
标注工作区界面如下:

2.4 标注说明:

2.4.1. 可利用鼠标或键盘来改变视图:


您还可以利用键盘快捷键利用:
ActionKey相机旋转Shift + 箭头(向上、向下、向左、向右)左/右Alt+J/ Alt+L上/下Alt+U/ Alt+O放大/缩小Alt+K/ Alt+I 2.4.2. 利用长方体进行表明

有两个选项可用于3D标注:
• 形状:用于对象检测等使命。
• Track:利用插值来预测对象在后续帧中的位置。 将为每个对象分配一个唯一 ID,并在整个图像序列中维护。(更保举,效率高)
1)利用shape方式进行讲明(适合帧间目标不一连的情况)

要添加3D形状,请实行以下利用:
(图中笔者是从第9帧开始的,传播了10帧,故到第19帧)
2)利用track方式进行讲明(适合帧间目标一连的情况)

数据集中的文件若是按照采样时间次序来排列,则可以根据物体在帧间移动的轨迹进行插值,从而大大节流人力。
对于这种问题,CVAT中具有自动插值的功能,通过选取一些关键帧(点击标注界面右侧的label状态栏的符号空心的五角星使其变成实心的五角星,即可将该帧变为关键帧),只需要将关键帧内的困绕框手动对齐,然后就会发现关键帧之间的困绕框便可以自动移动到了比较合适的位置,进而只需要微调就可以了。


① 这里以图像标注为例,为骑行者可见的时刻创建轨迹:

② 单击Merge按钮,然后再单击第一个track的任意矩形以及第二个track的任意矩形,依此类推:

③结束时再单击Merge按钮,使更改生效。这样就同一了数据集中同一物体在差异帧中的id了。

2.5 导出标注结果


3. 标注文件格式转换代码——Datumaro 3D(json)转KITTI格式

  1. import json
  2. import os
  3. def json_to_kitti(json_path, output_dir):
  4.     with open(json_path, 'r') as f:
  5.         data = json.load(f)
  6.     labels = data['categories']['label']['labels']
  7.     os.makedirs(output_dir, exist_ok=True)
  8.     # 遍历每一帧
  9.     for item in data['items']:
  10.         item_id = item['id']  # 使用 JSON 中的 'id' 值
  11.         annotations = item['annotations']
  12.         # 输出 KITTI 格式文件的路径,使用 'id' 命名
  13.         output_path = f"{output_dir}/{item_id}.txt"
  14.         
  15.         with open(output_path, 'w') as f_out:
  16.             # 遍历每个标注
  17.             for annotation in annotations:
  18.                 label_id = annotation['label_id']
  19.                 label_name = labels[label_id]['name']
  20.                
  21.                 # 提取 3D 立方体信息
  22.                 position = annotation['position']
  23.                 rotation = annotation['rotation']
  24.                 scale = annotation['scale']
  25.                
  26.                 # KITTI 格式字段
  27.                 truncated = 0  # 默认为 0,因为未提供截断信息
  28.                 occluded = 1 if annotation['attributes']['occluded'] else 0
  29.                 alpha = rotation[2]  # 使用 Z 轴的旋转角作为方向角
  30.                 bbox_left = 0.0  # 2D 边界框位置,点云标注中通常为 0
  31.                 bbox_top = 0.0
  32.                 bbox_right = 0.0
  33.                 bbox_bottom = 0.0
  34.                 height = scale[2]  # 物体高度
  35.                 width = scale[0]   # 物体宽度
  36.                 length = scale[1]  # 物体长度
  37.                 x = position[0]    # 物体在相机坐标系中的 x 坐标
  38.                 y = position[1]    # 物体在相机坐标系中的 y 坐标
  39.                 z = position[2]    # 物体在相机坐标系中的 z 坐标
  40.                 rotation_y = rotation[2]  # KITTI 中物体绕 Y 轴的旋转角度
  41.                 # 将数据写入到 KITTI 格式文件
  42.                 f_out.write(f"{label_name} {truncated} {occluded} {alpha} "
  43.                             f"{bbox_left} {bbox_top} {bbox_right} {bbox_bottom} "
  44.                             f"{height} {width} {length} {x} {y} {z} {rotation_y}\n")
  45. json_to_kitti('/home/zpmc/code/demo_study_project/data_convert/default.json',
  46.               '/home/zpmc/code/demo_study_project/data_convert/kitti_labels')
复制代码
  参考链接: https://blog.csdn.net/wxtcstt/article/details/134601044
https://docs.cvat.ai/docs/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4