赞
踩
最近比较忙很久没有维护这里了,可能还是有很多人会有问题,我重新提交了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网络分为两个分支,论文中的segmentation branch是做二分分类判断是否是车道线,对应的就是代码中的binary segmentation;论文中的embedding branch是为了区分不同的车道线,对应的就是代码中的instance segmentation。代码中将这两部分branch的名字稍作改变确实比较好理解。
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。