ObjectDatasetTools--->readme翻译

## 先说结论,ObjectDatasetTools不好用,有效的方法见我另外一个博客,连接如下:
有效的方法:https://blog.csdn.net/weixin_41837701/article/details/122799717?spm=1001.2014.3001.5502

--------------分割线---------------

1.介绍

该库为纯Python脚本,用于为使用RGB-D相机拍摄的对象序列创建掩码、边界框标签和3D重建对象网络(.ply)。该项目可以为各种深度学习项目准备训练和测试数据集,例如6D位姿估计项目,以及多目标检测项目(faster rcnn)和实例分割项目(mask rcnn)。理想情况下,如果拥有实感相机并且对MeshLab或Blender有一定经验,那么创建自定义数据集就像执行几行命令一样简单。

该库中的代码通过aruco markers和ICP registration实现了原始3D模型获取。得到的原始3D模型需要在网格处理软件中进行处理和降噪。在这一步之后会自动生成所需要的标签功能。

这些代码目前是为每一帧一个感兴趣的对象编写的。可以修改以创建在一个框架内具有多个项目的数据集。

2.安装

该库在Ubuntu16.04、Python2.7上进行了测试https://hub.fastgit.org/F2Wang/ObjectDatasetTools/blob/master/doc/installation.md,但应与Python3兼容。包括在各种英特尔实感驱动程序以及Python包上的安装。

3.自定义数据集

(1)准备

在arucomarkers文件夹中使用适当大小的aruco标记(ID 1-13)对pdf进行彩色打印。在感兴趣的对象周围贴上标记,如图所示,确保没有带有重复IDS的标记。

(2)记录一个序目标列

选项1:使用实感相机录制(首选SR300)

对旧模型使用record.py,对librealsense SDK 2.0使用recordf2.py:

python record.py LINEMOD/OBJECTNAME

如:通过如下代码实现记录一个sugar box。

python record.py LINEMOD/sugar

默认情况下,脚本在倒计时5后录制40秒。我们可以通过按“q”更改录制间隔或退出录制。然后稳定移动相机以获得物体不同视图,同时随时保持2-3个标记在相机的视野内。

注意项目假设所有序列都保存在名为“LINEMOD”的文件夹下,使用其他文件夹名称会报错。

如果使用record.py创建序列,彩色图像、深度图以及相机参数会自动保存在序列目录下。

选项2:使用现有序列或其他相机一起录制

如果使用其他相机,将彩色图像(.jpg)放在名为“JPEGImages”的文件夹中,并将对其的深度图像放在“depth”文件夹中。注意:该算法嘉定深度图与彩图对齐。将彩图按顺序从0.jpg、1.jpg、…、600.jpg和相应的深度图命名为:0.png,…,600.png,同时应在序列目录下创建一个名为“intrinsics.json”的文件,并按照如下形式手动输入相机参数:

{"fx": 614.4744262695312, "fy": 614.4745483398438, "height": 480, "width": 640, "ppy": 233.29214477539062, "ppx": 308.8282470703125, "ID": "620201000292"}

如果不知道相机内参,可以输入一个粗略的估计。所需要的参数为fx,fy,cx,xy。其中,通常,fx=fy等于图像 的宽度,cx=cy是图像的中心。例如:对于640*480分辨率的图像,fx,fy=640,cx=320、cy=240.

(3)获取帧变换

以指定的间隔(可以在 config/registrationParameters 中更改间隔)对第一帧计算帧的变换,将变换(4*4 同构变换)保存为 numpy 数组 (.npy)。

python compute_gt_poses.py LINEMOD/sugar

(4)注册所有帧并为注册的场景创建一个网格。

python register_scene.py LINEMOD/sugar

原始的registeredScene.ply 将保存在指定目录下(例如,LINEMOD/sugar)。 registerScene.ply 是场景的注册点云,包括桌面、标记和扫描过程中暴露的任何其他对象,并具有一定程度的噪声消除。 生成的网格看起来像这样,需要在步骤 5 中手动处理:

或者,可以尝试通过尝试 register_segmented 而不是 register_scene 来跳过所有手动工作。

python register_segmented.py LINEMOD/sugar

默认情况下,register_segmented尝试删除所有不需要的背景并执行表面重建,将注册的点云转换为三角形网格。如果MESHING设置为false,脚本将仅尝试移除背景并使用平坦表面自动完成看不见的底部(如果FILLBOTTOM设置为 true),您将需要执行步骤5。

但是,register_segmented可能会失败,因为它使用一些特殊的方法来分割背景,因此您可能需要调整一些参数以使其与您的对象一起使用。要调整的最重要的旋钮是“MAX_RADIUS”,它会切断任何深度读数,其到观察到的aruco标记中心的欧几里得距离大于指定值。此值当前设置为0.2m,如果您有更大的对象,您可能需要增加此值以不切断对象的一部分。运行register_segmented的结果如下所示:

(5)手动处理注册的点云(可选)

如果对运行register_segmented的结果满意,可以跳过步骤5.

注册的点云需要处理为:

  1. 删除不感兴趣的背景;
  2. 执行表面重建并完成缺失的一侧,反之亦然;
  3. 处理重建的网络(可能需要切掉部分并重新完成缺失的一侧);
  4. 确保处理后的网格没有任何孤立噪音。

最终生成三角形网格,而不是算法生成的注册点云。

下面的视频连接为点云到网格转换、点云到网格重建(MeshLab)以及作者录制的简单教程https://www.youtube.com/watch?v=38mt3kpsxd4   https://www.youtube.com/watch?v=lHKOJ1dbyJI   https://www.youtube.com/watch?v=BPX-j9xE2EQ 。

如果生成网格的目的是获取掩码或将其用于单镜头位姿识别等项目,则仅需要精确的网格几何体,而外观则是不必要的。因此,对于平面区域,如视频中所示的“闭合孔”是可接受的。此外对于对称对象,则通过对称手动完成。如果需要缺失面的确切纹理信息,需要拍摄另外一个缺失面的序列并手动对齐点云。

(6)生成图像掩码和标签文件

当为自定义对象完成步骤1-4后,运行如下代码:

python create_label_files.py all

或者

python create_label_files.py LINEMOD/sugar

此步骤创建一个名为foldername.ply(例如:sugar.ply)的新网格,其AABB以原点为圆心,并且与OBB的尺寸相同。同时还生成图像掩码(保存在mask文件下),关于新网格的4*4同质变换(保存在transforms里),标签文件保存在labels文件,标签为3D bounding box在2D图像中的投影。掩码文件可用于深度学习项目(例如mask-rcnn)的训练和测试。

通过运行以下命令直观地检查创建的 3D 边界框和掩码的正确性:

python inspectMasks.py LINEMOD/sugar

(可选项)创建singleshotpose所需的额外文件

如果为singleshotpose创建网格文件,则需要在meshlab中打开这些新的网格文件,并通过取消选中二进制格式选项再次保存它们。这些网格被 singleshotpose用于评估和姿态估计目的,而singleshotpose无法读取二进制编码的网格。

在步骤 6 中创建的掩码和标签与 singleshotpose 兼容。 目前,类标签以一种hacky方式分配(例如,按照文件夹在所有序列文件夹中的顺序),如果您为每个文件夹调create_label,它们将被分配相同的标签,因此请阅读打印输出并更改类标签在create_label_files.py中手动。

另外,需要通过下面代码创建train和test图像。

python makeTrainTestfiles.py

并创建其他所需的路径文件。

对于每个自定义目标,在cfg文件夹中创建一个objectname.data文件。

要获得对象比例(最大定点距离),可运行如下代码:

python getmeshscale.py

上述是为singleshotpose创建自定义数据集所需要的所有步骤,需要注意的是要更新singleshotpose中的相机校准参数。

(可选项)为对象检测项目创建边界框标签

完成第6步(即生成图像掩码)后,运行以下代码:

python get_BBs.py

该代码可以创建annotations.csv,其中包含LINEMOD文件夹下所有图像的类标签和边界框信息。

你可能感兴趣的:(ROS,6自由度位姿估计,6DoF,人工智能,图像处理,计算机视觉)