工作总结
本文最后更新于:9 天前
得益于本司孱弱的算法水平,经常需要观察模型效果进行针对性优化。本文总结了一下做过的那些感知优化方面工作,相当零散,涉猎广泛。欢迎大家讨论和pick:
风抖消除
基于频域相位的图像配准,通过计算两幅图像频域互功率谱的值,可以得到x和y方向偏差值。选定特征明显的区域后再计算速度更快。部分路口场景用图像描述子的话受光线影响较大,频域反而鲁棒性更好。
OpenCV直接有GPU的互功率谱计算API,同时也自己实现了cu文件。调试时候还发现cufft会一直占用一定的堆内存。
小目标增强检测
这个在申专利,不好多说,就是参考推理时的SAHI手段。主要在于如何快速选择这个放大检测的区域。
封装该库时参考了boost.geometry中类似的模板trait特性,当一个函数需要传入目标框,但是调用者处的目标框是自定义类型,而库内又不想包含该自定义类型的头文件时,就可以使用这种手段。通过宏在调用处注册目标类型和访问方法,库内使用模板函数,实现静态多态。


行驶区域生成
由于算法路面分割的结果太烂,只能另想办法生成车道。一开始做了个降级版,没有细分到车道级,根据已有的车辆跟踪框,按行驶方向生成多个区域。先对糟糕的跟踪结果进行筛除,选取车辆目标框底边的点,使用三维DBSCAN进行聚类,即角度、x坐标、y坐标。DBSCAN找了个带KD树加速的库,针对可能的环型场景,还需要修改距离函数支持角度的周期性。最后的效果差强人意,主要限制在于不能无限制地增加聚类点数,没做到持续自迭代优化。
封装时加了线程池,结合future接收区域生成结果。


车辆轨迹生成车道
- 先基于车辆检测框做核密度估计,生成热力图,这里对高斯核做了一下操作,根据条件进行了能量衰减,相当于筛除了一些误检和过远的框。并且热力图添加衰减系数之后是可以无限叠加的
- 然后提取热力图中的极大值点,在将热力图二值化并提取骨架。再从极大值点出发,沿骨架路径进行延伸。期间进行了一些跳过空洞、允许扰动、拼接/裁剪/合并路径的点集操作。各路径稳定后还要进行角度判断,删掉可能的变道路径。
- 为了结合多帧结果,突发奇想对路径点集进行了生命周期管理和跟踪,将每帧得到的路径(其实就是车道中心线)打碎成小段,放到接近的池中,再根据角度等评分项恢复出最合适的路径
- 最后还要根据车道中心线间的位置,向两侧扩张得到车道区域
巨量的路径点集操作和像素级的处理,使出洪荒之力的史诗级巨作,可惜估计最后也不会实装了,还得给算法模型的车道线擦屁股。中间的示例好像改进过,骨架图对不太上,反正就这意思。

单目相机精细标定
原有的打点标定方式精度提不上(虽然后边发现换了相机和镜头精度直接提升),使用了Ceres的捆绑调整(BA)将所有点的投影误差作为残差,联合优化内外参矩阵和畸变系数。
假设地平面高度是0,要求所有标定点都是地面上的点,即Zw=0,此时可以通过公式将单目相机的像素坐标转换成GPS坐标(使用UTM坐标表示精度更高)。
可能对于未知内参的已安装相机来说更有用,可以先计算理论内参和外参,将标定的GPS点投影到图像,人工简单调整参数后,再用BA联合优化,得到一个较好的标定结果。


火焰误检筛除
对于大量的火焰误检结果,采用了HSV空间的亮度删除明显暗处的误检,采用灰度共生矩阵GLCM进行了一些纹理分析,可以筛除一些探照灯的误检。再结合了PCA进行亮条分析,筛除车灯误检,但是这个受到二值化效果的限制,参数得严苛一些。
感觉手工特征还是属于最原始的阶段,确实不如清洗数据改进模型来的直接。

数据分析
python画的,最后生成的html,可以放大缩小,缺点是一个文件20M,操作很卡顿。
让我回忆起了早古的写python时光,虽然忘了好多了,感谢GPT的大力支持
