# 项目实训第一周（车道线检测）

## 环境配置和代码复现

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的相关对应情况。

## 代码分析和模型训练测试

LaneNet论文中呈现的主要的网络结构为

##计算损失，两分支的损失
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]]),
depth=self._class_nums,
axis=-1
)

binary_label_plain = tf.reshape(
binary_label,
shape=[binary_label.get_shape().as_list()[0] *
binary_label.get_shape().as_list()[1] *
binary_label.get_shape().as_list()[2] *
binary_label.get_shape().as_list()[3]])
unique_labels, unique_id, counts = tf.unique_with_counts(binary_label_plain)
counts = tf.cast(counts, tf.float32)
# 作者使用的权重计算方式
inverse_weights = tf.divide(
1.0,
)
## 两分支的损失计算
if self._binary_loss_type == 'cross_entropy':
binary_segmenatation_loss = self._compute_class_weighted_cross_entropy_loss(
onehot_labels=binary_label_onehot,
logits=binary_seg_logits,
classes_weights=inverse_weights
)
elif self._binary_loss_type == 'focal':
binary_segmenatation_loss = self._multi_category_focal_loss(
onehot_labels=binary_label_onehot,
logits=binary_seg_logits,
classes_weights=inverse_weights
)
else:
raise NotImplementedError

# 计算加权后的seg损失
with tf.variable_scope(name_or_scope='instance_seg'):

pix_bn = self.layerbn(
inputdata=instance_seg_logits, is_training=self._is_training, name='pix_bn')
pix_relu = self.relu(inputdata=pix_bn, name='pix_relu')
pix_embedding = self.conv2d(
inputdata=pix_relu,
out_channel=self._embedding_dims,
kernel_size=1,
use_bias=False,
name='pix_embedding_conv'
)
pix_image_shape = (pix_embedding.get_shape().as_list()[1], pix_embedding.get_shape().as_list()[2])
instance_segmentation_loss, l_var, l_dist, l_reg = \
lanenet_discriminative_loss.discriminative_loss(
pix_embedding, instance_label, self._embedding_dims,
pix_image_shape, 0.5, 3.0, 1.0, 1.0, 0.001
)

l2_reg_loss = tf.constant(0.0, tf.float32)
for vv in tf.trainable_variables():
if 'bn' in vv.name or 'gn' in vv.name:
continue
else:
l2_reg_loss *= 0.001
total_loss = binary_segmenatation_loss + instance_segmentation_loss + l2_reg_loss

ret = {
'total_loss': total_loss,
'binary_seg_logits': binary_seg_logits,
'instance_seg_logits': pix_embedding,
'binary_seg_loss': binary_segmenatation_loss,
'discriminative_loss': instance_segmentation_loss
}

return ret


def discriminative_loss_single(
prediction,
correct_label,
feature_dim,
label_shape,
delta_v,
delta_d,
param_var,
param_dist,
param_reg):
"""
discriminative loss
:param prediction: inference of network
:param correct_label: instance label
:param feature_dim: feature dimension of prediction
:param label_shape: shape of label
:param delta_v: cut off variance distance
:param delta_d: cut off cluster distance
:param param_var: weight for intra cluster variance
:param param_dist: weight for inter cluster distances
:param param_reg: weight regularization
"""
# 像素对齐
correct_label = tf.reshape(
correct_label, [label_shape[1] * label_shape[0]]
)
reshaped_pred = tf.reshape(
prediction, [label_shape[1] * label_shape[0], feature_dim]
)

# 统计实例个数
unique_labels, unique_id, counts = tf.unique_with_counts(correct_label)
counts = tf.cast(counts, tf.float32)
num_instances = tf.size(unique_labels)

#计算pixel embedding均值向量
segmented_sum = tf.unsorted_segment_sum(
reshaped_pred, unique_id, num_instances)
mu = tf.div(segmented_sum, tf.reshape(counts, (-1, 1)))
mu_expand = tf.gather(mu, unique_id)

distance = tf.norm(tf.subtract(mu_expand, reshaped_pred), axis=1, ord=1)
distance = tf.subtract(distance, delta_v)
distance = tf.clip_by_value(distance, 0., distance)
distance = tf.square(distance)
# loss(var)
l_var = tf.unsorted_segment_sum(distance, unique_id, num_instances)
l_var = tf.div(l_var, counts)
l_var = tf.reduce_sum(l_var)
l_var = tf.divide(l_var, tf.cast(num_instances, tf.float32))
# loss(dist)
mu_interleaved_rep = tf.tile(mu, [num_instances, 1])
mu_band_rep = tf.tile(mu, [1, num_instances])
mu_band_rep = tf.reshape(
mu_band_rep,
(num_instances *
num_instances,
feature_dim))

mu_diff = tf.subtract(mu_band_rep, mu_interleaved_rep)

intermediate_tensor = tf.reduce_sum(tf.abs(mu_diff), axis=1)
zero_vector = tf.zeros(1, dtype=tf.float32)

mu_norm = tf.norm(mu_diff_bool, axis=1, ord=1)
mu_norm = tf.subtract(2. * delta_d, mu_norm)
mu_norm = tf.clip_by_value(mu_norm, 0., mu_norm)
mu_norm = tf.square(mu_norm)

l_dist = tf.reduce_mean(mu_norm)

l_reg = tf.reduce_mean(tf.norm(mu, axis=1, ord=1))

param_scale = 1.

l_var = param_var * l_var
l_dist = param_dist * l_dist
l_reg = param_reg * l_reg

loss = param_scale * (l_var + l_dist + l_reg)

return loss, l_var, l_dist, l_reg



1.训练过于慢，导致需要跑相当长的时间，训练时间和资源成本很大。
2.测试效果并不是很好，会出现很多的噪点，根据此，我运用了闭运算等方法进行处理，去掉相关的噪点，效果还是比较好的。
3.测试效果不够稳定，这也是该模型的一大缺点，聚类的方法应该会产生极大的不稳定性，而我的任务是增强这个模型的鲁棒性，使得在车道线导航过程中的

[En]

The image processed by image processing method:

[En]

There are several issues that remain unsolved:

1.小车的高度以及摄像头的高度是否可以调节，这将会是比较关键的一点。
2.摄像头成像的像素和一些参数。
3.是否可以提供训练的机器,预估单个GPU需要30小时左右。

Original: https://blog.csdn.net/m0_53446118/article/details/123209163
Author: kdu
Title: 项目实训第一周（车道线检测）

(0)

### 大家都在看

• #### 大学生《Web课程谁》期末网页制作 HTML+CSS+JavaScript 网页设计实例 瑜伽网站企业网站制作

🎉精彩专栏推荐 💭文末获取联系✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主💂 作者主页: 【主页——🚀获取更多优质源码】🎓 web前端期末大作业： 【📚毕设项目精品实战…

人工智能 2023年6月26日
0167
• #### R 语言DataFrame 排序

<span class="pln">Sort:<br>dd </span><span class="pun&…

人工智能 2023年6月2日
0114
• #### 最新MATLAB R2021b超详细安装教程（附完整安装文件）

摘要：本文详细介绍 M a t l a b R 2 0 2 1 _b_的安装步骤，为方便安装这里提供了完整安装文件的百度网盘下载链接供大家使用。从文件下载到证书安装本文都给出了每个…

人工智能 2023年6月4日
0238
• #### 知识图谱从入门到应用——知识图谱的知识表示：向量表示方法

分类目录：《知识图谱从入门到应用》总目录相关文章：· 知识图谱的知识表示：基础知识· 知识图谱的知识表示：符号表示方法· 知识图谱的知识表示：向量表示方法 前文已经介绍过，向量化的…

人工智能 2023年6月5日
0183
• #### python pandas处理数据的优点_Python pandas之数据处理

数据写入 我们可以将数据写入到文件中进行永久性的保存，支持的文件格式有HTML、CSV、JSON、Excel。 csv是最为常见的以纯文本文件存储数据文件的格式，它的优点是通用性很…

人工智能 2023年7月7日
0113
• #### 机器学习笔记 – 使用SMOTE和Near Miss算法处理不平衡数据

一、概述 在机器学习和数据科学中，我们经常遇到一个称为不平衡数据分布的术语，通常发生在其中一个类中的观察值远高于或低于其他类时。由于机器学习算法倾向于通过减少误差来提高准确性，因此…

人工智能 2023年6月16日
0129
• #### spark计算两个DataFrame的差集、交集、合集

spark 计算两个 dataframe 的差集、交集、合集，只选择某一列来对比比较好。新建两个 dataframe ： import org.apache.spark.{Spar…

人工智能 2023年6月2日
0126
• #### 第二章 初识ETL 课后作业

数据清洗（黑马程序员）第二章课后作业 一、填空题 1．__ETL _是实现商务智能(Business Intelligence ,BI)的核心和灵魂。 2．ETL是将业务系统的数据…

人工智能 2023年7月16日
096
• #### pysot-master-train.py 运行记录

人工智能 2023年6月27日
0142
• #### 基于文化算法优化的神经网络预测研究（Matlab代码实现）

目录 1 文化优化算法 2 人工神经网络 3 基于文化算法优化的神经网络预测研究（Matlab代码实现）运行结果 4 参考文献 5 Matlab代码实现 1 文化优化算法 大自然里…

人工智能 2023年7月31日
0145
• #### 软件测试回归案例,什么是回归测试？

什么是 回归测试 ？ 回归测试被定义为一种软件测试类型，以确认最近的程序或代码更改未对现有功能产生不利影响。 回归测试只不过是全部或部分选择已执行的测试用例，然后重新执行以确保现有…

人工智能 2023年6月17日
0127
• #### matlab直方图均衡化代码

人工智能 2023年6月20日
0161
• #### 在PyTorch中如何使用GPU进行加速计算

问题：如何在PyTorch中使用GPU进行加速计算？ 在深度学习中，使用GPU进行计算能够大大提升模型的训练速度。PyTorch提供了简单易用的接口，方便用户将计算任务分配到GPU…

人工智能 2024年1月3日
076
• #### Python统计学10——时间序列分析自回归模型(ARIMA)

时间序列也是传统统计学很重要的一个领域，现代经济类的数据基本都是时间序列数据。时间序列最经典的模型自然是ARIMA模型，全称是 自回归积分滑动平均模型（Autoregressive…

人工智能 2023年7月5日
090
• #### Python——pandas模块—DataFrame数据结构

Python——pandas模块—DataFrame数据结构 * – Python——pandas模块—DataFrame数据结构* pandas* DataFrame…

人工智能 2023年7月7日
0119
• #### YOLOV2-理论笔记

1.加入BN层 卷积过后添加 舍弃Dropout 更加容易收敛 基本上都是卷积网络标配好处就是 ①加快收敛 ②提高了2%map2.训练时候不同v1训练使用224 _224 测试使用…

人工智能 2023年5月31日
0123