Segmentation branch
解决样本分布不均衡
车道线像素远小于背景像素.loss函数的设计对不同像素赋给不同权重,降低背景权重.
该分支的输出为(w,h,2).
Embedding branch
loss的设计思路为使得属于同一条车道线的像素距离尽量小,属于不同车道线的像素距离尽可能大.即Discriminative loss.
该分支的输出为(w,h,n).n为表示像素的向量的维度.
实例分割
在Segmentation branch完成语义分割,Embedding branch完成像素的向量表示后,做聚类,完成实例分割.
![9620ad73e29468f3d7089046b0009e01.png](https://i-blog.csdnimg.cn/blog_migrate/afd4d8ffda79cbed41afdc01def3f4d3.jpeg)
H-net
透视变换
to do
车道线拟合
LaneNet的输出是每条车道线的像素集合,还需要根据这些像素点回归出一条车道线。传统的做法是将图片投影到鸟瞰图中,然后使用二次或三次多项式进行拟合。在这种方法中,转换矩阵H只被计算一次,所有的图片使用的是相同的转换矩阵,这会导致坡度变化下的误差。
为了解决这个问题,论文训练了一个可以预测变换矩阵H的神经网络HNet,网络的输入是图片,输出是转置矩阵H。之前移植过Opencv逆透视变换矩阵的源码,里面转换矩阵需要8个参数,这儿只给了6个参数的自由度,一开始有些疑惑,后来仔细阅读paper,发现作者已经给出了解释,是为了对转换矩阵在水平方向上的变换进行约束。
代码分析
binary_seg_image, instance_seg_image = sess.run( [binary_seg_ret, instance_seg_ret], feed_dict={input_tensor: [image]} )
输入(1,256,512,3)输出binary_seg_image:(1, 256, 512) instance_seg_image:(1, 256, 512, 4)
完成像素级别的分类和向量表示
class LaneNet的inference分为两步.
第一步提取分割的特征,包括了用于语义分割的特征和用以实例分割的特征.
class LaneNet(cnn_basenet.CNNBaseModel): def inference(self, input_tensor, name): """ :param input_tensor: :param name: