KITTI 数据集简介_kitti数据集介绍-程序员宅基地

技术标签: 3D  计算机视觉  3D视觉  

数据集简介

KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上自动驾驶场景下常用的数据集之一。KITTI数据集的数据采集平台装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线3D激光雷达,4个光学镜头,以及1个GPS导航系统。
官网 国内下载地址1 国内下载地址2
在这里插入图片描述
在这里插入图片描述
为了生成双目立体图像,相同类型的摄像头相距54cm安装。由于彩色摄像机的分辨率和对比度不够好,所以还使用了两个立体灰度摄像机,它和彩色摄像机相距6cm安装。为了方便传感器数据标定,规定坐标系方向如下[2] :
• Camera: x = right, y = down, z = forward
• Velodyne: x = forward, y = left, z = up
• GPS/IMU: x = forward, y = left, z = up

Dataset详解

文件组织形式

在这里插入图片描述

  1. calib:相机标定参数,可根据参数将2D、3D数据坐标进行转换
  2. image2: 左侧彩色相机图像数据
  3. veloyne:雷达点云数据
  4. label2:对应文件标签

calib标定校准文件解析

在这里插入图片描述

  1. 内参矩阵: P0-P3分别表示4个相机(左边灰度相机、右边灰度相机、左边彩色相机和右边彩色相机)的内参矩阵,或投影矩阵, 大小为 3x4。相机内参矩阵是为了计算点云空间位置坐标在相机坐标系下的坐标,即把点云坐标投影到相机坐标系。将相机的内参矩阵乘以点云在世界坐标系中的坐标即可得到点云在相机坐标系中的坐标。
  2. 校准矩阵: R0_rect 为0号相机的修正矩阵,大小为3x3,目的是为了使4个相机成像达到共面的效果,保证4个相机光心在同一个xoy平面上。在进行外参矩阵变化之后,需要于R0_rect相乘得到相机坐标系下的坐标。
  3. 外参矩阵:根据上述介绍,我们知道存在三种坐标系世界坐标系、相机坐标系、激光雷达坐标系。世界坐标系反映了物体的真实位置坐标,也是作为相机坐标系和激光雷达坐标系之间相互变换的过渡坐标系。点云位置坐标投影到相机坐标系前,需要转换到世界坐标系下,对应的矩阵为外参矩阵。外参矩阵为Tr_velo_to_cam ,大小为3x4,包含了旋转矩阵 R 和 平移向量 T。将相机的外参矩阵乘以点云坐标即可得到点云在世界坐标系中的坐标。
  4. 综上所述,点云坐标在相机坐标系中的坐标等于
    相机坐标 = 内参矩阵 * 外参矩阵 * R0校准矩阵 * 点云坐标
    例如要将Velodyne激光雷达坐标系中的点x投影到左侧的彩色图像中y,使用公式:
    y = P2 * R0_rect *Tr_velo_to_cam * x
  5. 激光雷达坐标转换图像像素坐标代码
    def velodyne2img(calib_dir, img_id, velo_box):
        """
        :param calib_dir: calib文件的地址
        :param img_id: 要转化的图像id
        :param velo_box: (n,8,4),要转化的velodyne frame下的坐标,n个3D框,每个框的8个顶点,每个点的坐标(x,y,z,1)
        :return: (n,4),转化到 image frame 后的 2D框 的 x1y1x2y2
        """
        # 读取转换矩阵
        calib_txt=os.path.join(calib_dir, img_id) + '.txt'
        calib_lines = [line.rstrip('\n') for line in open(calib_txt, 'r')]
        for calib_line in calib_lines:
            if 'P2' in calib_line:
                P2=calib_line.split(' ')[1:]
                P2=np.array(P2, dtype='float').reshape(3,4)
            elif 'R0_rect' in calib_line:
                R0_rect=np.zeros((4,4))
                R0=calib_line.split(' ')[1:]
                R0 = np.array(R0, dtype='float').reshape(3, 3)
                R0_rect[:3,:3]=R0
                R0_rect[-1,-1]=1
            elif 'velo_to_cam' in calib_line:
                velo_to_cam = np.zeros((4, 4))
                velo2cam=calib_line.split(' ')[1:]
                velo2cam = np.array(velo2cam, dtype='float').reshape(3, 4)
                velo_to_cam[:3,:]=velo2cam
                velo_to_cam[-1,-1]=1
     
        tran_mat=P2.dot(R0_rect).dot(velo_to_cam)  # 3x4
     
        velo_box=velo_box.reshape(-1,4).T
        img_box = np.dot(tran_mat, velo_box).T
        img_box=img_box.reshape(-1,8,3)
     
        img_box[:,:,0]=img_box[:,:,0]/img_box[:,:,2]
        img_box[:, :, 1] = img_box[:, :, 1] / img_box[:, :, 2]
        img_box=img_box[:,:,:2]   # (n,8,2)
     
        x1y1=np.min(img_box,axis=1)
        x2y2 = np.max(img_box, axis=1)
        result =np.hstack((x1y1,x2y2))   #(n,4)
     
        return result
    
  6. 各个转换
    设 y为 激光雷达坐标写下的点 (x,y,z,r)
    • Tr_velo_to_cam * y : 把激光雷达坐标系下的点y投影到相机坐标系

    • R0_rect * Tr_velo_to_cam * y: 将激光雷达坐标系下的点投影到编号为2的相机坐标系,结果为(x,y,z,1),直接取前三个为投影结果,当计算出z<0的时候表明该点在相机的后面 。标注文件中的中心坐标即是相机2下的坐标系。

    • P2 * R0_rect * Tr_velo_to_cam * y:将激光雷达坐标系下的点投影到编号为2的相机采集的图像中,结果形式为(u,v,w)。 Ps:u,w需要除以w后取整才是最终的像素。

标注文件解析

标注文件中16个属性,即16列。但我们只能够看到前15列数据,因为第16列是针对测试场景下目标的置信度得分,也可以认为训练场景中得分全部为1但是没有专门标注出来。

  1. 目标类比别(type),共有8种类别,分别是Car、Van、Truck、Pedestrian、Person_sitting、Cyclist、Tram、Misc或’DontCare。DontCare表示某些区域是有目标的,但是由于一些原因没有做标注,比如距离激光雷达过远。但实际算法可能会检测到该目标,但没有标注,这样会被当作false positive (FP)。这是不合理的。用DontCare标注后,评估时将会自动忽略这个区域的预测结果,相当于没有检测到目标,这样就不会增加FP的数量了。此外,在 2D 与 3D Detection Benchmark 中只针对 Car、Pedestrain、Cyclist 这三类。
  2. 截断程度(truncated),表示处于边缘目标的截断程度,取值范围为0~1,0表示没有截断,取值越大表示截断程度越大。处于边缘的目标可能只有部分出现在视野当中,这种情况被称为截断。
  3. 遮挡程度(occlude),取值为(0,1,2,3)。0表示完全可见,1表示小部分遮挡,2表示大部分遮挡,3表示未知(遮挡过大)。
  4. 观测角度(alpha),取值范围为(-pi, pi)。是在相机坐标系下,以相机原点为中心,相机原点到物体中心的连线为半径,将物体绕相机y轴旋转至相机z轴,此时物体方向与相机x轴的夹角。这相当于将物体中心旋转到正前方后,计算其与车身方向的夹角。
  5. 第5-8列:二维检测框(bbox),目标二维矩形框坐标,分别对应left、top、right、bottom,即左上(xy)和右下的坐标(xy)。
  6. 第9-11列:三维物体的尺寸(dimensions),分别对应高度、宽度、长度,以米为单位。
  7. 第12-14列:中心坐标(location),三维物体底部中心在相机坐标系下的位置坐标(x,y,z),单位为米。
  8. 第15列:旋转角(rotation_y),取值范围为(-pi, pi)。表示车体朝向,绕相机坐标系y轴的弧度值,即物体前进方向与相机坐标系x轴的夹角。rolation_y与alpha的关系为alpha=rotation_y - theta,theta为物体中心与车体前进方向上的夹角。alpha的效果是从正前方看目标行驶方向与车身方向的夹角,如果物体不在正前方,那么旋转物体或者坐标系使得能从正前方看到目标,旋转的角度为theta。
  9. 第16列:置信度分数(score),仅在测试评估的时候才需要用到。置信度越高,表示目标越存在的概率越大。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011489887/article/details/126316851

智能推荐

Gradle各版本下载地址_gradle官网-程序员宅基地

文章浏览阅读5.4k次。Gradle各版本下载地址 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanfengzqh/article/details/78184851Gradle各版本下载地址:http://services.gradle.org/distributions/ 我们下载都是all版本,里面包含了Gradle SDK的所有相关内容,包括:源码..._gradle官网

Delphi 10.4跨平台可视化快速开发安卓Andriod APP配置SDK/NDK的方法_delphixe10.4 安卓环境-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏12次。在使用Delphi 10.3.3或者10.4开发安卓应用的过程中,实际上,安装程序未在RAD Studio本身中配置Android SDK / NDK(可能还有其他)。甚至没有安装在操作系统上。尤其是Android开发库,这可能涉及到与甲骨文的Java版权关系,未来Delphi将支持OpenJDK。Delphi跨平台可视化快速开发软件APP应用您可以将SDK和NDK文件夹复制到硬盘或另一个硬盘上的任何位置,因为这两个库是通过line命令配置的,就像过去一样,在操作系统... DOS,Linux等_delphixe10.4 安卓环境

高通QSEE中使用qsee_stor_write_sectors函数存储数据到emmc的RPMB分区_高通rpmb-程序员宅基地

文章浏览阅读1.1k次。QSEE不会自动对你的数据进行加密的,除非使用SFS。存储在RPMB的数据是有权限写入的,不是任何人都可以写,写之前需要鉴权。如果需要防止数据泄露,那就需要在写RPMB之前对数据进行加密。介绍一下RPMB分区RPMB(Replay Protected Memory Block)Partition 是 eMMC 中的一个具有安全特性的分区。eMMC 在写入数据到 RPMB 时,会校验数据的合法性,只有指定的 Host 才能够写入,同时在读数据时,也提供了签名机制,保证 Host 读取到的数据是 RP_高通rpmb

绘制决策曲线decision curve analysis(DCA)_dca曲线-程序员宅基地

文章浏览阅读2.4w次,点赞6次,收藏67次。Decision curve analysis-DCA 论文《Decision Curve Analysis: A Novel Method for Evaluating Prediction Models》y轴是计算出的收益x轴是取不同的概率Pt的值通过不断变换Pt阈值,计算对应的收益值横直线和点虚线分别为全手术or全不手术的时候对应的收益。如果绘制的DCA曲线高于这两条曲线..._dca曲线

ADB指令大全_adb命令大全详解-程序员宅基地

文章浏览阅读1.7w次,点赞10次,收藏108次。adb指令快捷键玩转adb命令,可以让我们电脑端操作手机变得游刃有余。 - **adb的断开与连接** ```java adb devices :显示已连接的设备 adb disconnect :端口号 :adb断开某设备 adb connect :端口号:adb连接某设备(通常针对offline设备) adb kill-server:杀死adb adb start-server:重启adb adb reboot:重启机器 adb..._adb命令大全详解

CSS3笔记-程序员宅基地

文章浏览阅读102次。CSS的颜色表达颜色宝典CSS背景图片的设置 overflow: scroll; /*设置滚动条*/ background-image: url("resources/background.png"), url("resources/background.png"); /*左边的背景图会去覆盖右边的背景图,背景图还会覆盖背景颜色*/ background-repeat: no-repeat; _css3笔记

随便推点

零碎蓝桥备战知识点-程序员宅基地

文章浏览阅读171次。最小生成树(Kruskal和Prim算法):http://blog.csdn.net/luoshixian099/article/details/51908175并查集:https://blog.csdn.net/niushuai666/article/details/6662911莫比乌斯反演:https://blog.csdn.net/ACdreamers/article/details...

CLIP还能做分割任务?哥廷根大学提出一个使用文本和图像prompt,能同时作三个分割任务的模型CLIPSeg,榨干CLIP能力...-程序员宅基地

文章浏览阅读2.8k次。点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达作者丨小马来源丨我爱计算机视觉本篇分享 CVPR 2022 论文『Image Segmentation Using Text and Image Prompts』,哥廷根大学提出了一个使用文本和图像prompt,能同时作三个分割任务的模型CLIPSeg,榨干CLIP的能力!详细信息如下:论文地址:https://ar..._referring image segmentation clip

安装和更新node的正确姿势-程序员宅基地

文章浏览阅读6.9k次,点赞6次,收藏4次。干货时刻本文主要讲解了如何安装node,以及如何更新node的版本`。node.js 是什么简称node,是基于Chrome V8引擎的JavaScript(JS)运行时环境node 安装进入node 官网,点击如下图所示的安装包即可下载,不同系统用户可根据自己的系统选择相应的安装包下载,作者用windows演示下载好后,我们自定义一个文件夹作为安装目录,例如作者的就是E:\System_disk_app\Nodejs。双击下载好的node-v16.14.2-x64.msi文件,弹出安装向导_更新node

【Rails】inverse_of在has_many和belongs_to中的用法_rails inverse of-程序员宅基地

文章浏览阅读1.5k次。最近使用Rails时,遇到了通过关联关系来多次访问同一条record,虽然得到的内容一样,但是每次都会创建不同对象的情况。通过查询Rails官方文档,找到了对关联关系的一种设置inverse_of,可以避免在一些情况下重复创建对象的问题。但是,文档中提到了inverse_of的限制:不能和 :through 选项同时使用不能和 :polymorphic 选项同时使用不能和 :as 选项同时使用_rails inverse of

window.showModalDialog() 过时替代方案_window.showmodaldialog替代方法-程序员宅基地

文章浏览阅读8.2k次。一、window.showModalDialog 方法说明window.showModalDialog( ) 方法的作用是创建和展示一个指向特定网页的模态对话框。该方法已经过时,特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。此方法已在Chrome 43和Firefox 56中删除,当前仅IE浏览器支持该特性。如果正在开发的功能,需要使用到JS的对话框,应该使用window.open( ) 方法。如果是对老项目进行维护,_window.showmodaldialog替代方法

pdsh 安装步骤_centos7 源码安装pdsh-程序员宅基地

文章浏览阅读3k次。 pdsh安装步骤Skip to end of metadataCreated and last modified by wenqi.kang on Oct 19, 2017Go to start of metadata0.安装环境centos6.5 &amp; centos7.21.解压并安装安装包: pdsh-2.26.zipunzip pdsh-2.26.zip..._centos7 源码安装pdsh

推荐文章

热门文章

相关标签