近期由于学习要求,复现成功Ultra-Fast-Lane-Detection代码后,记录下自己在原理上的学习笔记,本人刚接触这块,有不对的地方欢迎指正。
代码链接:GitHub - cfzd/Ultra-Fast-Lane-Detection: Ultra Fast Structure-aware Deep Lane Detection (ECCV 2020)
论文创新点:
使用全局特征的基于行的选择问题,提出了一个结构损失模型来明确地建模车道的结构。
对于车道检测,主流的方法有两种,一种是传统图像处理方法,另一种是深度分割方法。
利用全局特征在图像的预定义行中选择车道的位置,而不是基于局部接受域分割车道的每个像素,这大大降低了计算成本。
利用全局特征,获得了整幅图像的接受域。
车道不是用分割地图来表示,而是用不同行上的选定位置来表示。
通过优化所选位置的关系,即结构损失,直接利用车道的刚性、光滑性等特性。
基于全局特征预测每个行锚上所有位置的概率分布。因此,可以根据概率分布来选择正确的位置(即根据车道线分布的全局信息,预测对于某一行锚中车道线的分布)。
![](https://i-blog.csdnimg.cn/blog_migrate/5f92de172bb04e2c826fa6b1052f1b61.png)
下图就是论文中将论文结果的预测方式与分割网络的预测方式进行对比。
![](https://i-blog.csdnimg.cn/blog_migrate/c407f72f05c13bfb6321a122030150b1.png)
针对算法研究中输入/输出数据的解读
输入数据的处理在data文件夹中。
复现采用CULane数据集,读取原始图片格式为(288,800)/(h,w)
选择dataset后做图片预处理,在data/dataset.py中可以看到预处理代码。
def preprocess(self, image, swap=(2, 0, 1)):
resized_img = cv2.resize(image,(800,288)).astype(np.float32)
resized_img=resized_img[:,:,::-1]
resized_img /= 255.0
resized_img -= (0.5, 0.5, 0.5)
resized_img /= (0.5, 0.5, 0.5)
resized_img = resized_img.transpose(swap)
padded_img = np.ascontiguousarray(resized_img, dtype=np.float32)
data/dataloader.py读取数据集定义trian和test数据集,CULane数据为18个点,图片格式为(288,800)/(h,w)
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224,0.225))。
netron查看输入数据格式为
![](https://i-blog.csdnimg.cn/blog_migrate/2c84209863e563f4aad45a09c4b48947.png)
对整个网络的学习引用万能的网友总结出的笔记,图中lane=4,采用的是CULane数据集,因为CULAne数据集没有Tusimple数据集复杂,每条车道线的18个点,其中grid_num=200,就是将整个图分为200份。
![](https://i-blog.csdnimg.cn/blog_migrate/7651e2ec045130162084b71241b27ba3.png)
根据论文中的基于行的选择,最终的输出维度为1*201*18*4。
netron查看的输出数据格式为:
![](https://i-blog.csdnimg.cn/blog_migrate/38f5e8f50b6d2a1d8f855ab434f7d9f3.png)
论文的总体的结构如下,辅助分支显示在上面的部分,它只在训练时有效。特征提取器显示在蓝色框中。基于分类的预测和辅助分割任务分别显示在绿色和橙色框中。对每一行锚进行组分类。
![](https://i-blog.csdnimg.cn/blog_migrate/907c5483179d8354564556f72ba6abe7.png)