3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)

128,827次阅读
没有评论

共计 4891 个字符,预计需要花费 13 分钟才能阅读完成。

前言:
笔者尝试过很多 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 安装教程

  1. 安装 Docker
sudo apt-get update
sudo apt-get --no-install-recommends install -y apt-transport-https ca-certificates 
  curl 
  gnupg-agent 
  software-properties-common
 
curl -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 组的变更。

  1. 克隆 CVAT 源代码:
git clone https://github.com/opencv/cvat
cd cvat
  1. 安装 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
  1. 运行 docker 容器
    注意是在 cvat 目录下,第一次会下载需要的镜像
    以后每次开机都需要在这个路径下启动 cvat 的 docker 镜像
docker compose up -d

(若 docker 拉取镜像时出现失败超时,可参考解决方案)

  1. 创建一个超级用户
docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'

注意在邮箱处可以不填,否则可能报错。

  1. 启动 CVAT
    在 chrome 浏览器中输入 localhost:8080

2. 3D 点云标注详细流程

2.1 创建 3D 点云标注任务(Task):

要创建任务,请在 Tasks(任务)页面上单击“+”,选择 Create new task(创建新任务)。
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
随后页面显示如下:
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

2.2 指定任务的参数:

  1. 在 Name 字段中,输入新任务的名称。
    在这里插入图片描述

  2. (可选)从 Projects 下拉列表中,为新任务选择一个项目。
    如果不想将任务分配给任何项目,请将此字段留空(建议)。
    在这里插入图片描述

注意:如果任务不属于项目,则以下步骤有效。
如果任务已分配给项目,则项目的标签将应用于该任务。

  1. 在 Constructor 选项卡上,单击 Add label(添加标签)。
    标签构造函数菜单将打开:
    在这里插入图片描述

  2. 在 Label name(标签名称)字段中,输入标签的名称。

  3. (可选)要将标签的使用限制为特定形状工具,从 Label shape 下拉菜单中选择形状(默认 Any 即可)。

  4. (可选)选择标签的颜色,建议选择一些区分度比较大的颜色。
    在这里插入图片描述

  5. (可选)单击 Add an attribute 并设置其属性。(可以不设置)

  6. 单击 Continue 提交标签,就可以在后台保存下来,直接在 label name 上开始添加新标签,
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    在这里插入图片描述

单击 Cancel 终止当前标签并返回到标签列表,就会发现添加的标签已经列出来了。
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

2.3 数据集上传并进入任务 job:

  1. 单击 Select files(选择文件)的虚线方框区域,或直接将文件拖拽到虚线框,以上传要注释的 pcd/bin 的压缩文件。(若格式 bin,则 cvat 在标注时会直接转为 pcd 的格式)
    压缩文件的格式如下:
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    在这里插入图片描述在这里插入图片描述

注意:文件名尽量做成类似这样以数字序号命名的格式,并且是按照时间排列的顺序,这样便于后续处理。

  1. 单击 Submit and open 以提交配置并打开已创建的任务,或 Submit and continue 以提交配置并启动新任务。文件上传成功会有提示:
    在这里插入图片描述

  2. 重新点击顶栏的 Tasks 即可看到新建的标注任务。
    在这里插入图片描述

  3. 点击 Open 进入 Jobs 页面,再点击 job#xx 就可以开始标注了
    在这里插入图片描述

标注工作区界面如下:
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

2.4 标注说明:

  1. (注意:一定要经常保存,以免发生意外情况)

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

3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

您还可以使用键盘快捷键操作:

Action Key
相机旋转 Shift + 箭头(向上、向下、向左、向右)
左 / 右 Alt+J/ Alt+L
上 / 下 Alt+U/ Alt+O
放大 / 缩小 Alt+K/ Alt+I

2.4.2. 使用长方体进行注释

有两个选项可用于 3D 标注:
• 形状:用于对象检测等任务。
• Track:使用插值来预测对象在后续帧中的位置。将为每个对象分配一个唯一 ID,并在整个图像序列中维护。(更推荐,效率高)

1)使用 shape 方式进行批注(适合帧间目标不连续的情况)

要添加 3D 形状,请执行以下操作:

  1. 在对象窗格上,选择 Draw new cuboid>从下拉列表中选择标签>shape.
    在这里插入图片描述

  2. 光标后面将跟着一个 cuboid。双击对应的位置,将长方体放置在 3D 场景中。

  3. 使用投影调整长方体。单击并按住鼠标左键可编辑投影上的标签形状。

  4. (可选)移动四个点中的一个以更改长方体的大小。

  5. (可选)要旋转长方体,请单击中间点,然后向上 / 向下或向左 / 向右拖动长方体。

  6. (可选)若相邻多帧均有相似大小的物体,可以选择传播(propagrate)当前帧的包围框到后续多帧以提高标注效率。
    在这里插入图片描述

(图中笔者是从第 9 帧开始的,传播了 10 帧,故到第 19 帧)

2)使用 track 方式进行批注(适合帧间目标连续的情况)

数据集中的文件若是按照采样时间顺序来排列,则可以根据物体在帧间移动的轨迹进行插值,从而大大节省人力。

  1. 在对象窗格上,选择 Draw new cuboid>从下拉列表中选择标签>track.
    在这里插入图片描述

  2. 为对象创建 track(轨迹)(以所选 container 为例):
    通过单击创建,然后调整 3D 包围框
    在这里插入图片描述

  3. 但是此时会发现后面所有帧都被标注了 3D 框,且越往后偏离越大:
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    在这里插入图片描述

对于这种问题,CVAT 中具有自动插值的功能,通过选取一些关键帧(点击标注界面右侧的 label 状态栏的符号空心的五角星使其变成实心的五角星,即可将该帧变为关键帧),只需要将关键帧内的包围框手动对齐,然后就会发现关键帧之间的包围框便可以自动移动到了比较合适的位置,进而只需要微调就可以了。
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

  1. 结束当前目标的轨迹
    如图所示点击标注界面右侧的 label 状态栏的 Switch Outside Property 的按钮,即可终止后续帧 track 的操作,(注:操作了这一按钮的那一帧中对应的包围框也会消失失效)
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    在这里插入图片描述

  2. 如果对象只是在几个帧上不可见,然后再次出现,可以使用 Merge 功能合并多个单独的 track 合二为一,从而保证同一物体在不同帧中对应 ID 的一致性。
    在这里插入图片描述

① 这里以图像标注为例,为骑行者可见的时刻创建轨迹:
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
② 单击 Merge 按钮,然后再单击第一个 track 的任意矩形以及第二个 track 的任意矩形,依此类推:
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
③结束时再单击 Merge 按钮,使更改生效。这样就统一了数据集中同一物体在不同帧中的 id 了。
3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

2.5 导出标注结果

  1. Save 整个工程后,重新进入 Task 的界面,点击 Export annotations:
    在这里插入图片描述

  2. 输出格式调整为Datumaro 3D 1.0,它自带的 kitti 输出的格式会有 bug(没有帧信息),save images 的开关打开以保存原始点云数据
    在这里插入图片描述

  3. 如图点击顶栏跳到 Requests 中,然后点击刚刚导出的工程 download 即可
    在这里插入图片描述

  4. 最终下载的是一个 zip 的压缩包,内容如下:
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)
    这种格式可以通过 python 脚本来转成 KITTI 数据集的格式,代码我放在最后了。

  5. 最后记得将整个 task 也做一个备份留存以供后续的二次开发

3D 点云目标检测数据集标注工具 保姆级教程——CVAT(附 json 转 kitti 代码)

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

import json
import os

def 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']  
        annotations = item['annotations']

        
        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']
                
                
                position = annotation['position']
                rotation = annotation['rotation']
                scale = annotation['scale']
                
                
                truncated = 0  
                occluded = 1 if annotation['attributes']['occluded'] else 0
                alpha = rotation[2]  
                bbox_left = 0.0  
                bbox_top = 0.0
                bbox_right = 0.0
                bbox_bottom = 0.0
                height = scale[2]  
                width = scale[0]   
                length = scale[1]  
                x = position[0]    
                y = position[1]    
                z = position[2]    
                rotation_y = rotation[2]  

                
                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 代码)

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-23发表,共计4891字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)