赞
踩
前言知识点:
因为公司做自动驾驶,所以打算对自动驾驶中的一些任务有个了解,看看论文,首先是一篇基于2d视觉的一篇车道线检测的文章。首先先上资料,也供大家学习参考,最后一个是3d检测的
Lane Detection(一)Traditional lane detection method - 知乎
Apply IPM in Lane Detection from BEV | LeijieZhang
实例分割最新最全面综述:从Mask R-CNN到BlendMask - 知乎
利用逆透视变换获取车载图象的鸟瞰图_玉米味土豆片的博客-CSDN博客_opencv 鸟瞰图
GitHub - amusi/awesome-lane-detection: A paper list of lane detection.
通用汽车最新提出:3-D车道线检测新方法 - 腾讯云开发者社区-腾讯云
这里再写一些资料的补充
IPM Transform的优势可以看第一篇,还有在于遮挡问题,也就是车对于车道线的这档问题
侵删
OHEM online hard example mining 数据增强解决正负样本不平衡,其主要是不需要人为设定正负样本的比例。算法的核心思想是对样本进行训练,选择其中loss较高的N个样本作为难例,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本采用反向传播进行loss下降。
模型初始化,模型分开为两个部分,front负责模型的主干以及分类头等等,而back_end负责对于模型输出进行处理以及loss的计算
直接看模型,首先se_block就是基本模型模块单元,centext_embedding_block一个模块, _GatherExpansion是采用se_block的基础上进行了深度可分离卷积, 分为_apply_ge_when_stride_equal_one和_apply_ge_when_stride_equal_two,是深度可分离卷积中stride的值的区别,当为2时会导致下采样。
具体模型结果如下图
可以看到整体模型架构就是
先并行使用两个模块提取信息,再采用aggregation_branch进行信息的融合,在分开两个分割头,一个头是二进制的语义分割,用来区分背景与车道线,另一个负责实例分割,将不同的车道线分割开。
然后就可以进入到back_end中看看head和loss
先看看head,其实非常简单,就是拿到backbone输出得到的二值分割和实例分割的结果,对于二值就是用来区分背景和车道线,简单的二分类问题,采用softmax加上argmax来做。也就是对应下图的第二个
而对于实例分割模块,本文采用度量学习,聚类的思想来使得不受限于车道线的数目,简单来说就是通过一个bn-relu-conv2d的结果来使得输出结果尺寸与原图一致,并且每个像素点用emding_dim来表示,其实就是做一个embeding。
然后看最重要的loss
先看二值的,也很简单,就是三个通道,每个通道都做ce
核心看discriminative_loss看看度量学习是咋搞的
这里其实也是主要看discriminative_loss_single,其他的就是看tf.while_loop这个函数,就是判断cond是否满足,然后循环执行body,其实就是bach中的数据一个一个来都别急
前两步没啥可说的,就是调整数据格式,需要看的是这个函数
同时利用tf.unsorted_segment_sum实现将每个像素分到自己的label,也就是将像素聚类区分,这里不太好理解,就是说,一共有这么多类,然后idx就是每个像素对应的类的索引,所以就可以得到每个像素到底是哪个类
tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值, tf.subtract减法,tf.divide对应元素相除
在论文中损失函数分为两份,也就是Lvar和Ldist
一个使得同一类的像素点与均值更加靠近,而另一个使得不同类的像素点远离。这tensorflow没咋用过,用pytorch居多,这函数太多,理解意思即可。
tensorflow太难读了,后续再补上,看论文知识点可以参考
如有错误,欢迎批评指正
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。