在工厂场景中检测皮带边缘,可以抽象为简单场景下的车道线检测问题;这里之所以说是简单场景主要有以下两个原因:第一根据赛题要求,只需要检测摄像下方拍摄的皮带边沿即可,两侧皮带的边缘线在评测时会被直接忽略;第二是因为在自动驾驶场景下的车道线检测任务通常会包含很多复杂场景,比如弯线、遮挡以及Y型线等,采用的后处理逻辑也是非常复杂的,而本赛题中不会出现此类复杂场景;评测指标采用Tusimple车道线检测任务的评测方式;

难点主要有以下几个方面:(1)数据集中的边缘线虽然以直线为主,但仍然存在少量带有一定曲率的弯线,需要进行细粒度的分类 (2)训练/测试过程中相邻皮带的处理:在训练时可以把相邻皮带的边缘线看做前景、背景,或者直接忽略掉,也就是在训练时不计入总的loss;推理时,如果有相邻皮带的检测结果,就需要增加一定的后处理逻辑,耗时也可能会相应的增加;

工厂皮带跑偏识别_sed

 

工厂皮带跑偏识别_人工智能_02

数据分布统计

赛题数据的分布情况如下图所示,训练集包含5000张样本,测试集包含1000张样本,所有样本的尺寸均为1920x1080;右边这张图统计了含有大于等于n条边缘线的样本数量,也就是说所有样本均为正样本,每张图至少存在一条皮带(两条边缘线);

算法选型

车道线检测算法可以分为以下几类:

(1)基于分割的方法,如RESASCNN、以及DeepLabV3、BiSeNet 等通用语义分割方法

(2)基于anchor 的方法,如UFLD、CLRNet(3)基于关键点检测的方法,如open-pose

anchor based方法对于自动驾驶场景下的遮挡问题比较有效,但对于弯线检测效果不理想,且耗时相对较高;keypoint based方法,需要实现复杂的后处理串线逻辑,且依然存在耗时较高的问题;传统图像算法容易受到光照、拍摄角度、皮带材质等环境因素干扰,在本赛题中难以满足精度要求;基于分割的车道线检测方法在简单场景下的后处理逻辑非常简单,并且耗时很低,因此最终确定使用基于语义分割的检测方案;

整体方案

工厂皮带跑偏识别_自动驾驶_03

在这里我基于DDRNet语义分割网络来进行整个算法流程的开发;DDRNet是一种实时的语义分割网络,在速度和精度平衡方面达到了SOTA的水平;DDRNet是针对高分辨率输入图像来设计的,比如Cityscape数据集会以2048x1024的原图尺寸输入,而赛题对于实时性的要求较高,因此会以较低的分辨率输入到网络中,对比我们可以对网络结构做出一些调整,比如对DAPPM模块进行精简等等,此外还可以通过修改上采样的插值方式来提高推理速度;

训练/推理实现细节

主要包括以下三部分:

(1)数据预处理(label格式转换): 这一阶段需要将车道线格式的label转化为语义分割的mask label:通过调用opencv绘制直线的方法,并设定一定的线宽,对真值中的边缘线采样点两两连接,即完成了将车道线检测任务转化为语义分割任务;

(2)模型训练:基于 DDRNet23_slim 模型,输入尺寸为 512x288;采用数据增强(小范围平移旋转、改变亮度对比度)、多尺度训练、OHEM等多种策略,提高检测精度,增强模型的泛化能力;

(3)后处理逻辑:如右图所示,对mask值分别为1和2的左右两条边缘线的pixel分别进行统计,在y方向每隔10像素计算x的平均坐标;

工厂皮带跑偏识别_自动驾驶_04