声明:仅记录学习过程
./Examples/Stereo/stereo_kitti Vocabulary/ORBvoc.txt Examples/Stereo/yaml /media/wangxudong/xudong/KITTI-data/dataset/sequences/ur26/ ../output/urban26/
整理一下思路
首先我们下载了ur数据集,会得到相应的一些数据
我只关注双目图像,以及对应的相机配置参数,还有一个global_pose.csv
我是想用 stereo_kitti 运行这个ur系列数据集,想着改一下配置文件就可以了
但其实并不是想象的这么简单
我需要将这个数据集形式改成和读取kitti数据集一样的格式
需要有一个 times.txt 单独存放时间戳
使用脚本 readTmp.py 可以完成
但是此时间戳是以纳秒为单位,在我运行ORB3时会导致一些问题,图片不读取下一帧
因此将其转化成和kitti一样以秒为单位,且从0开始
使用脚本 ns2s.py 完成
最后需要将图片的名字改一下,原本是以时间戳命名的, 使用脚本changeName.py 给他改成和kitti一样 000000.png 000001.png ... 005837.png 这种格式
这样就完成了数据集格式的修改,就能使ORB3按照kitti数据集格式来读取
配置文件的修改
其实相机内参已经在 left.yaml right.yaml 里边写出来了,需要在配置文件里填上相应的数值
在此我只修改了左右相机的内参,畸变参数,关于右相机相对左相机的变换矩阵,只用了旋转部分的数值,平移向量里边的数太大了,填上反而不对
Kaist25.yaml里边就是我填写后的,读取ur系列的数据集都用这个配置文件
完成以上就可以使用ORB3运行数据集了,但是如果要使用语义信息就需要增加额外的部分
------------addsemantic-------------------
需要将数据集经过我的yolov5的标注有一个标签文件,依据经验这个标签文件根输入的图片一样是以时间戳命名的,一样运行 changeName.py 看看是 .txt还是.png 根据实际情况修改
我仿佛发现了一个问题,在检测过程中会有一些图像上没有label 按顺序排下来,那岂不是将空白的txt都补在最后边了,这与实际情况不符
打个比方 有10张以时间戳命名的图像,第3 ,5 ,7 张图像没有label(当然这种概率很小),我们只有7个txt文件,并分别以自己的时间戳命名的,但是我们要 改成 000000.txt 000001.txt格式并补全,这不都补到后边去了???
我们应该是把 第3 ,5 ,7 张图片对应的txt文件补出来。
当我写到这里的时候我就检查了一下我用yolov5处理后的ur26数据集,果然补充的所有空白txt文件都在最后(解释为什么要补充空白txt是为了做一个对齐,有的图片上没有检测到感兴趣的检测框,但是又需要有一个txt与输入的图像一致)
因此在进行yolov5处理图像后,一定要使用 改好名字的图片集 名字格式为000000.png 000001.png...
这样在检查完后直接用脚本处理一下 yolo-to-format.py 完事就是我们需要的格式了,最后用脚本 add_null_txt.py 补上空白的txt文件,会把中间空的补出来,而不是一股脑的堆在后边
--------------------------------------------------------
下边就是轨迹方面
数据集提供的csv文件,没法使用evo评估 (ORB3双目模式下运行得到的是3乘4的变换矩阵来保存的位姿),所以需要对csv进行一些处理
先把第一列时间戳删掉,并改名为.txt文件
然后使用脚本 change2kitti-txt.py 变成kitti格式的 (数据之间去掉逗号,并加上空格,注意最后一个数后边不能有空格)
数据集提供的位姿非常的多,想要用evo评估,你就要保持同样的数目的位姿 比如我这个ur26的数据集 图片有5837张,因此应该有5837个位姿,但实际原始位姿有四万多,必须得来个降采样
降到和ORB3跑出来的位姿一样多,还要尽可能保留全局轨迹,因此运行 reducePose.py 就可以了
此刻csv文件已经完全转化好了 可以用kitti画出轨迹,也可以用来求 ape rpe
但是我观察到 ORB3运行保存的轨迹好像是 以z为前方向 而该数据集画出来却是以x为前方向一样 我寻思整个脚本让跑出来的orb3.txt轨迹在绕y轴旋转90度,然后与真值进行误差计算
经过验证 ape 没有啥变化,可能有对齐操作 -a -s 但是rpe变更小了,说明旋转一下可能是正确的
将运行得到的 orb3.txt 或者 orbaddse.txt 经过脚本 orb3_transformed.py 处理就可以了
但是始终有一个问题困扰着我,我的轨迹和真实轨迹好像差点意思???比如这个 以Urban26为例
听大佬们说是时间戳有问题,并给出了解决方案
evo_traj tum TrajAfterMapped.txt --ref tum-cutted-m-local.txt -apv --plot_relative_time --t_offset -16
但是我其实很蒙比,因为我这是kitti格式下的轨迹,根本没有时间戳的事,因此只能将kitti格式转化为tum格式的轨迹,万幸evo里有这个脚本,非常方便就搞定了
evo_traj tum orb3-tum.txt --ref ur26-tum-GT.txt -apv --plot_relative_time --t_offset -40 -as
使用evo_ape可以发现偏移之后曲线拟合度高了,同时rmse也变小了
偏移之前: 真值和orb3
max 554.273660
mean 191.243573
median 154.970013
min 57.344764
rmse 218.831137
sse 279516806.497894
std 106.362410
evo_ape tum ur26-tum-GT.txt orb3-tum.txt -as -p --plot_mode=xyz --t_offset -40
偏移之后: 真值和orb3
max 338.374245
mean 123.445974
median 115.662485
min 25.223055
rmse 145.968615
sse 115845270.804646
std 77.89611
可以看出确实是有效果的
但是当我使用改进后的代码跑出来的轨迹与真值比较并计算ape时发现没啥效果,有点尴尬
给自己想了一个接口就是 ur26数据集里边触发了回环,最后误差得到了均摊,所以和改进后的效果差不多(就是说orb3触发了回环后,其结果必然变好了一截),因此我们做对比实验的话,应该找一些没有回环的数据集来做