前言
本文记载了使用ObjectDatasetTools制作数据集的过程,包括环境配置、模型扫描、制作标签等过程。
ObjectDatasetTools 可以为各种深度学习项目准备训练和测试数据,例如6D对象位姿估计项目单张拍摄,以及许多对象检测(例如,更快的rcnn)和实例分割(例如,掩码rcnn)项目。基于此存储库包含纯 python 脚本,首先使用 RGB-D 摄像机拍摄对象序列,其次通过 aruco 标记和 ICP 注册实现原始 3D 模型,然后在网格处理软件中进行处理和噪声消除,最后自动生成所需的标签。
准备工作
- Ubuntu 18.04
- ROS Melodic
- python3
- Intel Realsense D455
一、环境配置
1.安装RealsenseD435 驱动
Step1. 安装相关依赖
#打开终端,分别输入以下命令完成相关依赖的安装:
sudo apt-get install git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
sudo apt-get install libglfw3-dev
Step2. 进行编译与安装
git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
mkdir build && cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=true
sudo make uninstall
make clean && make -j8
sudo make install
Step3. 测试
realsense-viewer
2.配置ObjectDatasetTools虚拟环境
Step 1. 创建虚拟环境
conda create -n ODT python=3.6
conda create ODT
sudo apt-get update
sudo apt-get upgrade
Step 2. 克隆项目
git clone https://github.com/F2Wang/ObjectDatasetTools
cd ObjectDatasetTools
Step 3. 安装相关依赖
sudo apt-get install build-essential cmake git pkg-config libssl-dev libgl1-mesa-glx
Step 4. 安装相关库
pip install numpy Cython==0.19 pypng scipy scikit-learn open3d==0.9.0 scikit-image tqdm pykdtree opencv-python==3.3.0.10 opencv-contrib-python==3.3.0.10 trimesh==2.38.24 pyrealsense2 shapely
注:个别缺少的库可以在虚拟环境是用pip install xxx安装
二、制作数据集
1.准备工作
打印arucomarkers文件夹内的二维码 1-13,并贴在目标周围,确保二维码平整,无重复,间距合理。
2.记录对象序列
方法1:使用实感摄像机
项目提供录制RGB和Depth图的脚本
conda activate ODT
python record2.py LINEMOD/objectName
注:
- 脚本在倒计时 5 后录制 40 秒,录制间隔与时长可在脚本中更改,录制过程中可按"q"退出;
- 录制时需要保证相机平稳的移动,保证相机的视野中至少出现2-3个标记码;
- LINEMOD文件夹名称更改将会导致错误;
- 彩色图像、与彩色图像对齐的深度图以及相机参数将自动保存在序列的目录下。
方法2:使用其他相机
若使用其他相机,需保证获取深度图像与彩色图像对齐,并将彩色图像(.jpg)放在"JPEGImages"的文件夹中,并将深度图像放在"depth"文件夹中。
└──LINEMOD ???└──objectName ???│???├── JPEGImages ???│???│???└── 0.jpg、1.jpg… ???│???├── depth ???│???│???└── 0.jpg、1.jpg… ???│???├── intrinsics.json
在序列目录下创建一个文件“intrinsics.json”,然后按如下格式手动输入相机参数:
{"fx": 614.4744262695312, "fy": 614.4745483398438, "height": 480, "width": 640, "ppy": 233.29214477539062, "ppx": 308.8282470703125, "ID": "620201000292"}
其中 fx,fy,cx,cy是必须参数,且fx = fy是图像的宽度,cx、cy是图像的中心。对于640*480分辨率的图像,fx=fy=640,cx=320、cy=240。
3.获取帧变换
针对第一帧以指定的时间间隔(可以在 config/registrationParameters 中更改间隔)对第一帧计算帧的变换,将变换(4*4 同构变换)保存为 numpy 数组 (.npy),经历此步骤后文件夹内会增加一个“transforms.npy”文件。
python compute_gt_poses.py LINEMOD/objectName
4.目标物体三维重构
方法1: register_scene
在终端输入命令,原始的“registeredScene.ply ”将保存在指定目录下(例如,LINEMOD/objectNamer)。
python register_scene.py LINEMOD/objectName
“ registerScene.ply” 是场景的注册点云,包括桌面、标记和扫描过程中暴露的任何其他对象,并具有一定程度的噪声消除。 生成的网格看起来如下图,需要在步骤 5 中手动处理。
方法2: register_segmented
默认情况下,register_segmented尝试删除所有不需要的背景并执行表面重建,将注册的点云转换为三角形网格。如果MESHING设置为false,脚本将仅尝试移除背景并使用平坦表面自动完成看不见的底部(如果FILLBOTTOM设置为 true),需要执行步骤5。
python register_segmented.py LINEMOD/objectName
register_segmented使用一些特殊的方法来分割背景,可能需要调整“MAX_RADIUS”参数,默认值为0.2m。随着目标到运行register_segmented的结果如下所示:
5.手动处理点云数据
若对运行register_segmented的结果感到满意,则可以跳过步骤 5,反之,需要使用Meshlab处理已注册的点云:
- 删除不感兴趣的背景,
- 执行表面重建并完成缺失的一侧,反之亦然,
- 处理重建的网格(您可能需要切断零件并重新完成缺失的一侧),
- 确保处理后的网格没有任何孤立的噪声。
Step 1. 安装Meshlab
### Step 2. 导入 registerScene.ply
Step 3. 删除不感兴趣的背景:
点击1选中需要去除的点云,并按2删除
确保处理后的网格没有任何孤立噪音
Step 4. 曲面重建
计算每个点的法线,在弹出的框内输入100,点击Apply,运行完成,点击Close
曲面重建,不用管第一个文本框,第2个文本框里面,调为1.0。点击Apply,运行之后点击Close,关闭这个对话框。
查看的模型的效果,并且右边栏中的Faces项的值已经有数值了:
Step 6. 保存Mesh
打开查看
6. 生成掩码和标签文件
当为自定义对象完成步骤1-5后,运行如下代码:
python create_label_files.py all
或者(推荐)
python create_label_files.py LINEMOD/objectName
同时创建一个名为“container3.ply”的新网格,其AABB以原点为圆心,并且与OBB的尺寸相同。
同时还生成图像掩码(保存在mask文件下),关于新网格的4*4同质变换(保存在transforms里),标签文件保存在labels文件。
三、检测创建数据集
1.检查创建的 3D 边界框和掩码的正确性:
python inspectMasks.py LINEMOD/container3
2.创建训练和测试映像
python makeTrainTestfiles.py
3.获得物体比例(最大垂直距离)
python getmeshscale.py
4.为对象检测项目创建边界框标签
python get_BBs.py
|