文章目录
解决什么问题
6D位姿估计,不需要模型
本文创新点\贡献
- 端到端的多尺度单目3D检测,ROI lift map直接回归3D框的全部元素
- 一个新的loss,在度量空间对齐3D包围盒,直接最小化和真实3Dbbox的误差,不需要设置参数
- 模型的延申,用于预测度量纹理mesh,支持进一步的3D推理,做3D合成数据增强
前人方法
SSD-6D,离散角度预测
yolo-6D,预测点做PnP
3D Pose Estimation and 3D Model Retrieval for Objects in the Wild
回归2D控制点,绝对尺度
BB8也看一下?2017
Posecnn: A convolutional neural network for 6d
object pose estimation in cluttered scenes. 2018
这个直接预测旋转,然后预测2D形心对应的3D点,这样RT都有了,然后将3Dmesh转换到摄像机坐标系,计算model点和真实点之间的距离。
微调
Deep model-based 6d pose refinement in rgb 2018
微调属于射影对齐范畴
这些都需要精准的3D模型,都无法处理类内的
不过DeepIM说也能处理没见过的
方法
方法概述
用自己做的mesh做了数据增强,使用网络来预测深度图,同时检测出2D RoI,同时使用RoI处的特征信息和预测的深度信息,根据作者提出的,来预测旋转,RoI相关的2D形心,深度,范围,用这个来建立八个角点
八角点预测
From Monocular 2D Instance to 6D Pose
定义一个全部可微的映射,从2DROI到3Dbox信息,3Dbox 是八个有序的3D点
loss的核心
和深度信息一起编码,旋转用4元数,位移用射影2D物体形心
和[ 3d bounding box estimation using deep learning and geometry ] 2017 相似
[ Ssd-6d: Making rgb-based 3d detection and 6d pose estimation great again ] 2017
[ Posecnn: A convolutional neural network for 6d object pose estimation in cluttered scenes ] 2018
知道了形心又如何,如何知道形心在3D中的位置?
有了旋转,那就能知道一条射线,车的中心必在这个射线内,那么有了z是不是就能直接知道位置了?有长度的射线就是线段了,线段的另一个端点就是那个点了,根据长度和夹角是不是就能算出其他坐标系的值了?
不对,只有得知物体相对于原点的旋转才可以这么算,感觉预测出来的并不是对于相机原点的角度,而是本身的绝对角度,这样就不能根据旋转和z确定位置了。
现在的问题是不知道预测的是什么坐标系的
答:下面说了,非自我中心的
那就根据形心,根据内参和z,就能知道世界坐标系中中心点的位置了
我们将三维区段描述为整个数据集上与平均值区段的偏差
这个我也想到了
给定ROI ,在该位置运行RoIAlign,用几个单独的head分别预测旋转,RoI相关的2D形心,深度,范围,用这个来建立八个角点 :
其中是相机内参的逆函数
有了,很容易就能通过内参和像素坐标的位置获得点在世界坐标系中的位置,但是这个旋转我有点迷,右乘旋转矩阵是以自身坐标系为参考旋转(自我中心),左乘旋转矩阵是以其他固定坐标系为旋转参考(非自我中心),先自己转,再绕着相机原点转,不太明白这么做的含义,上式的输入是一个点,点以自己为中心旋转没什么意义啊,如果去掉这个右乘对结果也没什么影响,最后也能得到对应的世界坐标系的位置,这个是以摄像机原点为中心。
还使用了3D anchor
[ Joint 3d proposal generation and object detection from view aggregation ] 2018
[ Multi-view 3d object detection network for autonomous driving ] 2017
在全部的图片平面,这些3Danchor的2D实例化是稀疏的而且有效的
这样的3D anchor能提供物体的3D位置。
是不是用平均值,然后预测偏差,就是anchor的概念,所以就叫3D anchor?
不然的话怎么建anchor?整整比2D多了一个维度
Lifting Pose Error Estimation to 3D
从单目数据估计位姿的时候,在像素空间小的偏差能导致在3D上的大误差
对每个信息单独做loss的话,会导致易挥发(volatile)的优化,容易达到局部极小值
这个易挥发很贴切
之前的大部分做法都是对每项单独做loss,而作者不一样
不是同时平等的优化所有的元素,而是让网络在训练的时候决定他的关注点
自己决定,这么神奇,难道是写了个函数能看出来那些元素对最终结果影响大,做加权?
不是,应该就是因为他的公式,将所用项融合到一块,得出一个结果
给定3D box ,还有相关的2DRoI ,然后使用作者提出的函数来恢复3D预测,。这个loss本身是度量空间的八个点的平均距离:
这个对应就像上图中的绿线
所以说作者直接用所有信息生成的最后的结果来做loss,而想实现这样的效果,就得保证在这个生成八角点的过程中,各个元素都是可微的,能反向传播,正如下面的链式法则
但是问题又来了,没有详细的公式
这个式子能清晰的表现每个元素对最终3D对齐的影响
[ Unsupervised learning of depth and egomotion from monocular video using 3d geometric constraints ] 2018
[ Deep model-based 6d pose refinement in rgb ] 2018
和上面两个一样,做了摄影和几何约束,作者观察到,需要一段热身期,使回归回归到适当的数值体制
就是先单独训练每个元素,直到能出现一个稳定的3D box实例,再使用lift loss
这个热身操作要学一下,元素很多的时候,不过单独训练是怎么做的呢,先把其他的loss设为0?之训练一个也得不出正儿八经的框啊?
或许可以将其他项的元素都是用真实值表示,然后不计算其他项的loss,这样就能看到3D框和单独训练的项之间的关系了
Allocentric Regression and Egocentric Lifting
[ 3d bounding box estimation using deep learning and geometry ] 2017
[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
还真就脱不开这个3Dbbox了
这两个强调非自我中心的pose,特别对于大的视野场景。
以自我为中心的角度会一直变,而非自我为中心的一直侧面对着摄像机
因为RoI没有全局信息,所以作者也以非自我为中心
所以以什么为中心是由全局信息决定的吗,为什么全局信息有利于自我中心的旋转预测?
难道是因为我们看到的就是非自我中心旋转的视图?即使是笔直前行的车,在我们的视角看了也是有yaw偏移的
所以在回归的时候,用的是非自我为中心的,然后通过推理转换来修正,以此来建立自我为中心的3Dbox
神奇的操作,所以非自我为中心的优势是什么按难道因为是相机的原因?在外观图中,是带着摄像机的角度的,更能显示非自我为中心的角度?
像这样?
后期的推理操作也不知道啊
物体形状学习与检索
大头来了,最想知道的
Learning of a Smooth Shape Space
给定50个商业的汽车的可获得的CAD模型,创造了大小为的投影截断的符号距离字段(TSDF)。
初始化使用PCA来学习低维形状,就像这个[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
对,就是这个,之前在想有没有公共一些的特征,其实就是要用PCA来做,可惜脑子里没这个东西,不够理解
在实验过程中,发现形状空间迅速的偏离均值,导致退化的mesh
使用PCA来生成合适的外观要求根据每一维的标准差来评估每个维度,为了避免这个操作,训练了一个自动编码的3D卷积来提到,由编码器和解码器组成,还强加了不同的约束在输出TSDF上。
对都使用了filter大小是的四个卷积核。
然后用了六个全连接层来表示 潜在的空间
这个潜在的空间就是车的外观吧
所以就是用处理PCA提取的特征?然后加上约束,再用全连接
约束是什么呢?外观相关的东西?
训练的时候,进一步映射在单位超球面上的所有潜在表示,以确保嵌入的平稳性。
就是说本来是个球,然后多个潜在表示让球在不同的部位突出,最后变成车的形状
对于那些跳跃大的输出,就惩罚,就是设置大loss的意思,这样能
将CAD模型分成了’Small Car’, ’Car’, ’Large Car’ or ’SUV’
然后计算每个类别和所有汽车的中位形状,使用[ Endre Weiszfeld. Sur le point pour lequel la somme des distances de n points donnes est minimum ]算法
真好,这个中位我也想了,就是操作不出来,不知道如何去做
上图中下面那行是结果,能平滑的插入,作者观察到,可以安全地遍历嵌入上的所有中间点,而没有退化的形状,并发现一个六维的潜在空间是平滑性和细节之间的一个很好的折衷。
至此,知道了学习参数,来代表潜在表示,然后改变超球面,获得模型
Ground truth shape annotation
通过中心差异来避免梯度近似,像[ 3d-rcnn: Instance-level 3d object reconstruction via render-andcompare ] 2018
就是外形比较像, 导致loss也差不多???
使用贪婪搜索从每个中位数初始化?从LIDAR和分割[ mask RCNN ]寻找最小化投影矛盾
这个初始化搞不懂,不知道要做啥
对于3D lifter 形状分支,测量和预测的形状和真实形状之间的相似性,作为在超平面上的两个点之间的角度???
各自球面上的点之间的夹角,用表示,这样计算之间的loss,就能算出差异了?应该是这回事
在推理的时候预测低维的latent向量(这个要作用在超球面上),然后把向量放到 decoder 中获得TSDF表达。
[ Marching cubes: A high resolution 3d surface construction algorithm ] 1987 ACM >??????????????????????????????????????????????????????????
可以利用 marching cube 从TSDF来计算3D mesh
我服了
mesh就是三角形网布模型,之前的汽车就是。
这快看不懂也不知道怎么做,来个源码救救我吧
Simple mesh texturing
作者的方法是计算绝对的scale和6D pose,所以作者生成复原的3Dmesh的纹理的投影
所以,作者投影那些在图像平面上指向摄像机的向量,并且分配对应的像素值,然后沿着完成的对称轴来反射颜色。
不知道讲的啥
是说生成的数据都是侧面指向摄像机的?
看下面的合成图,阴影是怎么搞的?也太真实了吧
这个为下面的数据增强提供了mesh
合成3D数据增强
使用人工合成的数据可能会因为域差距的变大而性能显著下降。
是说和真实数据的分布不同吗
KITTI3D只有7k张图,很容易过拟合
[ Augmented reality meets computer vision: Efficient data generation for urban driving scenes ] 包括通过将物体的三维合成效果图嵌入到真实世界的图像背景中来扩展数据集(consists in extending the dataset by inpainting 3D synthetic renderings of objects onto real-world image backgrounds)。
受这个启发,作者利用之前提取的mesh来生成真实的render。这样也不用只使用小的CAD模型了,而且作者没有使用强大的手动和地图先验来在场景中防止合成物体;相反,作者使用非自我为中心的pose来移动3D中的物体,这样也不用改变视角了。
使用了一些3D的旋转扰动来生成新的看不见的pose,还能减少过拟合
所以作者使用自己生成的mesh,投影到平面中
训练
网络结构
两阶段,类似Faster RCNN,先生成2D区域推荐,然后对每个区域预测
第一阶段是RetinaNet,使用带有FPN的ResNet-34,使用的focal loss
对于每个推荐的2D区域,使用ROIAlign来提取局部特征
直接从单目数据预测3D信息,尤其是绝对位移,是不合适的,由于尺度和重投影的模糊性,缺少上下文加剧了这种情况,利用深度信息可以克服这种模棱两可性,使用几何约束[ Unsupervised cnn for single view depth estimation:Geometry to the rescue ] 2016
提取一些边缘也能做优化手段?
还是想看看之前那个SLAM分割的
使用深度估计的sota[ Self-supervised, super-resolved monocular depth estimation ] 2018 来生成深度图,用这些深度图来支持距离推理
还想在深度图里包含对应的区域,加了个2D坐标映射[ An intriguing failing of convolutional neural networks and the coordconv solution ] 2018
然后传递所有的信息到融合模组,对每个输入的模型做两个带有GN的卷积
然后连接所有特征,使用ROIAlign然后放到不同的分支来预测R,T,绝对范围,外观
参数设置
使用的SGD
batch size是8
学习率是0.001
总计200K次迭代,再120k和180k的时候除10
数据增强
做了缩放抖动和水平反转来做数据增强
从训练序列中提取了共计140个mesh,使用相对的的真实pose来提取纹理
这个咋做?如和考虑到真实的光照和阴影问题?
在每个输入中加三个不同的车,通过随机发射三条射线,然后车子在射线上位移来完成。
使用原始的非中心旋转来避免纹理的伪影,然而,为了总是产生新的看不见的6D姿态,将旋转的角度设置为10度
这个纹理伪影是啥
在附录中展示了量化结果
实验
测试的时候,把短边resize成600,然后做2D检测,再RoI-lifting之前做0.65的NMS过滤
然后,得出的3D框用很严格的俯瞰图,用0.05的NMS过滤
只要有0.05的交际就过滤掉
估计
在俯视图和全部的3D框上都算了AP
[ Multi-level fusion based 3d object detection from monocular images ] 2018
这个好像很不错
2D检测AP不高,但是俯视图和3DAP很高,作者说适当的数据分析对抵消过拟合很有用
怎么分析?
好像是数据增强那里也针对了下,而且还分析了不同旋转角度的分布
[ Multi-level fusion based 3d object detection from monocular images ] 2018
这个在KITTI3D和Cityscapes都做了深度模型的训练,作者只在KITTI上做了预训练。。。。。。。。。。。。。。。。。。
但是这样以后,性能从验证集到测试集降了不少(from 22.03% to 13.73% or 10.53% to 7.08%),这表明要积极地调整验证集,使其符合已知的ground truth.
2D 检测的性能很影响后面的位姿估计
这进一步加强了我们的情况,因为如果我们用2D AP归一化来纠正我们的姿态度量数,那么我们的姿态度量数将会更高
太顶了,这篇论文好多搞不懂的东西
消融实验
作者还分析了现在为什么预测不好
分析这个方法对于不同的输入,还有这个loss能多好的影响位姿的质量
Lifting Loss:
隔离一个带有真实Roi 和3D box的实例,然后只根据这个优化,随机初始化参数,然后逐步提高和之间的对齐
三幅图分别代表什么呢?三个不同元素?
搞错了,这里不是loss,是梯度的大小,梯度越大说明越关注
作者还参考了补充材料,补充材料在哪找呢
每个都独立初始化,最后也能收敛到全局最小
还展示了下式的的雅可比
可以看到loss很关注深度,然后对旋转和2D形心位置的重要性稳步增加。
尺度的回归修复了平均车size的偏差问题,再优化的时候忽略了,因为误差已经很小了。
在优化过程中不需要手动执行任何主方向,也不需要缩放大小,损失就可以很好地控制每个组件的影响。
就是说不用控制各种比例咯,直接就能表现和好
Pose Recall vs. Training Data:
为了更好的理解优势和弱点,下图展示了深度和旋转的不同bin再 train/val 分割上的表现[ Monocular 3d object detection for autonomous driving ] 2016
好好学操作,分割数据集的时候一直在提这个论文
算了不同角度的召回率,这怎么做的?假定预测了a角度,然后真实的是b角度,就是该是b的时候,有多少次是b?
如果俯视图的IoU大于0.5,就认为是正确
作者的坐标系和KITTI一样,角度为0意味着物体朝向右(就是非自我中心了)。
由于数据集数量较小,所以画了训练数据的分布,来看采样频率和位姿的质量的关系。
如果数据量小,就可能训练的不够,那样看看每个分布的质量,也合理;如果数据集很大的话,是不是就不用了?感觉也要看看吧,这样的话能知道网络的能力
对于位移,并没有调查出现数量和结果的关系,通常更近的更好定位,因为距离的很难估计,所以网络也很依赖深度图来估计距离。
在看不清楚的物体那里,效果还是不好
Loss and input data:
还是那个论文里的权重分配策略和输入修改
前两行是每个元素独立回归,没有使用lift loss
要怎么个独立回归呢?训练的时候咋训练啊
第一行是对所有的统一权重,就想41 [ Multi-level fusion based 3d object detection from monocular images ] 2018
然后第二行多任务是参考的[ Multi-task learning using uncertainty to weigh losses for scene geometry and semantics ] 2018
这下Multi mask 的权重分配也有专业的论文看了
但是加权后并没有看到提升,哈哈哈哈
作者认为每一项的大小根本没法比较
除了数值大小之外,任何关于实际3D实例的不知情加权都无法恰当地评估相对重要性,就像将苹果与橘子进行比较
类都不一样,瞎平衡loss是没有意义的,除非真的能量化每项对网络的影响
但是,万一某个项对网络的影响很大呢,结果导致只要这一项优化的好了,其他项优化的不好也没关系,总loss掉了就行,这样的话还是要人工限制一下,把这个超级项的影响变小
就是像作者说的,各项都完全不同,那么对网路的反向传播作用效果也必然是不同的,让他们平等的运行我感觉还是有点问题
不对,作者的loss计算不一样,作者是将所有的项合称为一个最终结果,然后计算最终结果的偏差,这样根据链式法则,就知道各项应有的系数了,就不用自己去设置系数了
第四行就没有做加权操作,所有指标都是最好的
我感觉可能是巧合?除非loss函数设置的刚好
没有深度图的鸟瞰图和3DAP也不算太差
合成的数据效果很好,这个合成数据还解决了旋转的采样不平衡问题
哇,原来合成数据还能齐到这样的效果
以后做事要想想,能有那些好处,还能不能顺手再多一些好处
作者还发现,他的数据增强都是无遮挡的,这无意中引入了新的偏差,即对遮挡的物体的检测不友好
那就再来个遮挡的数据增强被,这样还能用来做遮挡分割,就用mask来做,用mask来做遮挡,我真是个小天才!
代码
没开源,github上也没人实现,而且文中提供的信息也不够复现啊
求大佬指点一下,带带我
物体形状探索和数据增强那块整不明白
来源:CSDN
作者:KirutoCode
链接:https://blog.csdn.net/McEason/article/details/104261376