Kaggle比赛
这个比赛我觉得是半年来收获最大的
过程
开始做这个比赛的时候,还有两个月的时间,花了一些时间看相关论文,当时看的是PVNet和CDPN,最后决定用CDPN试一下
CDPN
CDPN的预测需要mask信息和每个物体的3D模型的。
Mask:
比赛数据集没提供mask信息,就想着试试不用mask的话,CDPN效果如何:
还试了不同的scale参数,其中不用Mask最好的效果:
使用Mask最好的效果:
事实证明,还是需要Mask的,不然效果连Baseline都赶不上。
所以,对于Mask信息的获取进行了以下尝试:
1.一开始尝试将所有的3D点云射影到2D图像上来获取Mask,但是失败了,这种质量的Mask是不能用的:
2.想用其他数据集来训练一个实例分割器,后来找了数据集之后觉得没有必要
3.使用Hybrid Task Cascade算法在COCO上训练的权重试了下,效果很不错,就打算先用这个来获取Mask信息了:
3D Model:
CDPN的要求是每个物体和自己所属的模型对应上,我当时觉得这么多车型不好做分类,用车的尺度的平均值做映射的模型,用2D图像的像素预测对应的3D点
比赛结束后看6DVNet和RoI: 10D这两个论文,前者对汽车进行了车型分类(奥迪、宝马)这样的,后者提出了一个方法,能处理同类的模型
然后对这个CDPN的方法坐在了初步规划:
写完代码之后进行训练,训完之后发现效果很不好,框都上天了
后来发现是有两个错误:
- 我用的2D逆射影到3D空间,但是这样少了个z信息,是无法得出正确的3D空间坐标的。
- 我是用的输入信息是经过resize的,这样的话做pnp不经过处理的话是得不到正确的RT信息的。
修改之后又继续进行训练了。
2D与3D坐标的拟合:
后来想将R和T分开处理,尝试用多项式来函数化图像中的xy和空间中的XYZ的关系,将X、Y、Z分别用x、y来拟合,发现效果并不好,所以还是要用深度学习的方法。
虽然我多项式拟合失败了,但是我觉得X、Y、Z和xy之间应该有一种对应函数,可直接算出,因为车都在路面上,就是说不会有车完全在另一个车的后面,也不会有深度位置的问题,如图所示:
后来经过老师的指点,用3D空间的数据拟合一个平面,因为车都是在地上走的,必然都在路面这个平面上,使用的代码如下:
这是参考的方法:
平面拟合 SVD版本
求交点
拟合出的平面如图:
计算的误差如下: