GithubHelp home page GithubHelp logo

bev-joint's Introduction

Bev-Joint

将每一帧的bev矢量图拼接起来(实习项目)

由于修改的是实习公司的代码,因此不放出具体代码,仅放开我完成的效果(基本都是自己完成)

具体效果

如下视频中演示效果:

【BEV矢量拼接--中点采样】 https://www.bilibili.com/video/BV16F411Z7jX/?share_source=copy_web&vd_source=768b8afd5311be6054cd380b9eae12e4

【BEV矢量拼接--栅格地图】 https://www.bilibili.com/video/BV16P411Y7RP/?spm_id_from=333.999.0.0&vd_source=3cdcd5ccae179b42e3c3e1f1413788b6

项目说明

总体**很简单,就是将每一帧的BEV矢量图,根据每个矢量属于不同实例,将其拼接(目前只是使用nuScenes数据集的真实位姿进行推算,之后可以在此真实位姿的基础上添加扰动测试)。 想法很简单,实现起来还是困难重重。具体的实现流程:

  • 使用MapTr提供的开源代码进行bev矢量图的建立(使用环视6相机的图片数据,通过学习方法得到bev空间下的矢量信息)
    • 数据集使用 nuScenes,由于nuScenes数据集皆为片段式且少有连续,因此根据nuScenes数据集提供的Token以及每个片段的时间戳,使用python脚本找到其中连续时间最长的8个片段进行拼接。再使用MapTr进行矢量图预测。
    • MapTr进行的矢量图预测,通过修改MapTr的输出部分代码,将输出转为Json文件,存放这每一帧每一个矢量数据点信息
  • 将BEV视角下每一帧的矢量信息进行拼接
    • 匹配过程:由于矢量信息只有一个多段折线段,因此最终选择使用折线段扩充之后的图形,计算IOU进行匹配(使用Boost中的geometry进行扩充与计算)
    • 滤波过程:使用Douglas–Peucker算法,对折线段进行滤波
    • 拟合过程:匹配的两个折线段需要进行拟合才能最终形成一条折线段,拟合过程我使用了三种方法,都无法达到我理想的状态,暂时选择了简单粗暴的取中点的方式(后续会适当修改):
      • 取中点:将匹配的两个折线段,选择合适的截取点(因为当前帧的折线段只是匹配上一帧折线段的一部分),然后对截取点之后的两个折线段,互相取点的中点,作为拟合点(对于截取点的判断很复杂,因为匹配的折线段上的点并不是一一对应的)
      • 插值:进行插值的前提下,这两个折线段必须已经进行了插入合并成了一条折线段,才能进行插值,那么在没有准确位姿的情况下,这种效果并不会好
      • 多项式拟合:较为理想的方法,但是我实现的效果并不好(可能是我代码写的问题)
        • 难点1:多项式拟合中,这个多项式次数并不好确定, 次数小了拟合效果不够,次数大了容易出现龙格现象
        • 难点2:矢量折线段的形状千奇百怪,很容易出现一对多,多对一(就是一个x对应好几个y)的情况,那么这种拟合方法是否能够拟合(好想还是多项式次数选择的问题。。。。)

整个项目最不好处理的就是拟合部分,其实最近在想这样一个问题:拟合其实代表着这个点在该坐标下有较高的权重,导致拟合曲线会趋向于该点,但是矢量信息的点并不代表这个点的权重比较大,只是代表着这个点是该实例上的一个点,并且该点与其他点合并成为了该实例对象。那么拟合的方法是否不太合理??这个拟合方法是否可以使用一些栅格地图的一些想法?--->这只是我的一点愚见

2023.8.31更新

按照上面的想法,我初步使用了栅格地图的方式进行矢量拼接,具体的实现效果在上面的链接查看 栅格地图的方式有以下的优点:

  • 如上面所说,矢量点不应表示实例权重较大的点,因为栅格化的表示感觉更加合理一些
  • 栅格化的表示,可以有效的滤掉一些错误检测的部分,因为中点采样的方式只能相信每次检测的结果,而栅格化的表示可以根据该栅格 "占据" 的概率,滤除很多误检测的部分

实现流程就是简单的将矢量折线段进行栅格化,程序运行后的进行后处理,将栅格地图矢量化(这个后处理让我突然想起来秦通的众包构图。。。)

两种方法的对比

中点采样 栅格地图
优点 想法简单,两帧相同对象之间的拟合,可以简单绕过考虑曲线的复杂性 不用考虑曲线的复杂性,有效的剔除了误检测的部分
对矢量信息进行栅格化的地图表示更加合理
缺点 想要效果比较好是个很困难的事情,主要难点在于,需要找到当前帧的部分与上一帧该对象的哪个部分是匹配的,因此中点采样的方式对于边界的处理很复杂
不能有效的去除误检测的部分,因为得到的矢量信息有限,只能信任这些数据,而一个严重的误检测结果,会导致整个地图建立出现问题
栅格地图在最后的后处理过程中,将栅格转换为了矢量信息,这个矢量信息的转换需要大量的滤波处理,才能够得到相对平滑的曲线,而这个滤波处理,就有可能导致其他数据集就会失效的情况
总结 视频中演示的,该方法会有比较大的误差,主要原因就在于边界的处理并不好计算,再加上一些误检测的部分,然后整个效果都不好 视频中演示的,该方法的效果明显要好的多,但是因为滤波很多,就需要考虑更多的情况,因此需要使用更多的数据集测试,才能确定这个方法没问题

参考链接

全路径栅格化:https://blog.csdn.net/weixin_41154636/article/details/84886628

ZhangSuen算法: https://www.freesion.com/article/8404322208/

bev-joint's People

Contributors

zhang-zuo avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.