• [Mono Depth/3DOD]单目3D检测基础


    1. 数据增强

    • 图像放缩和裁剪后,相机内参要做相应变化
    import random
    def random_scale(image, calib, scale_range=(0.8, 1.2)):
        scale = random.uniform(*scale_range)
    
        width, height = image.size
        image = image.resize((int(width * scale), int(height * scale)))
    
        calib[:2, :] *= scale
        return image, calib
    
    
    def random_crop(image, left, w_out, upper, h_out, calib):
        right = left + w_out
        lower = upper + h_out
        image = image.crop((left, upper, right, lower))
    
        calib[0, 2] -= left  # cx - du
        calib[1, 2] -= upper # cy - dv
        calib[0, 3] -= left * calib[2, 3] # tx - du * tz 
        calib[1, 3] -= upper * calib[2, 3] # ty - dv * tz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2. 数据集

    2.1. KITTI

    在这里插入图片描述
    - Rotation_y(全局航向角 - 车头方向与相机的x轴正方向的夹角
    - 描述目标在现实世界中的朝向,不随目标的位置和采集车的位置变化而变化
    - theta:目标方位角
    - Alpha:目标观测角,Alpha = theta + Rotation_y

    在这里插入图片描述

    • 单目3D学习alpha角,因为alpha是跟图像特征相关的

    3. 单目3D检测任务问题总结

    • 单目3D模型对相机的内外参变换敏感
    • 对遮挡和截断目标的检测性能下降明显
    • 对远距离的小目标性能下降严重(KITTI数据集,把超过46m的物体过滤)
    • 2D检测框和3D检测框在2D图像上的投影不完全重合(传感器的时间同步问题,相机频率(20HZ)快于lidar频率(10HZ))
    • 航向角预测不达标
    • 无时序约束,3D检测结果抖动明显

    单目3D检测的难点:

    • 输入信息(2维)维度少于输出信息(3D)的维度
      • 2D检测:输入输出都是2D
      • 雷达检测:输入输出都是3D
    • 输入的信息熵小于输出的信息熵
    • 单目图像缺少深度信息

    在这里插入图片描述

    上图来自论文:https://openreview.net/pdf?id=mPlm356yMIPICLR 2022

    • 现有3D检测方法的深度误差下限跟理论下限对比深度误差随着深度呈指数增长,理论误差与深度呈二次方增长
    • CaDDN和Monodle在40米后呈现指数增长
    • KITTI数据集,40米的深度理论误差是1.48米,60米是3.3

    4. 单目3D检测范式

    在这里插入图片描述

    上图来自论文:3D Object Detection for Autonomous Driving: A Comprehensive Survey

    • Images-only 单目3D检测(绿色)
      • 单阶段anchor-base
      • 单阶段anchor-free
      • 两阶段3D检测
    • Depth-assisted 单目3D检测(深蓝色)
      • Depth-images based mono3D
      • Pseudo-Lidar based mono3D
      • Patch-based mono3D
    • Prior-guide 单目3D检测(蓝色)

    4.1. Images-only 单目3D检测

    在这里插入图片描述

    • 单阶段anchor-base (yolo3D)
      • 利用图像特征和预定义的3D anchor来预测3D box的参数
    • 单阶段anchor-free (centernet, KM3D)
      • 直接利用图像特征来预测3D box的参数
    • 两阶段3D检测
      • 从2D检测生成2D边界框并crop 2D ROI
      • 通过从2D ROI特征预测3D对象参数,将2D检测提升到3D空间

    4.2. Depth-assisted 单目3D检测(引入深度先验)

    在这里插入图片描述
    - Depth-images based mono3D
    - 融合RGB图像和深度图得到depth-aware特征
    - 深度图由预训练的深度预测模型得到
    - Pseudo-Lidar based mono3D
    - 基于伪激光雷达的方法,首先讲深度图转为3D伪激光点云,再用基于激光雷达的3D检测算法进行检测
    - Patch-based mono3D
    - 基于patch的方法,将深度图转化为二维坐标图(2D coordinate map),然后在坐标图上用CNN进行检测

    4.3. Prior-guide 单目3D检测

    在这里插入图片描述

    先验引导方法利用物体形状先验、几何先验、分割和时间约束来帮助检测3D物体
    单目3D检测的先验信息:

    • 先验信息:3D box下底边的中心点在图像的投影点的越靠近消失线,深度越大
    • 物体3D尺寸与2D图像上投影比例关系
    • 场景集合信息(消失点,消失线,车道线,天空)

    3D检测用到的几何信息

    • 相机没有pitch角,车辆没有抖动
    • 地面是平的,地面没有起伏
      注:对于没有深度图预测的3D检测算法,基本是在放宽这两个假设上,通过几何关系求深度
      在这里插入图片描述

    上图来源论文:How do neural networks see depth in single images?

    • h/H = f/Z,得到Z=Hf/h
      • f:相机的焦距
      • Z:深度
      • H:实际世界中的车宽
      • h:物体在图像中的像素高度
    • y/Y:f/Z
      • y:相机距离地面的安装高度
      • Y:图像中车轮与地面接触点的纵坐标
      • 直观上理解,离我们越近的物体它的纵坐标应该越靠近图像下方,越远的物体越靠图像上方
  • 相关阅读:
    室内ROS机器人导航调试记录(膨胀半径的选取经验)
    Python循环语句(一)
    【操作与配置】WSL配置LINUX
    使用果创云API低代码,快速收集vue的前端报错
    SQL Server底层架构技术对比
    阿基米德优化算法AOA附Matlab代码
    Python每日一练-DAY01
    系统架构设计之微内核架构(Microkernel Architecture)
    day01(Flume)
    多线程应用——单例模式
  • 原文地址:https://blog.csdn.net/qq_35759272/article/details/133773436