这是以下论文代码的开发版本:
Bugra Tekin、Sudipta N. Sinha 和 Pascal Fua,“实时无缝单镜头 6D 物体姿势预测”,CVPR 2018。
上述论文代码库的原始存储库可以在以下链接中找到。
我们提出了一种单次方法,用于同时检测 RGB 图像中的对象并预测其 6D 姿态,而无需多个阶段或检查多个假设。我们方法的关键组成部分是受 YOLO 网络设计启发的新 CNN 架构,它直接预测对象 3D 边界框投影顶点的 2D 图像位置。然后使用 PnP 算法估计对象的 6D 位姿。论文,arXiv
如果您使用此代码,请引用以下内容
@inproceedings{tekin18,
标题 = {{实时无缝单镜头 6D 物体姿态预测}},作者 = {Tekin、Bugra 和 Sinha、Sudipta N. 和 Fua、Pascal},
书名 = {CVPR},
年份 = {2018}
}
SingleShotPose 在 MIT 许可证下发布(详细信息请参阅 LICENSE 文件)。
该代码在Windows上使用 CUDA v8 和 cudNN v5.1 进行了测试。该实现基于PyTorch 0.4.1并在Python3.6上进行了测试。该代码需要以下可以通过 conda 或 pip 安装的依赖项:numpy、scipy、PIL、opencv-python。对于与 PyTorch 0.3.1 兼容并在 Python2.7 上测试的早期版本,请参阅py2
文件夹。
在主代码目录中,运行以下命令下载并提取 (1) 预处理的 LINEMOD 数据集,(2) LINEMOD 数据集的训练模型,(3) OCCLUSION 数据集的训练模型,(4) 来自 VOC2012 的背景图像分别为数据集。
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
或者,您可以直接访问上面的链接,手动下载并解压相应目录中的文件。整个下载过程可能需要很长时间(约 60 分钟)。另请注意,在某些国家/地区对 OneDrive 的访问可能会受到限制。
为了训练模型运行,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
例如
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
如果您想从 ImageNet 初始化权重开始,或者
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
如果您想从 LINEMOD 上已预训练的模型开始,以实现更快的收敛。
[datacfg]包含有关训练/测试分割、3D 对象模型和相机参数的信息
[modelcfg]包含有关网络结构的信息
[initweightfile]包含初始化权重。 <
在训练开始时,您将看到如下输出:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
这定义了网络结构。在训练过程中,最佳网络模型被保存到“model.weights”文件中。要训练其他对象的网络,只需在调用训练函数时更改对象名称,例如“ python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
”。如果您在训练时遇到 GPU 内存错误,您可以尝试降低批量大小(例如 16 或 8)以适应内存。开源版本的代码经过了强有力的重构,此外一些模型还需要重新训练。我们提供的重新训练模型与我们提供的初始结果相比没有太大变化(有时稍差,有时稍好)。
测试模型运行
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
例如
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
您还可以使用 valid.ipynb 来测试模型并可视化结果。
在 multi_obj_pose_estimation/ 文件夹内
测试:
python valid_multi.py cfgfile weightfile
例如
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
训练:
python train_multi.py datafile cfgfile weightfile
例如,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
我们的标签文件包含 21 个真实值。我们预测对应于 3D 对象模型的质心和角点的 9 个点。此外,我们预测每个单元格中的类别。 9x2+1 = 19 分。在多对象训练中,在训练过程中,我们将与当前对象大小最相似的锚框指定为负责预测该对象的 2D 坐标的锚框。为了对对象的大小进行编码,我们为 x 维度和 y 维度的范围添加了 2 个数字。因此,我们有 9x2+1+2 = 21 个数字。
21个数字分别对应以下内容:第1个数字:类标签,第2个数字:x0(质心的x坐标),第3个数字:y0(质心的y坐标),第4个数字:x1(质心的x坐标)第 5 个数字:y1(第一个角点的 y 坐标),...,第 18 个数字:x8(第八个角点的 x 坐标),第 19 个数字:y8(第八个角点的 y 坐标) ,第 20 个数字:x 范围,第 21 个数字:y 范围。
坐标由图像宽度和高度标准化: x / image_width
和y / image_height
。这对于坐标回归和对象分类任务具有相似的输出范围非常有用。
我们使用相同的训练/测试分割和 BB8 方法在 LINEMOD 数据集上训练和测试我们的模型,以验证我们的方法。如果您想在自己的数据集上训练模型,您可以使用提供的 LINEMOD 数据集创建相同的文件夹结构,并调整 cfg/[OBJECT].data、[DATASET]/[OBJECT]/train.txt 和[数据集]/[对象]/test.txt 文件。每个对象的文件夹应包含以下内容:
(1) 包含图像文件的文件夹,
(2) 包含标签文件的文件夹(有关如何创建标签的详细说明,请参阅此链接。您还可以找到第三方 ObjectDatasetTools 工具箱,可用于创建用于 6D 物体姿态估计的地面实况标签),
(3) 包含训练图像文件名的文本文件 ( train.txt
),
(4) 包含测试图像文件名的文本文件 ( test.txt
),
(5) 包含3D物体模型的.ply文件(物体模型的单位以米为单位),
(6) 可选的,包含分割蒙版的文件夹(如果您想更改训练图像的背景,使其对不同的背景更加鲁棒,这对于更好的泛化能力至关重要),
另请确保根据您的需要调整数据和模型配置文件中的以下值:
diam
”值更改为现有对象模型的直径。yolo-pose.cfg
文件中的步骤、尺度、max_epochs 参数)和一些数据增强参数( dataset.py
中的抖动、色调、饱和度、曝光参数)可能还需要进行调整,以便更好地融合数据集。yolo-pose-multi.cfg
) 中指定它。另请确保使用正确的类数并在yolo-pose-multi.cfg
中指定。fx
、 fy
、 u0
、 v0
、 width
、 height
),其中包含特定于您的数据集的参数。在创建训练数据集时,对大量视点/距离进行采样并对照明/遮挡/背景设置的较大变化进行建模对于提高数据集方法的泛化能力非常重要。如果您想根据自己的目的调整一些模型和损失参数(例如不同损失项的权重因子),您可以在模型配置文件( yolo-pose.cfg
)中进行调整。
该代码由 Bugra Tekin 编写,基于 github 用户@marvis 的 YOLOv2 实现构建
如有任何问题或错误报告,请联系 Bugra Tekin