我感觉这些方法行不通,所以开始寻找一种新的方法。最近我看到一些小组在处理汽车拍摄的图像时采取图像分割的方法:将一个给定的图像分成如道路、汽车、人行道和建筑物等等多类对象。SegNet网络是一种很有趣的图像分割技术,在使用时可直接调用标准的模型结构。这种标准模型包含了带有BN层和Relu激活层的卷积结构、上采样层、池化层以及从中点到网络输出的反卷积层。这种方法没有添加全连接层,就能直接构建出一个完全卷积神经网络。 这似乎也是一个不错的方法,但是车道线可能还会以错误的方式被绘制,为什么不采用神经网络来直接预测车道线本身?所以我调整一下,网络的输入仍是道路图像,但输出为经过绘制的车道线图像。由于我是用绿线标出车道线的,我决定让模型的输出“过滤器”只对RGB的“G”通道起作用。对于RB通道,使用了两个空白过滤器,使相应图像与原车道图像结合。这种方法去除了水平翻转图像会对预测系数产生不良影响的担忧,也加倍了数据集的样本量。在使用这种方法预处理数据时,我可以同时翻转道路图像和车道图像标签。 图15:作为新标签的车道图像 在这里,我重新整理了数据集: 在原始数据集中有1,420张图像(在10帧中取1帧操作后),并删除了227个不能合适标注的图像; 在弯曲道路的视频中,一共有1636张图像,我从中挑选了568张图像; 在Udacity常规项目里给出的视频中,又挑出了另外217张图像; 上述总计1,978张图像; 样本量还太少,且各类分布不均匀,所以小幅度图像旋转后效果不好。在针对性调整后,得到了6,382张图像; 再次通过水平翻转,样本量加倍,得到了12,764张图片。 只要确保道路图像、系数标签和车道图像标签三者互相关联,我仍然可以旋转这些带有这些新标签的图像,无需考虑各系数的分布情况。 由于我从没使用过完全卷积神经网络,所以我按照SegNet网络结构来严格构建网络。幸运的是,我可以用Keras库快速构建,需要注意的是在添加反卷积层后,要确保网络输出图像和输入大小保持一致。在池化层之后,我将输入图像的长宽比调整为80 x 160 x 3(原始宽高比为90 x 160 x 3),并完全镜像前半部模型。因为所使用的池化层大小为2 x 2,如果输入维度为90,很快就不能被2整除,导致模型后半部分构建镜像时出现问题。
图16:SegNet网络结构示意图(从左到右) 在模型训练时存在一些小问题,atv,网络过大导致内存溢出,所以我为每个卷积层和反卷积层添加了BN层和Dropout层,这是减小网络大小和防止过拟合的最有效方法。我在网络的开头设置了BN层,在网络中添加了Dropout层。由于只使用了“G”颜色通道,最终反卷积层的输出大小为80 x 160,这样更容易地与原始路面图像匹配。虽然我调小了输入图像,但是没有大影响。我也将道路图像标记除以255,进行归一化,这能改善收敛时间和最终结果,但是意味着在预测后需要对输出乘以255来恢复维度。 图17:不同模型的效果对比 从视频中可以看出,最终的预测效果不错。但是该视频已经被训练过,所以实际效果可能会虚高。为了检测实际效果,我们使用了车道检测项目中的另一个测试视频,发现该网络对这个视频的预测效果也很好。虽然在处理高速公路立交桥的阴影时存在小问题,但我们很高兴用这个视频证明了该模型的效果。此外,该模型比原有模型的处理速度更快,通常在GPU加速下每秒能处理25-29帧,实时可达到30 FPS。在没有GPU加速时,其每秒5.5FPS的处理速度仍然比每秒为4.5 FPS的CV模型稍快一些。 图18:传统的CV模型与SegNet模型做对比,在这里CV模型误认为两条车道线都在右边。 改进方向 这就是我利用深度学习实现车道检测的全部过程。虽然不是很完美,但它比传统的CV模型更强大。我们也尝试在难度更大的测试视频中识别车道线,从结果中发现了一些问题:在光线和阴影的过渡时或者当强光照到车窗时无法准确预测车道线。以下是我接下来改进模型的一些方向: (责任编辑:本港台直播) |