LaneNet代码实现细节以及遗留问题

最近比较忙很久没有维护这里了,可能还是有很多人会有问题,我重新提交了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是各自不同的。

# shared stages
with tf.variable_scope('LaneNetBase'):
    initial = enet_stage.iniatial_block(input_tensor, isTraining=self._phase)
    stage1, pooling_indices_1, inputs_shape_1 = enet_stage.ENet_stage1(initial, isTraining=self._phase)
    stage2, pooling_indices_2, inputs_shape_2 = enet_stage.ENet_stage2(stage1, isTraining=self._phase)

# Segmentation branch
with tf.variable_scope('LaneNetSeg'):
    segStage3 = enet_stage.ENet_stage3(stage2, isTraining=self._phase)
    segStage4 = enet_stage.ENet_stage4(segStage3, pooling_indices_2, inputs_shape_2, stage1, isTraining=self._phase)
  • 16
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 118
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值