系统实现
硬件实现
将树莓派的第29号引脚接到L298N电机驱动的IN1端,树莓派的第31号引脚接到L298N电机驱动的IN2端,树莓派的第33号引脚接到L298N电机驱动的IN3端,树莓派的第35号引脚接到L298N电机驱动的IN4端,树莓派的第38号引脚接到L298N电机驱动的ENA端,树莓派的第40号引脚接到L298N电机驱动的ENB端,树莓派的第36号引脚接到蜂鸣器模块的IO口,树莓派的第11号引脚接到LED灯模块的R_COLOR_IO口,树莓派的第13号引脚接到LED灯模块的Y_COLOR_IO口,树莓派的第15号引脚接到LED灯模块的G_COLOR_IO口,树莓派的第16号引脚接到左侧红外避障模块的IO口,树莓派的第18号引脚接到右侧红外避障模块的IO口,树莓派的第22号引脚接到前侧红外避障模块的IO口,树莓派的第32号引脚接到后侧红外避障模块的IO口。 实际外观如下图所示(实际情况以代码为准)。
软件实现
训练样本获取源码解析:
在zth_process_img.py中主要对小车接口进行定义、对接口输入输出模式进行设置,对接口使能方式进行设置。
将接口控制和逻辑设计组合成动作函数。部分动作函数如下图所示。
在zth_collect_data.py中主要对摄像头运行方式、图像像素大小、取样帧数进行了设置,同时并行地操纵小车运行和摄像头获取图片。部分程序如下图所示。
图像处理源码解析:
在zth_process_img.py中主要对图片:依据图片名加上对应的标签,并将处理后的图像存入training_data_npz文件夹中。
在zth_train程序中主要建立神经网络模型,神经网络模型框架用kera搭建神经网络,采用卷积,池化,全连接。输入为图像,输出为五个神经元,分别对应左转(0号动作)、右转(1号动作)、前进(2号动作)、后退(3号动作)、停之(4号动作)。
第一步:加载数据集存入内存中,并将其划分为训练集和测试集。源代码如下所示:
第二步:建立卷积神经网络模型,其代码如下所示:
第三步:训练神经网络模型,并将其保存,其保存模型,TensorBoard存模型结构以及准确率和Loss曲线的代码如下图所示:
在TensorBoard中查看其网络结构图如下图所示:
系统测试
我们将软件实现,并操作小车,获取了一系列打上动作标签的图片信息。将一系列图像信息送入神经网络,进行训练。其训练完成之后的Loss曲线和准确率曲线如下图所示:
从其训练结果中显示,其准确率达到接近百分之九十,准确率和Loss都趋于收敛。
不足与展望
虽然,如第四章提到的,我们完成卷积神经网络的调试和残差检测,初步地得到了一个可用的神经网络,然而,这个神经网络的实际表现并不如预期般乐观,我们分析,可能的原因如下:
一、样本量的规模太小,在数量上并没有满足训练一个良好的神经网络所需的数量级。
二、样本的代表性不足,由于我们在实验过程中并未对样本进行清洗,同时,并没有在具备理论上和实践经验上的支撑的条件下设计道路,并且,光照、杂物的放置也对神经网络的识别产生了一定的影响,这些因素导致了神经网络的表现不如理论上良好。
三、样本的多样性不足,由于实验条件和人员时间分配的限制,我们并没有设计多种光照、多种地板纹路、不同道路类型等因素变换的实验,没有获取到相应的样本,直接影响到了神经网络的泛化性不足。
同时,虽然硬件上,我们安装了红外避障模块、LED灯模块、蜂鸣器模块,但是,受限于实验时间,我们仅仅完成了初步的硬件安装和初步的程序调试,并没有将其和神经网络程序较好的结合起来,故并没有在报告中写出相应的程序和硬件调试。
并且,我们虽然使用了树莓派3B+作为逻辑处理的核心,但由于时间限制,仍然缺乏对操作系统理论的认识和实践的经验,并没有对操作系统做出恰当的调整。
虽然课程将要结束,但是我们的学习远远没有结束。在未来的时间中,我们期望更多地学习操作系统、神经网络算法等相关的知识,累积更多的实践经验,尽可能地锻炼自己,能真正参与实现无人驾驶技术,造福人民,提供人们的生活水平。
我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究分享深度学习、机器博弈、强化学习等相关内容!期待您的关注,欢迎一起学习交流进步!