热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yolomask的损失函数l包含三部分_Deep3Dbox复现笔记【附部分code】

好久没写文章了,假期特供~~如果你也关注自动驾驶的3dbox感知,题图一定很熟悉了,最近笔者就尝试复现了一下这篇经典的paperÿ
371b366b138ccd137fc26a1a04216d55.png

好久没写文章了,假期特供~~

如果你也关注自动驾驶的3d box感知,题图一定很熟悉了,最近笔者就尝试复现了一下这篇经典的paper,貌似百度Apollo的感知模块也包含了它----3D Bounding Box Estimation Using Deep Learning and Geometry。

一、文章思路与关键点分析

文章中的网络实现了从单目图像预测目标物体3D位置、大小以及朝向的功能。整个算法框架分为三个部分:2D图像目标检测网络+目标大小姿态估计网络+目标3D中心点解算模块

2D图像目标检测网络可以用经典的Faster RCNN、SSD以及YOLO系列,文中采用的是MS-CNN。获得目标的2D框之后,将它截取出来,把这些小框resize到一定大小,送进VGG网络来回归3D包围框的长L宽W高H以及朝向alpha。目标3D中心点解算模块就是用预测的HWL以及角度来计算3D包围框中心点的三维坐标(相机坐标系)。

后来许多工作都把第一二部分结合在一起,在目标检测网络后面直接加了大小和朝向的回归分支,所以整体框架又可以理解为:2D图像目标检测以及大小姿态估计网络+目标3D中心点解算模块。复现过程中我也是沿着这个思路,前面采用的是SSD+FPN,后面的解算就是利用几何投影的关系来求解一个最小二乘方程组。

(1)2D图像目标检测以及大小姿态估计网络

这部分相对简单,就是在网上找个目标检测网络源码,在后面加回归分支就好了。同时在数据输入模块加上导入目标大小、朝向lable的代码。

这里需要注意一下,朝向用kitti数据集label格式里的第4个参数来表示,即alpha,不要用最后的角度参数r_y(关于这些角度的定义,大家自行查一下吧)。因为alpha与观察者的视角有关,而r_y木有,下图中车的r_y基本是相同的,但随着观察者的相对位置变化,alpha是变的,对应图像中看到车的不同“样子”,即不同特征,所以用alpha角才合理。我在复现过程中由于不仔细,一开始就直接回归r_y,效果非常差。

f27fd53704143f68bd5e5c63fc6a12b6.png

还有一个注意点就是,加回归角度的分支时,实际是回归角度的正弦值以及余弦值,不要忘了在fc层后加上L2 norm,因为这样才归一化到三角函数的值域范围。

(2)目标3D中心点解算模块

首先,求解中心点模块需要用到前面预测的H、W、L,还需要KITTI label里最后那个角度r_y。然而,我们刚才明明预测的是alpha呀,肿么办呢,木事木事,两者可以转化呀。怎么转呢,来,放个链接讲得很清楚。

https://blog.csdn.net/cuichuanchen3307/article/details/80596689

终于一切准备好,可以开始推导了~

已知相机内参矩阵

,从目标坐标系(三维框中心为原点,向前为z轴正方向,向右是x轴正方向,向下为y轴正方向)转到相机系(与KITTI的定义一样,向前为z轴正方向,向右是x轴正方向,向下为y轴正方向)的旋转矩阵为
,目标系原点在相机系中的坐标为
,则目标三维框的8个顶点可以用下面的公式转化为平面的图像坐标:

其中,[X,Y,Z]为目标系中三维框顶点坐标,[x,y]为投影到图像坐标系的坐标,

为归一化因子。

把上面公式的右边换一个写法:

注意R可以用r_y角求得,[X,Y,Z]可以直接根据预测的H、W、L写出来,而[x,y]是由2D目标检测网络检测得到的2维框顶点坐标,所以这里未知数是[Tx,Ty,Tz]。

为方便推导,上面又可以写为:

展开后有:

论文中假设三维框的顶点投影到图上应该包含在图像目标2维框内,故8个点投影出的x的最小值应该等于2D框的最小的x,即左上点的x坐标;8个点投影出的y的最小值应该等于2D框的最小的y,即左上点的y坐标;8个点投影出的x的最大值应该等于2D框的最大的x,即右下点的x坐标;8个点投影出的y的最大值应该等于2D框的最大的y,即右下点的y坐标。故,共有4个方程,求解用最小二乘即可。

二、一些思考

复现出来的指标与论文的差不多。在评价3d框时,用了平均3D iou,我的结果大概是0.3。但是私以为平均3d iou还是不太能说明情况的,看了一下3d iou的AP,相当低,只有个位数。。存在某些框严重偏离真实目标的三维位置。

我认为这里有两个原因,首先,是一些目标如汽车,当它有一部分出现在图像内一部分出现在图像外时,3D框是不准的,因为在求解三维位置时,假设了2D框的中心是3D框中心的投影。其次,与2D目标检测器的位置回归精度也有关系。

三、代码

这里就不放全部代码了,因为实在写得比较乱懒得整理。2D检测部分我用的是pytorch版本的SSD来修改的,链接如下。

https://github.com/amdegroot/ssd.pytorch​github.com

求解三维位置坐标的代码貌似网上木有或者有但我还木有发现...所以放一下我自己的供参考参考。

LZJ-Roger/Deep3Dbox-solve_T-part-​github.com
2ef994fc245d4caa8d6b9a6598e0be79.png

The End.

假期宅家码字 甚是无聊 快给个赞与收藏让我高兴高兴 [手动比心]~



推荐阅读
author-avatar
飘飘秀秀真人_562
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有