3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
媒介:笔者实行过许多3D标注软件都遇到许多问题,例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐;labelCloud没有三视图,视角难以调整标得不敷精确;SUSTechPOINTS换帧麻烦、输出时存储在docker里面不方便。 CVAT是我这段时间用起来相称丝滑的一个3D目标检测的标注工具了,但是关于CVAT的3D标注教程很少,所以只能自己摸索,最后整理出了这篇教程手册供大家参考。
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-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb 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 (创建新使命)。
https://i-blog.csdnimg.cn/direct/4a0aa0d079b446b6a46cd47ad3fa0624.png
随后页面显示如下:
https://i-blog.csdnimg.cn/direct/f4d2298cc6424bc68135171b15dacf6e.png
2.2 指定使命的参数:
[*] 在 Name 字段中,输入新使命的名称。
https://i-blog.csdnimg.cn/direct/5cbd7a08757a4cceb4e0fb8fbcacf647.png
[*] (可选)从 Projects 下拉列表中,为新使命选择一个项目。
如果不想将使命分配给任何项目,请将此字段留空(建议)。
https://i-blog.csdnimg.cn/direct/3c93abf7490345b990fbd2e53e40255a.png
留意:如果使命不属于项目,则以下步骤有效。
如果使命已分配给项目,则项目标标签将应用于该使命。
[*] 在 Constructor 选项卡上,单击 Add label (添加标签)。
标签构造函数菜单将打开:
https://i-blog.csdnimg.cn/direct/6d46e9eca98447a7a16e5ef611125e3e.png
[*] 在 Label name(标署名称)字段中,输入标签的名称。
[*] (可选)要将标签的利用限制为特定形状工具, 从 Label shape 下拉菜单中选择形状(默认Any即可)。
[*] (可选)选择标签的颜色,建议选择一些区分度比较大的颜色。
https://i-blog.csdnimg.cn/direct/a78d40e9ddf543e091ed072f5765fdc0.png
[*] (可选)单击 Add an attribute 并设置其属性。(可以不设置)
[*] 单击 Continue 提交标签,就可以在背景生存下来,直接在label name上开始添加新标签,
https://i-blog.csdnimg.cn/direct/cb34fd92bc734abba1841fc944db91d5.png
https://i-blog.csdnimg.cn/direct/9301e689a2ed4e14b7d6061427ff10ea.png
单击 Cancel 终止当前标签并返回到标签列表,就会发现添加的标签已经列出来了。
https://i-blog.csdnimg.cn/direct/7957aed148af4866bc0b3f844f7efaa0.png
2.3 数据集上传并进入使命job:
[*]单击 Select files (选择文件)的虚线方框地区,或直接将文件拖拽到虚线框,以上传要表明的pcd/bin的压缩文件。(若格式bin,则cvat在标注时会直接转为pcd的格式)
压缩文件的格式如下:
https://i-blog.csdnimg.cn/direct/33e163296c7441ea97c26ee3908070be.png
https://i-blog.csdnimg.cn/direct/af56b9a8836e4e04ba64d882598d395f.pnghttps://i-blog.csdnimg.cn/direct/3620b6b3ef0b4d13b2337591e3f80a80.png
留意:文件名只管做成类似这样以数字序号命名的格式,并且是按照时间排列的次序,这样便于后续处置惩罚。
[*] 单击 Submit and open 以提交配置并打开已创建的使命,或 Submit and continue 以提交配置并启动新使命。文件上传成功会有提示:
https://i-blog.csdnimg.cn/direct/403100f8175049188d45dfa1784e9eac.png
[*] 重新点击顶栏的Tasks即可看到新建的标注使命。
https://i-blog.csdnimg.cn/direct/0a35fca3b8ef41358e87a6140c0e28e4.png
[*] 点击Open进入Jobs页面,再点击job#xx 就可以开始标注了
https://i-blog.csdnimg.cn/direct/9f6f9a7e146247ef8da47f2fe8c977d9.png
标注工作区界面如下:
https://i-blog.csdnimg.cn/direct/b5fc30010d9d4cfd9b00b585d5358758.png
2.4 标注说明:
[*](留意:一定要经常生存,以免发生不测情况)
2.4.1. 可利用鼠标或键盘来改变视图:
https://i-blog.csdnimg.cn/direct/06f7dbb55d6c4b57bf72b92e9544aee3.png
您还可以利用键盘快捷键利用:
ActionKey相机旋转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.
https://i-blog.csdnimg.cn/direct/2cc02bad9129414dba067569b616043d.png
[*] 光标后面将跟着一个cuboid。 双击对应的位置,将长方体放置在3D场景中。
https://img-blog.csdnimg.cn/img_convert/0ac06ca633a7178350f8b661073d1f65.gif
[*] 利用投影调整长方体。 单击并按住鼠标左键可编辑投影上的标签形状。
https://img-blog.csdnimg.cn/img_convert/e8deed22aa8dc792af2f0cb37c930270.gif
[*] (可选)移动四个点中的一个以更改长方体的大小。
https://img-blog.csdnimg.cn/img_convert/6434a0b76f17127a5529fbb03b7f6602.gif
[*] (可选)要旋转长方体,请单击中心点 ,然后向上/向下或向左/向右拖动长方体。
https://img-blog.csdnimg.cn/img_convert/d1a17a02041bd47a81bd0a4a6b6b152c.gif
[*] (可选)若相邻多帧均有相似大小的物体,可以选择传播(propagrate)当前帧的困绕框到后续多帧以提高标注效率。
https://i-blog.csdnimg.cn/direct/d1a8aa17d20b445bb3a9166e917cfa9c.png
(图中笔者是从第9帧开始的,传播了10帧,故到第19帧)
2)利用track方式进行讲明(适合帧间目标一连的情况)
数据集中的文件若是按照采样时间次序来排列,则可以根据物体在帧间移动的轨迹进行插值,从而大大节流人力。
[*] 在对象窗格上,选择 Draw new cuboid>从下拉列表中选择标签>track.
https://i-blog.csdnimg.cn/direct/1ac7fc0043274bf594bb96a2ecce18fb.png
[*] 为对象创建track(轨迹)(以所选container为例):
通过单击创建,然后调整3D困绕框
https://i-blog.csdnimg.cn/direct/e46cba49ee1740339628a888d0d3e00b.png
[*] 但是此时会发现后面所有帧都被标注了3D框,且越今后偏离越大:
https://i-blog.csdnimg.cn/direct/0b87b53ca4944fbca032ffaf3230da04.png
https://i-blog.csdnimg.cn/direct/986fa1a3d9df4416b79d2d9de94e6337.png
https://i-blog.csdnimg.cn/direct/426e234448b3432daf1d6220908cd825.png
对于这种问题,CVAT中具有自动插值的功能,通过选取一些关键帧(点击标注界面右侧的label状态栏的符号空心的五角星使其变成实心的五角星,即可将该帧变为关键帧),只需要将关键帧内的困绕框手动对齐,然后就会发现关键帧之间的困绕框便可以自动移动到了比较合适的位置,进而只需要微调就可以了。
https://i-blog.csdnimg.cn/direct/e6998386c5ef4a5abb096f90d53f7467.png
https://i-blog.csdnimg.cn/direct/266b6a1ff5c94b20a26f24eec7d80534.png
[*] 结束当前目标的轨迹
如图所示点击标注界面右侧的label状态栏的Switch Outside Property的按钮,即可终止后续帧track的利用,(注:利用了这一按钮的那一帧中对应的困绕框也会消散失效)
https://i-blog.csdnimg.cn/direct/8a20b4d7c4af4ba090913518aa453e95.png
https://i-blog.csdnimg.cn/direct/4aed12fdd5f64eb7a52143fc7c729862.png
[*] 如果对象只是在几个帧上不可见,然后再次出现,可以利用Merge功能合并多个单独的track合二为一,从而保证同一物体在差异帧中对应ID的同等性。
https://i-blog.csdnimg.cn/direct/5cceaa38a9664dd8ac0bd7b00457a683.png
① 这里以图像标注为例,为骑行者可见的时刻创建轨迹:
https://img-blog.csdnimg.cn/img_convert/549a95f9d52d34367194243c8eb249ba.gif
② 单击Merge按钮,然后再单击第一个track的任意矩形以及第二个track的任意矩形,依此类推:
https://img-blog.csdnimg.cn/img_convert/48e8462ade3acf656189f4069512bdbf.jpeg
③结束时再单击Merge按钮,使更改生效。这样就同一了数据集中同一物体在差异帧中的id了。
https://i-blog.csdnimg.cn/direct/06477863b2ba48df8c75bab51e8cbba3.png
2.5 导出标注结果
[*] Save整个工程后,重新进入Task的界面,点击Export annotations:
https://i-blog.csdnimg.cn/direct/da6f8426ae4f42668f197c11340c9cba.png
[*] 输特别式调整为Datumaro 3D 1.0,它自带的kitti输出的格式会有bug(没有帧信息),save images 的开关打开以生存原始点云数据
https://i-blog.csdnimg.cn/direct/bb34a489c8fc4c59839c4f1c65567227.png
[*] 如图点击顶栏跳到Requests中,然后点击刚刚导出的工程download即可
https://i-blog.csdnimg.cn/direct/078dcacab4124d318b53a9c8c47a60f0.png
[*] 最终下载的是一个zip的压缩包,内容如下:
https://i-blog.csdnimg.cn/direct/34d2b3a1c9c549738cda313432f5d983.png
https://i-blog.csdnimg.cn/direct/4d17c29e6f844599944c8f75d85eb8c9.pnghttps://i-blog.csdnimg.cn/direct/e5ce445aed07418fad1f8f3dd8ef3069.png
这种格式可以通过python脚原来转成KITTI数据集的格式,代码我放在最后了。
[*] 最跋文得将整个task也做一个备份留存以供后续的二次开发
https://i-blog.csdnimg.cn/direct/db6130224d604827a260e3b5a4867800.png
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']# 使用 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['name']
# 提取 3D 立方体信息
position = annotation['position']
rotation = annotation['rotation']
scale = annotation['scale']
# KITTI 格式字段
truncated = 0# 默认为 0,因为未提供截断信息
occluded = 1 if annotation['attributes']['occluded'] else 0
alpha = rotation# 使用 Z 轴的旋转角作为方向角
bbox_left = 0.0# 2D 边界框位置,点云标注中通常为 0
bbox_top = 0.0
bbox_right = 0.0
bbox_bottom = 0.0
height = scale# 物体高度
width = scale # 物体宽度
length = scale# 物体长度
x = position # 物体在相机坐标系中的 x 坐标
y = position # 物体在相机坐标系中的 y 坐标
z = position # 物体在相机坐标系中的 z 坐标
rotation_y = rotation# 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/
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]