当前位置:   article > 正文

LaneNet代码实现细节以及遗留问题_lanenet在culane数据集

lanenet在culane数据集

最近比较忙很久没有维护这里了,可能还是有很多人会有问题,我重新提交了git,地址是https://github.com/stesha2016/lanenet-enet-hnet,如果有问题可以在git上提交,可以一起讨论下。现在这个项目还有一些工作需要继续:

1.聚类的点太多会导致聚类耗时太长,不能达到真正实时的效果。

2.在CULane的数据集上进行训练和测试。

3.可以考虑结合CULane中提到的卷积方式,增强backbone的表达力。


本文的代码分析是针对论文《Towards End-to-End Lane Detection: an Instance Segmentation Approach》,我们看论文会发现论文中很难提供所有的代码实现细节,如果作者好心提供了源代码,那么对照源码就可以看出关于所有细节的处理。但是如果作者没有提供源代码,单从论文上来复现,很大的可能会遇到一系列的小问题,会在一些细节的点上被卡住,而没有办法完美复现论文中的效果。

github上有人对这篇论文进行了复现,代码地址实现了论文中大概70%的内容吧,以这个工程的代码为主导来看论文代码的实现。

论文中提到了两部分网络,一个是lanenet,做车道预测,一个是hnet做车道拟合。

Lanenet

LaneNet网络分为两个分支,论文中的segmentation branch是做二分分类判断是否是车道线,对应的就是代码中的binary segmentation;论文中的embedding branch是为了区分不同的车道线,对应的就是代码中的instance segmentation。代码中将这两部分branch的名字稍作改变确实比较好理解。

Binary segmentation

Binary网络

Binary segmentation的backbone部分代码实现了vgg和dense两种网络结构,实际上与论文中的ENet不一样,建议还是要使用ENet作为backbone,因为vgg和dense肯定都无法达到real time的效果。

我参考github上的enet,将Binary segmentation的backbone替换成了enet。

从论文中我们知道Binary这个分支和Instance这个分支公用ENet的前两个stage,后面三个stage是各自不同的。

  1. # shared stages
  2. with tf.variable_scope('LaneNetBase'):
  3. initial = enet_stage.iniatial_block(input_tensor, isTraining=self._phase)
  4. stage1, pooling_indices_1, inputs_shape_1 = enet_stage.ENet_stage1(initial, isTraining=self._phase)
  5. stage2, pooling_indices_2, inputs_shape_2 = enet_stage.ENet_stage2(stage1, isTraining=self._phase)
  6. # Segmentation branch
  7. with tf.variable_scope('LaneNetSeg'):
  8. segStage3 = enet_stage.ENet_stage3(stage2, isTraining=self._phase)
  9. segStage4 = enet_stage.ENet_stage4(segStage3, pooling_indices_2, inputs_shape_2, stage1, isTraining=self._phase)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/841137
推荐阅读
相关标签
  

闽ICP备14008679号