网站建设 长安,wordpress 食谱网站,怎么做商务网站的架构,漳州北京网站建设公司哪家好前言#xff1a; 笔者尝试过很多3D标注软件都遇到很多问题#xff0c;例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐#xff1b;labelCloud没有三视图#xff0c;视角难以调整标得不够精确#xff1b;SUSTechPOINTS换帧麻烦、输出时存储在docker里面…前言 笔者尝试过很多3D标注软件都遇到很多问题例如CloudCompare不适合做3D目标检测的数据集而且分割地面的时很繁琐labelCloud没有三视图视角难以调整标得不够精确SUSTechPOINTS换帧麻烦、输出时存储在docker里面不方便。 CVAT是我这段时间用起来相当丝滑的一个3D目标检测的标注工具了但是关于CVAT的3D标注教程很少所以只能自己摸索最后整理出了这篇教程手册供大家参考。 目录 1. CVAT安装教程2. 3D点云标注详细流程2.1 创建3D点云标注任务Task2.2 指定任务的参数2.3 数据集上传并进入任务job2.4 标注说明2.4.1. 可使用鼠标或键盘来改变视图2.4.2. 使用长方体进行注释1使用shape方式进行批注适合帧间目标不连续的情况2使用track方式进行批注适合帧间目标连续的情况 2.5 导出标注结果 3. 标注文件格式转换代码——Datumaro 3Djson转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 [archamd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stablesudo 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. 可使用鼠标或键盘来改变视图 您还可以使用键盘快捷键操作
ActionKey相机旋转Shift 箭头向上、向下、向左、向右左/右AltJ/ AltL上/下AltU/ AltO放大/缩小AltK/ AltI
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 3Djson转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_okTrue)# 遍历每一帧for item in data[items]:item_id item[id] # 使用 JSON 中的 id 值annotations item[annotations]# 输出 KITTI 格式文件的路径使用 id 命名output_path f{output_dir}/{item_id}.txtwith 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/