YOLO3D 基于图像的3D目标检测算法

2023-05-16

参考文档:https://ruhyadi.github.io/project/computer-vision/yolo3d/
代码:https://github.com/ruhyadi/yolo3d-lightning

本次分享将会从以下四个方面展开:

物体检测模型中的算法选择
单目摄像头下的物体检测神经网络
训练预测参数的设计
模型训练与距离测算

1.物体检测模型中的算法选择

在这里插入图片描述
物体检测(Object Detection)是无人车感知的核心问题,要求我们对不同的传感器(如图中覆盖不同观测范围FOV的无人车传感器)设计不同的算法,去准确检测出障碍物。例如在Apollo中,为3D点云而设计的的CNN-SEG深度学习算法,为2D图像而设计的YOLO-3D深度学习算法等。

物体检测要求实时准确的完成单帧的障碍物检测,并借助传感器内外参标定转换矩阵,将检测结果映射到统一的车身坐标系或世界坐标系中。准确率、召回率、算法时耗是物体检测的重要指标。本次分享只覆盖Apollo中基于单目摄像头的物体检测模块。

2.单目摄像头下的物体检测网络

在这里插入图片描述
Apollo 2.5和3.0中,我们基于YOLO V2设计了单目摄像头下的物体检测神经网络, 我们简称它 Multi task YOLO-3D, 因为它最终输出单目摄像头3D障碍物检测和2D图像分割所需的全部信息。

它和原始的YOLO V2有以下几种不同:

1.实现多任务输出:

物体体检测: 包括2D框(以像素为单位),3D真实物体尺寸(以米为单位),障碍物类别和障碍物相对偏转角(Alpha Angle,和KITTI数据集定义一致)。下文会详细讲解各个输出的意义。
物体分割:车道线信息,并提供给定位模块,这里不做叙述。
在这里插入图片描述

2.特征描述模块引入了类似FPN的Encoder和Decoder设计:

在原始Darknet基础上中,加入了更深的卷积层(Feature Map Size更小)同时添加反卷积层,捕捉更丰富图像上下文信息(Context Information)。高分辨率多通道特征图,捕捉图像细节(例如Edge,Corner),深层低分辨率多通道特征图,编码更多图像上下文信息。和FPN类似的飞线连接,更好的融合了图像的细节和整体信息。

3.降低每层卷积核数目,加快运算速度。例如我们发现卷积核数目减半,实验中准确率基本不变

在这里插入图片描述
如前文所述,物体检测最终输出包括2D框(以像素为单位),3D真实物体尺寸(以米为单位),障碍物类别和障碍物相对偏转角(Alpha Angle,和KITTI数据集定义一致)等信息。

和YOLO V2算法一样, 我们在标注样本集中通过聚类,产生一定数目的“锚”模板,去描述不同类别、不同朝向、不同大小的障碍物。例如对小轿车和大货车,我们会定义不同的锚模板,去描述它们的实际物理尺寸。
在这里插入图片描述
为什么我们要去训练、预测这些参数呢?我们以相机成像的原理来解释:针孔相机(Pinhole Camera)通过投影变换,可以将三维Camera坐标转换为二维的图像坐标。这个变换矩阵解释相机的内在属性,称为相机内参(Camera Intrinsic) K。

对任意一个相机坐标系下的障碍物的3D框,我们可以用它的中心点 T = {X, Y, Z},长宽高 D = {L, W, H},以及各个坐标轴方向上的旋转角 R = {ϕ, φ , θ}来描述。这种9维的参数描述和3D框8点的描述是等价的,而且不需要冗余的8*3个坐标参数来表示。

因此,对一个相机坐标系下3D障碍物,我们通过相机内参,可以投射到2D图像上,得到2D框[c_x, c_y, h, w]。从图中可以看到,一个障碍物在相机下总共有9维3D描述和4维2D描述,他们之间通过相机内参矩阵联系起来。
在这里插入图片描述
然而,只通过2D框[c_x, c_y, h, w],是没有办法还原成完整的3D障碍物信息。

3.训练预测参数的设计

而通过神经网络直接预测3D障碍物的9维参数,也会比较困难,尤其是预测障碍物3D中心点坐标。所以我们要根据几何学来设计我们到底要训练预测哪些参数。
在这里插入图片描述
首先利用地面平行假设,我们可以降低所需要预测的3D参数。

例如:(1)我们假设3D障碍物只沿着垂直地面的坐标轴有旋转,而另外两个方向并未出现旋转,也就是只有yaw偏移角,剩下的Pitch Roll均为0。(2)障碍物中心高度和相机高度相当,所以可以简化认为障碍物的Z=0。

从右图可以看到,我们现在只有6维3D信息需要预测,但还是没有办法避免预测中心点坐标X和Y分量。
在这里插入图片描述
第二,我们可以利用成熟的2D障碍物检测算法,准确预测出图像上2D障碍物框(以像素为单位)。

第三,对3D障碍物里的6维描述,我们可以选择训练神经网络来预测方差较小的参数,例如障碍物的真实物理大小,因为一般同一类别的障碍物的物理大小不会出现量级上的偏差(车辆的高度一般在2-5米之间,很少会出现大幅变化)。而yaw 转角也比较容易预测,跟障碍物在图像中的位置关系不大,适合通用物体检测框架来训练和预测。实验中也多次证明此项。

所以现在我们唯一没有训练和预测的参数就是障碍物中心点相对相机坐标系的偏移量X分量和Y分量。需要注意的是障碍物离相机的物理距离Distance=sqrt(X^2 + Y^2)。所以得到X和Y,我们自然就可以得到障碍物离相机的真实距离,这是单目测距的最终要求之一。

综上,我们可以合理的推断出, 实现单目摄像头的3D障碍物检测需要两部分:

训练网络,并预测出大部分参数:
(1)图像上2D障碍物框预测,因为有对应的大量成熟算法文献;

(2)障碍物物理尺寸,因为同类别内方差较小;

(3)不被障碍物在图像上位置所影响,并且通过图像特征(Appearance Feature)可以很好解释的障碍物yaw偏转角。

通过图像几何学,来计算出障碍物中心点相对相机坐标系的偏移量X分量和Y分量。

4.距离测算

在这里插入图片描述
当我们训练好相应的神经网络,输出我们需要的各个参数之后,我们需要考虑的是如何计算出障碍物离摄像头的距离。根据之前介绍,通过内参和几何学关系,我们可以链接起图像中3D障碍物大小(单位为像素)和真实3D坐标系下障碍物大小(单位为米)。

Apollo这个课件里面介绍的是建立了一个哈希表,通过障碍物大小、朝向来查询距离,但是我在Apollo源码里面没有看到相关代码,代码里面是通过上图公式来计算出Z这个维度,然后根据相机内参,将障碍物2DBox中心点,投影到相机坐标系中,得到相机坐标系下的X,Y坐标,进而得到障碍物的距离D,在进入具体实践之前,还要对图4网络预测的Yaw角度alpha进行一个细致分析。

5.网络预测参数Yaw

Apollo网络训练严格遵循了kitti数据集格式,可以在kitti数据集.md文档中查阅数据格式,这里具体对其角度alpha进行解析

从上面分析可知,

对任意一个相机坐标系下的障碍物的3D框,我们可以用它的中心点 T = {X, Y, Z},长宽高 D = {L, W, H},以及各个坐标轴方向上的旋转角 R = {ϕ, φ , θ}来描述。

而我们通过问题的简化,只需要去预测与地面垂直的坐标轴旋转角(Kitti是Y轴),所以就有了下图
在这里插入图片描述
上图中,有三个角度需要特别说明:

alpha:即为模型预测输出,其表示含义为在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,即此时物体方向与相机x轴的夹角
theta:绕Y轴旋转的角度,具体含义为以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴
r_y:障碍物当前时刻朝向与相机坐标系X轴形成的夹角
**在这个旋转过程中,将车辆看成一个刚体,旋转半径(车辆中心点与相机中心点组成的连线)与车辆前进方向组成的夹角在旋转前后是保持不变的,**根据这一个关系,可以得到如下表达式
在这里插入图片描述

YOLO3D 原理参考:
3D Bounding Box Estimation Using Deep Learning and Geometry (Deep3DBox) 论文详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLO3D 基于图像的3D目标检测算法 的相关文章

  • Ubuntu18.04安装cuda10.0

    一 xff1a 安装前的准备 xff08 1 xff09 安装一定要查看CUDA要求的linux下的Driver Version 链接网址如下 xff1a https docs nvidia com cuda cuda toolkit re
  • 完美解决Windows用户下lumerical(FDTD)的python库lumopt安装方法

    参考链接 xff1a lumerical配合pycharm使用python联合开发的问题 FDTD的python接口使用 github lumopt 个人所写相关博客园链接 xff08 如果想要了解更多关于python xff0c anac
  • RUST 笔记(一)

    记录在学习的过程中rust语言和java js相似的地方 以及rust的特性 引用外部包 xff1a extern crate rand crate 代表依赖 xff0c rand 是依赖名称引用内部默认包 xff1a use std io
  • 机器学习期末考试满分试卷答案

    黄海广老师 机器学习 机器学习期末考试 得分 xff1a 100分 欢迎讨论评论 1 单选 2分 一监狱人脸识别准入系统用来识别待进入人员的身份 xff0c 此系统一共包括识别4种不同的人员 xff1a 狱警 xff0c 小偷 xff0c
  • 进化算法之粒子群算法和Matlab实现(多维)

    转自 xff1a https blog csdn net DBLLLLLLLL article details 82965722 粒子群算法进阶讲解传送门 xff1a https blog csdn net DBLLLLLLLL artic
  • matlab中ln、lg函数怎么表示

    我们首先需要知道在matlab中Ln x 表示成了log x xff0c lg x 表示成log10 x xff0c 如下图所示 xff1a 我们可以在matlab命令行窗口中输入 help log xff0c 可以看到关于log函数的介绍
  • MATLAB 中 if 语句中如何表示并列条件

    matlab中的条件 amp amp 表示 and 表示 or至于一个 amp 和 是逻辑操作运算 别搞混了 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • tensorflow中使用Adam出现name ‘Adam‘ is not defined【转】

    转自Colab中使用Adam出现name Adam is not defined 错误场景 在本地运行正常 xff0c 之前在tensorflow上运行也正常 xff1b 之后重新运行colab上的代码 xff0c 出现如下错误 xff1a
  • Linux 安装 miniconda

    1 安装miniconda 1 百度输入miniconda 找到miniconda 如下图第一个链接 2 找到linux版本的miniconda 此处我要安装Python3 7版本的Linux下的miniconda 3 复制下载链接 如下
  • Linux将一个文件夹或文件夹下的所有内容复制或移动到另一个文件夹

    1 将一个文件夹下的所有内容复制到另一个文件夹下 cp r home packageA home cp packageB 或 cp r home packageA home cp packageB 这两种方法效果是一样的 方法示例 xff1
  • 算法网址

    九章算法 xff1a https www jiuzhang com Lintcode xff1a https www lintcode com Leetcode xff1a https leetcode com CodeTop xff1a
  • Datawhale跟李沐大神合作举办 (动手学深度学习) !

    三月的组队学习跟李沐大神合作举办 动手学深度学习 xff0c 欢迎感兴趣的小伙伴报名学习 xff0c 另外 xff0c 欢迎志同道合的小伙伴了解 加入Datawhale 跟李沐导师 xff1a 动手学深度学习 xff01 动手学深度学习 P
  • 期刊会议名缩写查询-1

    投往IEEE transactions的论文 xff0c 其中的参考文献格式都是采用会议期刊的缩写 本博客特此记录如何查询期刊和会议名的缩写问题 期刊名缩写 SCI论文的参考文献很多期刊名都是缩写 xff0c 如下图所示 在写论文时 xff
  • Linux从用户层到内核层系列 - GNU系列之你所不知道的printf

    题记 xff1a 本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码 xff0c byhankswang和你一起玩转linux开发 轻松搞定TCP IP协议栈 xff0c 原创文章欢迎交流 byhankswang
  • 第十一届蓝桥杯python组第二场省赛-排序

    1 问题描述 xff1a 小蓝最近学习了一些排序算法 xff0c 其中冒泡排序让他印象深刻 在冒泡排序中 xff0c 每次只能交换相邻的两个元素 小蓝发现 xff0c 如果对一个字符串中的字符排序 xff0c 只允许交换相邻的两个字符 xf
  • 4306 序列处理(贪心)

    1 问题描述 xff1a 给定一个长度为 n 的整数序列 a1 xff0c a2 xff0c xff0c an 我们可以对该序列进行修改操作 xff0c 每次操作选中其中一个元素 xff0c 并使其增加 1 现在 xff0c 请你计算要使得
  • python数据分析基础-datafrom基础属性

    linux 43 pycharm 43 anaconda span class token keyword import span pandas span class token keyword as span pd data1 span
  • python数据分析基础-series基本统计运算,数据运算和比较运算

    linux 43 pycharm 43 anaconda 96 span class token comment 两个series数据运算 43 span num span class token operator 61 span pd s
  • python数据分析-柱状图绘制及常用参数设置

    linux 43 pycharm 43 anaconda span class token comment 柱形图绘制与参数设置 span span class token comment plt bar x height width bo
  • 爬取西窗烛app

    本文旨在学习 xff0c 不可做商业用途 span class token keyword import span csv span class token keyword import span json span class token

随机推荐

  • 爬取百度地图店家信息

    本文旨在交流学习 xff0c 勿作他用 xff0c 否则后果自负 span class token keyword import span json span class token keyword import span csv span
  • 爬取蝉妈妈数据平台商品数据

    本文旨在交流学习 xff0c 勿作他用 xff0c 否则后果自负 环境 linux 43 pycharm 43 anaconda span class token keyword import span json span class to
  • selenium+webdriver+chrome实现百度以图搜图

    1 环境搭建 1 webdriver 43 chrome的版本需匹配 2 打开chrome 输入 chrome version 来查看chrome版本 访问此网站 谷歌浏览器驱动 然后选择合适版本webdriver 2 收集原始图片和构建图
  • 无聊之重学c/c++

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Python配置Pip国内源

    临时指定下载源 以阿里云的镜像为例 pip install trusted host https mirrors aliyun com i https mirrors aliyun com pypi simple lt some packa
  • 爬虫效率提升方法

    协程 xff1a 在函数 特殊函数 定义的时候 使用async修饰 函数调用后 内部语句不会立即执行 而是会返回一个协程对象 任务对象 xff1a 任务对象 61 高级的协程对象 进一步封装 61 特殊的函数 xff0c 任务对象必须要注册
  • selenium JD爬虫

    python3 7 43 win10 span class token comment coding utf 8 span span class token comment 64 Time 2022 6 27 16 55 span span
  • 树莓派4b学习笔记三:三行命令极简安装vscode

    很多写代码的软件在树莓派上都不能用 xff0c 或者安装比较麻烦 恰巧 xff0c vscode作为一款轻量级代码编辑器 xff0c 可以在树莓上使用 xff0c 而且它通过简单的安装插件就可以支持很多种编程语言 我在网上搜了很多关于在树莓
  • you-get详细配置教程

    一 you get介绍 you get是一款能够直接从网页上下载视频 音乐 图片的命令行多媒体下载器 xff0c 它支持80多个网站 xff0c 包括某酷 某奇艺 某讯 Bzhan YouTube等 xff0c 具体说明及支持网站可点击下方
  • hyper-v虚拟机上的ubuntu 18.04 LTS通过xrdp传递声音遇到的一些坑

    背景 xff1a Windows10 pro上hyper v自带的ubuntu 18 04 LTS 在使用虚拟机时发现没有声音 xff0c 通过这篇博客Linux xrdp远程桌面连接声音重定向来到 pulseaudio module xr
  • 深入理解卡尔曼滤波算法

    最近做卡尔曼滤波跟踪的项目 xff0c 看原理花了一天 xff0c 再网上查找并看懂别人的kalman c 43 43 代码花了我近三天的时间 卡尔曼滤波就是纸老虎 xff0c 核心原理不难 xff0c 核心公式就5个 xff0c 2个状态
  • no module named ‘apex‘ 的解决方案

    背景 xff1a 部署fast reid工程环境的时候报出ModuleNotFoundError No module named 39 apex 的错误 纯粹记录一下 no module named apex 的解决方案 xff1a 1 官
  • C++ 中字符串查找、字符串截取、字符串替换

    1 字符串查找 s span class token punctuation span span class token function find span span class token punctuation span s1 spa
  • Jetson AGX Xavier 刷机指南

    目录 一 刷机准备 二 JetPack4 5刷机过程 三 安装Cudnn 四 开启高性能模式 五 打开风扇 六 上电自启 七 设置开机自启动 一 刷机准备 在刷机之前 xff0c 需要准备一台装有Ubuntu系统的宿主电脑 将 Xavier
  • Shp2osm:shp转换为osm格式文件

    概述 背景 因为opendrive是自动驾驶使用的较多的数据格式 xff0c 想把地图数据shp格式转换成opendrive格式的 xff0c 但是网上没有现成的转换脚本 xff0c 所以打算先从shp格式转到osm格式 xff0c 再从o
  • Linux笔记之Docker安装,基于Debian 11(bullseye)

    前置条件 Debian平台版本为 Debian 11 xff08 bullseye xff09 安装的是Docker Community Edition xff08 docker ce xff09 安装步骤 1 重新安装卸载旧版 xff0c
  • 3D点云目标检测算法综述

    一 概述 在3D点云目标检测领域 xff0c 对于数据输入的处理一般有三种 xff1a 多视角 将三维点云投射到多个二维平面形成图像 体素 xff0c voxel xff0c 将三维点云切割成多个小块 xff0c 这些小块就叫体素 xff0
  • 稀疏卷积 Sparse Convolution Net

    概述 这是一篇对稀疏卷积讲述非常全面的文章 xff0c 理解起来毫不费事 这里要和SPConv相区别 xff0c 这是两个完全不同的东西 SPConv是为了解决普通3 3卷积算子参数冗余而设计的 xff0c 一种 即插即用 计算单元 xff
  • TensorRT快速上手指南

    前言 xff1a 最近一段时间接触了TensorRT xff0c 因此顺带整理了一份TensorRT中一些常用关键组件的笔记 xff0c 以方便未来能够快速查阅和上手 需要注意的是本文只是一些常用特性与关键组件的梳理 xff0c 而不是一个
  • YOLO3D 基于图像的3D目标检测算法

    参考文档 xff1a https ruhyadi github io project computer vision yolo3d 代码 xff1a https github com ruhyadi yolo3d lightning 本次分