项目实训第一周(车道线检测)

项目实训我主要负责计算机视觉方面,识别出车道线并据此导航。相关内容也更新在我的个人博客上个人网站

相关介绍

车道线检测如果用传统方法,识别速度较慢,效果不够好,容易受到多种因素的干扰,因此我们打算开发并使用深度学习的相关模型,看了许多相关的论文,得知有关SCNN,CNN等扩展模型的车道线检测效果很好,因此准备研究开发,训练测试相关的模型。
首先对于深度学习车道线相关检测,我初步决定采用pytorch或者tensorflow框架来进行模型的建立。
对于车道线检测方面,国际上有大量的研究和模型,我准备研读一下这其中的论文,采取其中的优劣,对其中的模型进行改进。首先我阅读了比较有名的LaneNet模型相关论文,并在Ubuntu下复现了该模型。LaneNet设计了多任务的网络,第一个任务是将背景和车道线进行区分,也就是语义分割。第二个任务则是进行区分不同的车道,从而对于车道线进行实例分割。而在这些任务做完后,需要进一步处理LaneNet输出的每个像素的集合(机器学习中聚类方法),在这里训练了H-Net模型来适应视角等变化进行拟合。

环境配置和代码复现

第一步我先配置了相关环境,python版本为3.5

glog==0.3.1
loguru==0.2.5
tensorflow_gpu==1.15.0
tqdm==4.28.1
matplotlib==2.2.4
opencv_contrib_python==4.2.0.32
numpy==1.16.4
scikit_learn==0.24.1
tensorflow==1.15.0
PyYAML==5.4.1

Python版本最好为3.5,其他版本没试过,安装tensorflow可能会爆出各种问题。可以到官网查看python,tensorflow的相关对应情况。
安装过程中有几个坑,tensorflow需要gpu版进行加速训练,因为我的训练集会较大。同时tenserflow的版本问题一定要注意,2.0版本和1.0版本有较大的区别。一定要注意1.0和2.0版本下使用函数的各种区别。
我pip install并没有找到1.15.0版本的tensorflow,应该换源,但是懒得换了直接用了tensorflow 1.14.0,实测可行。

代码分析和模型训练测试

LaneNet论文中呈现的主要的网络结构为
在这里插入图片描述
该网络为典型的编码-解码网络进行实例分割,作者提供的基础的编码网络为ENet网络,而复现的模型中使用了VGG16作为编码网络,主要呈现在源码中的lanenet_front_end.py和vgg16_based_fcn.py,解码网络主干为FCN,主要呈现在lanenet_back_end.py和vgg16_based_fcn.py中,这又分为两个分支,一个是嵌入分支,一个是分割分支.。
嵌入分支用于在该网络解码得到的输出图中每一个像素对应一个N维的向量,在该N维嵌入空间中同一车道线的像素距离更接近,而不同车道线的像素的向量距离较大,从而区分像素属于哪一条车道线,该分支使用基于one-hot的方法做距离度量学习
分割分支主要用于产生一个二分图,表明哪一部分为背景,哪一部分为车道线,由于正负样本不均衡,文中作者使用了bounded inverse class weighting方法来改变权重

在lanenet_back_end.py中关于计算嵌入分支和分割分支损失的主要源码如下:

##计算损失,两分支的损失
 def compute_loss(self, binary_seg_logits, binary_label,
                     instance_seg_logits, instance_label,
                     name, reuse):
        """
        compute lanenet loss
        :param binary_seg_logits:
        :param binary_label:
        :param instance_seg_logits:
        :param instance_label:
        :param name:
        :param reuse:
        :return:
        """
        ## 代入到解码后预测的值和原来的label值,采用相应的损失计算方式
        with tf.variable_scope(name_or_scope=name, reuse=reuse):
            # calculate class weighted binary seg loss
            with tf.variable_scope(name_or_scope='binary_seg'):
                binary_label_onehot = tf.one_hot(
                    tf.reshape(
                        tf.cast(binary_label, tf.int32),
                        shape=[binary_label.get_shape().as_list()[0],
                               binary_label.get_shape().as_list()[1],
                               binary_label.get_shape().as_list
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值