本文是对论文的解读与思考

论文:  Towards End-to-End Lane Detection: an Instance Segmentation Approach

 

introduction

该论文提出了一种 端到端 的 实例分割方法,用于车道线检测;

论文包含 LaneNet + H-Net 两个模型网络,其中 LaneNet 是一种将 语义分割 和 像素矢量化 结合起来的多任务模型,语义分割用来分割车道线与背景,像素矢量化 用于把属于同一条车道线的像素 聚类 在一起,

H-Net 是个小网络,用于预测 转换矩阵 H,使用 H 对同一条车道线的所有像素点进行重新建模(论文中是使用 y 预测 x)

 

LaneNet

之前提到大部分 图像分割 的网络都包含 encode 和 decode 两部分,LaneNet 也不例外,不同的是 LaneNet 包含了两个分支,如下图

下面的分支 Segmentation branch 是常规的 语义分割,用于 分割 车道线 和 背景,实现的是 二分类;

上面的分支 Embedding branch 用于 像素的矢量化,把每个 像素 用一个高维向量表示(类似于 word embedding),使得 像素 可以通过 聚类 把 不同车道线分开;

后面那个 X 不必在意,只是结合的意思;

 

网络结构

LaneNet 是 基于 ENet 的 Encode-Decode 网络结构,ENet 网络如下图

如图所示,ENet 由 5 个 stage 组成, stage 1 2 3 属于 Encode,stage 4 5 属于 Decode;

LaneNet 中 语义分割 和 Embedding 两个任务共用 stage 1 2,将 stage 3 和 后面 的 Decode 部分作为各自分支结构;

语义分割 的 输出为 W*H*2,[2 分类],Embedding 的输出为 W*H*Dim,Dim 为自定义的向量长度;

论文中两个分支 权重相同;

 

Segmentation

语义分割目的是区分 车道线和背景,其中作者主要考虑两点:

1. 在构建 label 时,为了处理遮挡问题,论文对 被车辆遮挡的车道线和虚线进行了还原;

2. 由于 类别 不均衡,作者进行了加权

Pclass 为 每个类别 出现的概率, C 为 常数,是个超参数,(ENet论文中是1.02,使得权重的取值区间为[1,50])

个人理解:首先,由于 类别分布可能会相差很大, 取 log 缩放了这个差距,加个 常数 C 防止 log 取 负数,然后再取 倒 是把出现多的权重变小,出现少的权重变大;

 

Embedding 

像素 Embedding 是对 像素进行 矢量化,用于区分 每个像素 属于哪条车道线;

它的思想如下:类似于聚类,同一条车道线(根据 label 可知) 的像素要靠近 矢量化 的中心,不同车道线的像素的 矢量化 中心要远离,即 类内距离尽可能小,类间距离尽可能大;

它的 loss 设计很巧妙,分为两部分

C 代表 车道线的条数,由 label 可知;

Nc 代表 每条车道线的 像素点;

μc 代表每条车道线的像素矢量 均值,注意是 预测值的 mean,即 网络输出 预测矢量 后,再计算均值,然后 计算 loss;

δv 代表 像素 离 μc 的距离,大于 该距离时,要进行 pull,即 拉近到 聚类中心;

  // 试想一下普通的距离方法,每个样本分布在其聚类中心周围,并不是 和 聚类中心 重合,

μca μcb 代表 不同车道线的 像素矢量 均值,也是 预测值的 mean;

δd 代表不同车道线 聚类中心 间 的距离,小于该距离时,要进行 push,使得 聚类中心远离;

||x|| 代表 L2 范数;

[x]+ 代表 max(0, x);

 

聚类

聚类只 发生在 预测部分

即 模型完成 分割 和 矢量化 后,对矢量 进行 聚类,区分不同车道线;

为了 方便 聚类,在 Embedding 时 设定 δd > 6*δv;

聚类 方法使用的是 mean shift,不再赘述;

 

H-Net

LaneNet 的输出是 每条车道线的像素集合,我们还需要把 这些 像素 拟合成一条车道线;

传统做法是将 图片 投影到 鸟瞰图 中,然后用 二阶或者三阶 多项式进行拟合,这种方案 转换矩阵 H 只算一次,但不同地形如 丘陵、山地 的转换是略有不同的;

 

为了解决这个问题,论文训练了一个 预测 转换矩阵 H 的 神经网络,输入是一张图片,输出是 转换矩阵 H

H 长这样

通过置 0 对转换矩阵进行约束,即水平线在转换下保持水平,即 坐标 y 的变换不受 x 的影响; 

y' = dy + e,与 x 无关; 

 

网络结构

上述转换矩阵只有 6 个参数,故 H-Net 模型的输出是一个 6 维向量,网络包含 6 个卷积层和 1 一个 全连接;

 

loss function

懒得写了,是个图片

 

思路如下: H-Net 输出 H 后,与 真实像素 相乘 做转换,得到一堆转换后的点,然后用 最小二乘法 得到 拟合系数 w,注意 至此 H w 都是瞎猜的,是预测的,

然后我们在 y’ 处 计算对应的 x’,也是瞎猜哦 ,最后用 H-1 把 x’ 还原回去,得到 x*,至此都是瞎猜,然后求 误差;

具体可以看 参考资料 3

我这里有个疑问:用 x’ y' 算出了 w,然后 做 wy' 竟然和 x' 完全不一样,有些费解,纠结啊

 

curve fitting

曲线拟合只发生在 预测 部分

 

 

思考

laneNet 为什么没有 类似于 skip connection 的操作?

我的理解是 识别车道线的任务 太过简单了

 

 

 

参考资料:

https://www.jianshu.com/p/c6d38d648509

https://www.cnblogs.com/xuanyuyt/p/11523192.html

https://github.com/stesha2016/lanenet-enet-hnet  代码