# NOCS数据集
# class id 与对应关系
1:'02876657', Bottle
2:'02880940',Bowl
3:'02942699',Camera
4:'02946921',Can
5:'03642806',Laptop
6:'03797390',Mug
# obj_model
在obj_model数据集下的数据结构应该是
obj_model
Train 合成数据集的
Xxx(这些都是同一类的模型)
Xxxxx(这些都是单个模型)
Model.obj
Model.mtl
Bbox.txt
Xxxxx
Xxxxx
…
Xxx
Xxx
Xxx
…
Val 合成数据及的
Real_train
Real_test

其实不止SPD,大部分的工作都对mug类进行了额外处理。
# SPD的处理
总结: 不建议看SPD的处理代码
SPD在预处理数据集的时候是分了三波处理的 camera_trian real_train camera+real test
1.在处理camera_train的时候,将深度图反投影得到点云pts,coord图计算点云coord_pts 这两个点云计算相似变换,得到sRT

在align_nocs_to_depth中估计相似矩阵

2.在处理real_train时

可以看到缩放s是直接从字典scale_factors中根据model_list[i](obj模型的名字)读取的,也就是说一个模型固定对应一个缩放,与场景无关。 而缩放是从obj_model下雨.obj文件同目录的.txt中读取的,txt中只有三个数,这三个数组成的向量的模就是该模型的scale

3.test size是通过model_size得到的,model_size则是对物体的xyz每个维度找一个最大值然后乘以2,即找了一个3D bbox s则是通过sRT中的R,因为旋转矩阵满足RR-1 = I,所以可以计算出s,而sRT的来源又是camera_test_result.pkl,这个 来自NOCS

下载后名为gts.zip,是根据scene_inst_prefix来读取的

每个pkl文件可以得到

使用的sRT就是来自这里
pts = sRT*coord_pts 所以scale(代码中是s)就是指coord到pts的缩放,而size,则是物体在nocs下的尺寸,因为坐标在coord.png中作为颜色值存储0~255,而png的数据类型是uint8(范围是[0,255]),因此想要存储坐标就不得不面临缩放。需要用size将其恢复到原始尺寸。那么在缩放的时候最好的方法就是按对角线归一化,因此需要xyz的最大值。
那么,为什么camera_train计算相似矩阵,real_train用pnp,test又直接读取呢?