前言

准备在欧卡2实现无人驾驶,第一步使用paddlepaddle框架的paddleseg模块对车道线语义分割。

语义分割数据集

本文采用的数据集是tusimple数据集,图森车道线检测数据集。

下载地址:传送门 对数据集做了一些简单的处理,记录原始图像和带标签图像的文件路径关系。

数据集样例:

语义分割样本不平衡_python


语义分割样本不平衡_计算机视觉_02


语义分割样本不平衡_python_03


语义分割样本不平衡_语义分割样本不平衡_04

paddleseg

这是百度深度学习框架推出的语义分割模块,集成了很多大佬写好的模型,只需要直接配置就可以使用这些模块了,对于新手上手比较友好。

paddleseg项目地址:国产深度学习框架,点个star支持一下,github的star在框架的推广上有很直观的反应,所以支持国产从我做起!!! 我这里选择的模型是deeplabv3p + mobilenetv2,选择mobilenet的主要原因是最后生成的__params__文件较小大概7M左右,适合在移动端上部署。

mobilenet的模型文件:

语义分割样本不平衡_人工智能_05

配置文件

EVAL_CROP_SIZE: (512, 256) # (width, height), for unpadding rangescaling and stepscaling
TRAIN_CROP_SIZE: (512, 256) # (width, height), for unpadding rangescaling and stepscaling
AUG:
    AUG_METHOD: "stepscaling" # choice unpadding rangescaling and stepscaling
    FIX_RESIZE_SIZE: (512, 256) # (width, height), for unpadding
    INF_RESIZE_VALUE: 500  # for rangescaling
    MAX_RESIZE_VALUE: 600  # for rangescaling
    MIN_RESIZE_VALUE: 400  # for rangescaling
    MAX_SCALE_FACTOR: 2.0  # for stepscaling
    MIN_SCALE_FACTOR: 0.5  # for stepscaling
    SCALE_STEP_SIZE: 0.25  # for stepscaling
    MIRROR: False
        
BATCH_SIZE: 16
DATASET:
    DATA_DIR: "./dataset/tusimple_lane_detection/"
    IMAGE_TYPE: "rgb"  # choice rgb or rgba
    NUM_CLASSES: 19
    TEST_FILE_LIST: "dataset/tusimple_lane_detection/training/list.txt"
    TRAIN_FILE_LIST: "dataset/tusimple_lane_detection/training/train1.txt"
    VAL_FILE_LIST: "dataset/tusimple_lane_detection/training/val_part1.txt"
    IGNORE_INDEX: 255
    SEPARATOR: " "
FREEZE:
    MODEL_FILENAME: "__model__"
    PARAMS_FILENAME: "__params__"
MODEL:
    DEFAULT_NORM_TYPE: "bn"
    MODEL_NAME: "deeplabv3p"
    DEEPLAB:
        BACKBONE: "mobilenetv2"
        ASPP_WITH_SEP_CONV: True
        DECODER_USE_SEP_CONV: True
        ENCODER_WITH_ASPP: False
        ENABLE_DECODER: False
TRAIN:
    PRETRAINED_MODEL_DIR: u"pretrained_model/mobilenet_cityscapes"
    MODEL_SAVE_DIR: "saved_model/deeplabv3p_mobilenetv2_cityscapes"
    SNAPSHOT_EPOCH: 10
    SYNC_BATCH_NORM: True
TEST:
    TEST_MODEL: "saved_model/deeplabv3p_mobilenetv2_cityscapes/final"
SOLVER:
    LR: 0.005
    LR_POLICY: "poly"
    OPTIMIZER: "sgd"
    NUM_EPOCHS: 100

== EVAL_CROP_SIZE: (512, 256)==
注意这个参数,这个大小对推理过程影响很大,尺寸过大推理速度慢,尺寸过小识别的车道线会变形。数据增强应该加上模糊化,颜色光纤干扰等,但是我加上了之后训练实在太慢了,100轮要训练个两天两夜的样子…所以之后电脑有空再训练一个。

训练效果

语义分割样本不平衡_语义分割样本不平衡_06


语义分割样本不平衡_计算机视觉_07


因为数据集是图森科技采集的汽车行驶记录仪的图片,并不是端到端的数据集,所以有一些车道线的场景识别的效果确实不太好,这里尝试了使用labelme来标注自己的数据,但是实在是太麻烦了并且要很多数据。。。标注数据又十分的无聊且枯燥的,所以还是先将就着,首先把算法完善再考虑这些问题。

关于识别速度:

使用deeplabv3p + mobilenetv2模型,不打开欧卡2游戏,本地部署了paddle1.8.0加gpu,单纯推理图片有0.1s的延迟,evel_size是(512,256),如果尺寸再小点识别速度会相对提高一点,10HZ的频率在低速上也能勉强适用,还是那句话先完善整个框架的算法,后面再做优化。

车道线分割

有了上图识别的车道线,还需要计算出当前车行驶的车道以及左右车道线的位置,这样才能推理出应该给的方向盘速度,这里我想到了两种办法:

  • 第一种是将识别得到的车道线黑白图加上打角的角度标签,然后用深度学习的模型来识别图片给出推理的角度,这种方法应该是可行的,但是这个识别的图像有些场景会出现丢线的情况,不太好处理。
  • 第二种是适用opencv来处理车道线,计算黑白图片的直方图,根据直方图来推理左右车道线的位置,这种方法因为视屏帧是连续的,我们出现丢线可以通过上一帧来做一个推理计算下一帧的车道线位置。

方法一的实现:
未完待续…

方法二的实现:

这里我采用将图像做如下分割:

语义分割样本不平衡_python_08


蓝色的线分割出来的是我想处理的区域,红色的线将预处理区域划分成6块,分别计算六块的直方图,然后推理得到左右车道线的位置,最后做二次多项式拟合计算出左右车道线的公式。

分块直方图(不同颜色表示不同块的像素直方图):

语义分割样本不平衡_计算机视觉_09


根据此图可以看到,两个尖峰围起来的区域就是当前车道区域!