图像分割 - LaneNet + H-Net 车道线检测

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

论文:  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 代表不同车道线 聚类中心 间 的距离;

||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*,然后求 误差;

其实论文并没有讲清楚 到底怎么弄的,困扰了我很久,我的理解是这样的

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

原文地址:https://www.cnblogs.com/yanshw/p/12530272.html

时间: 2024-10-10 05:03:40

图像分割 - LaneNet + H-Net 车道线检测的相关文章

语义分割之车道线检测Lanenet(tensorflow版)

Lanenet 一个端到端的网络,包含Lanenet+HNet两个网络模型,其中,Lanenet完成对车道线的实例分割,HNet是一个小网络结构,负责预测变换矩阵H,使用转换矩阵H对同属一条车道线的所有像素点进行重新建模 将语义分割和对像素进行向量表示结合起来的多任务模型,最近利用聚类完成对车道线的实例分割. 将实例分割任务拆解成语义分割和聚类,分割分支负责对输入图像进行语义分割(对像素进行二分类,判断像素属于车道线还是背景),嵌入分支对像素进行嵌入式表示,可将分割后得的车道线分离成不同的车道实

语义分割之车道线检测(tensorflow版)

      由于项目需要,参考了多篇相关车道线检测论文与源码,设计了一套Tensorflow版车道线检测功能. 二.基本结构:       该模型主要由以下部分组成: 1.数据源:包括所有原始数据,分组后的数据: 2.数据预处理:包括数据的准备,数据的导入,数据的提取,数据的分组(训练与测试): 3.配置文件:包括各种参数与超参数,如:训练周期,训练步长,批量数据,学习率,卷积核大小,全连接大小,训练模型存放路径(checkpoint),摘要存放路径(summary)等: 4.基础网络:包括基本

车道线检测资源

数据集 CULane Dataset https://xingangpan.github.io/projects/CULane.html BDD100K https://bdd-data.berkeley.edu/ 代码 Spatial CNN for Traffic Lane Detection https://github.com/XingangPan/SCNN 汇总 GitHub:车道线检测最全资料集锦 http://bbs.cvmart.net/articles/158/github-c

数字图像处理:基于霍夫变换的车道线检测

1 数字图像处理:基于霍夫变换的车道线检测 https://zhuanlan.zhihu.com/p/60190848 2 环境 2-1  安装  Anaconda3 环境 2-2  在Anaconda3 环境种安装开发IDE  spyder 刚开始找不到spyder,但是我安装完vs code之后就出现了选择安装spyder的图标 2-3 安装opencv和contrib扩展库 2-4安装matplotlib库 https://blog.csdn.net/weixin_42116878/art

Udacity无人驾驶工程师试看课——车道线检测观后感

第一周的内容就是完成一个项目 Finding Lane Line,是免费试看的,网页版的,最多三四个小时就能看完. 讲的就是整个pipeline,一分钟视频版可以在这里看完:https://www.youtube.com/watch?v=xknesDIgOcA 或者看这个博客https://medium.com/udacity/udacity-self-driving-car-nanodegree-project-1-finding-lane-lines-719ac1adbed9 我也简单描述一

车道线检测文献解读系列(一) 基于机器视觉的高速车道标志线检测算法的研究_李晗

作者背景 基于机器视觉的高速车道标志线检测算法的研究_李晗 东北大学车辆工程硕士学位论文 2006年 [GB/T 7714]李晗. 基于机器视觉的高速车道标志线检测算法的研究[D]. 东北大学, 2006. DOI:10.7666/d.y852642.` 论文结构一览 预处理 灰度化 [亮点]模式判别 选择日间模式还是夜间模式: 在每个检测周期开始时,首先判断采用日间模式还是夜间模式工作.摄像机视野中的上半部分为天空背景,天空亮度可以显著区分日间和夜间环境.由于天空的颜色为蓝离,日间天空的蓝色分

车道线识别之 tusimple 数据集介绍

Tusimple 是一家做自动驾驶的公司,他也公布了一些其在自动驾驶领域积累的数据,其中有一些是和车道线检测相关的.2018年6 月份,其举办了一次以摄像头图像数据做车道检测的比赛,公开了一部分数据及其标注.数据下载数据是:https://github.com/TuSimple/tusimple-benchmark/issues/3 在其doc中可以发现数据个数的一些说明 标注json 文件中每一行包括三个字段 raw_file : 每一个数据段的第20帧图像的的 path 路径 lanes 和

检测车道线——2.选择兴趣区域 Region Masking

通过简单的颜色选择,我们设法消除了图像中除了车道线以外的几乎所有内容.但是,在这一点上,自动提取确切的线条仍然非常棘手,因为我们仍然在周边检测到了一些不是线条线的其他物体. 在这种情况下,我将假定拍摄图像的前置摄像头安装在汽车的固定位置,这样车道线总是会出现在图像的同一区域. 所以在提取行车线的时候,只关注这个梯形区域内的图像,可以避免其他区域的信息造成干扰.这个梯形区域如果选取地太大,则会引入更多无关信息(比如护栏,树木等),如果梯形区域选取太小,则可能看不见行车线,所以这里需要权衡.接下来,

opencv 检测图像线条 霍夫线检测

1 # Writer : [email protected] 2 3 # Data : 2020.3.21 4 5 import cv2 as cv 6 7 import numpy as np 8 9 img = cv.imread('../paojie.jpg') 10 11 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) 12 13 # 50,150 为二值化时的阈值 apertureSize为Sobel滤波器的大小 14 15 edges = cv.C