回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

行空板无人驾驶系列课程 第6课:转向标志识别系统 简单

头像 zoey不种土豆 2025.06.09 20 0

本系列课程资料文件: https://pan.baidu.com/s/13WVPlfvvqYAWtwLmy4_EXA?pwd=s9j8 提取码: s9j8 

 

随着科技的进步,自动驾驶技术正逐步走进我们的生活。其中,转向标志识别系统是自动驾驶汽车的“眼睛”,能够帮助车辆根据道路标志自动转向,为我们提供更安全和便捷的出行体验。

这个系统通过车载摄像头实时捕捉道路上的转向标志,然后利用图像处理和机器学习技术进行识别。这意味着,小车可以识别出“左转”、“右转”等标志,并自动执行相应的转向操作。

image.png

任务目标

设计并实现一个基于摄像头的智能小车转向标志识别系统,能够通过摄像头捕捉到的实时图像数据,识别不同的转向标志(左转、右转),并根据识别结果执行相应的转向操作。

第12课 转向标志识别系统319.png

 

知识点

1. 通过拍摄的照片,训练转向标志识别模型

2. 掌握如何使用巡线传感器控制小车在十字路口转向

 

材料清单

硬件清单:

image.png

 

软件使用:Mind+编程软件

下载地址:https://mindplus.cc/

image.png

 

动手实践

这个项目将重点放在转向标志识别系统设计部分,我们将收集大量转向标志左转、右转的图像,然后使用深度学习框架TensorFlow来训练识别模型。最后,将训练好的模型部署在小车上,配合USB摄像头来进行转向标志识别。因此,分为以下几个小任务来实现。

任务一:采集转向标志图像

通过摄像头,采集左转标志和右转标志的图像,并将采集好的图像,保存在行空板文件中。

任务二:训练转向识别模型

使用TensorFlow模型,对收集好的图像数据进行模型训练,并将训练好的模型进行保存。

任务三:转向标志识别

将训练好的识别模型部署在行空板小车上,小车在巡线过程中,到达十字路口后,如果识别到左转标志,小车左转 ;识别右转标志,小车右转。

 

任务一:采集转向标志图像

1. 硬件连接

使用type-c转A数据线,将USB音频模块与行空板连接,然后再使用type-c转A线将摄像头连接在音频模块上。

第12课 转向标志识别系统946.png

2. 软件准备

(1)添加官方库:点击“扩展”,在“官方库”中,选择“行空板”与“Opencv”。

(2)添加用户库:选择“maxbot神经网络”、“opencv_maxbot”。

第12课 转向标志识别系统1057.png

 

3. 编写程序

本任务中图像采集方法与第4课货物识别系统的任务一相同,此处仅简要介绍步骤,详细内容可参考第4课

(1)创建文件夹

首先,新建“变量file_name”,并初始化变量的值为“/root/data2/right”。使用“创建文件夹 来保存数据”指令,在“/root/data2”中,创建一个名为“right”的文件夹,用来保存采集到右转的卡纸图像。

第12课 转向标志识别系统1264.png

 

(2)打开摄像头并显示图像

打开摄像头,并从摄像头中获取图像,然后将图像进行裁剪后,显示在行空板上。

注意:这里不需要对图像进行翻转操作。

第12课 转向标志识别系统1360.png

 

(3)采集图像并保存

当按钮A被按下时,开始采集图像,最后将采集的图像保存在创建好的文件夹中。

第12课 转向标志识别系统1434.png

 

区域图像采集的完整程序如下:

第12课 转向标志识别系统1478.png

 

4. 程序运行

远程连接192.168.1.80,连接成功后,点击运行。程序运行成功后,Mind+终端打印区出现提示“按下A键开始图像数据采集”。图像采集操作如下:将USB摄像头,对着右转卡纸,行空板上出现图像后,按下A键不松手,可快速采集图像数据。直到采集到大约500张图像数据后,松开按键。

注意:采集图像过程中,需要调整摄像头角度,多角度采集右转标志图像,可以提高识别率。

第12课 转向标志识别系统1694.png

 

5. 试一试

这个项目中,还需要采集左转标志的图像,大家尝试一下,修改程序中的file_name,采集左转标志的图像。

提示:任务一的程序中修改file_name中的文件名,再次运行程序后,进行对应的图像采集即可。

第12课 转向标志识别系统1828.png

 

任务二:训练转向识别模型

1. 软件准备

(1)打开Mind+:按照下面的图示完成软件准备工作。

第12课 转向标志识别系统1899.png

(2)添加用户库:选择“maxbot神经网络”、“opencv_maxbot”、“numpy”。

第12课 转向标志识别系统1974.png

 

2. 编写程序

要完成物体识别模型的训练,需要用到卷积神经网络算法,程序主要通过以下5个步骤来完成:导入数据集、数据预处理、创建神经网络、训练模型、保存模型。

1. 导入数据集

训练模型需要用到采集到的图片,新建“变量dataset_path”,并初始化变量的值为图片保存的路径“/root/data2”,然后新建“列表classes”,并初始化列表的值为文件夹名。最后,使用“初始化numpy”与“初始化tensorflow模块”指令,将numpy库和tensorflow库,进行初始化。

第12课 转向标志识别系统2243.png

 

2. 数据预处理

要处理数据,使用“加载图片数据训练集 和验证集 数据 数据源 比例 输入大小 ”指令,从数据集目录中加载图片数据,并创建训练集和验证集。数据集和验证集创建成功后,使用“创建顺序模型 ”指令,创建一个序列模型,并将其命名为“sign_model”,用来存储创建好的模型。

第12课 转向标志识别系统2414.png

3. 创建神经网络

需要使用“为模型 添加 层”与“卷积层,卷积核数量 激活函数为 ,输入数据格式 层”指令,分别创建三个卷积层和池化层,需要修改卷积层的卷积核数量和输入数据格式。使用同样的方法再添加一层展平层和两层Dense层。通过3层卷积层、3层池化层、1层展平层、两层dense层,构建成一个完整的神经网络模型。

第12课 转向标志识别系统2600.png

 

4. 训练模型

训练模型的过程没有对应的程序指令,但是我们可以通过“打印 ”和“模型的 结构 ”指令,对训练模型的过程和训练次数进行打印。在训练模型时,需要先使用“设置模型 参数,优化器,损失函数,评价函数”指令,对模型进行编译。

第12课 转向标志识别系统2742.png

 

5. 保存模型

使用“训练模型 训练数据集 训练次数 验证数据集”指令,进行模型训练。最后使用“以saved_model格式保存模型 到 ”指令,将训练好的模型进行保存。保存完成后,使用“将saved_model模型 转化为ONNX模型 ”指令,将TensorFlow模型转换为ONNX格式。

第12课 转向标志识别系统2915.png

 

训练转向识别模型的完整程序如下:

第12课 转向标志识别系统2961.png

 

3. 程序运行

远程连接192.168.1.80,连接成功后,点击运行。直到行空板和Mind+终端显示“模型转化完成,程序终止”字符串后,模型训练完成,自动退出程序。

第12课 转向标志识别系统3071.png

 

任务三:转向标志识别

1. 硬件连接

这个任务中,需要使用5个巡线传感器,具体的引脚连接方式如下:

第12课 转向标志识别系统3147.png

 

2. 软件准备

(1)添加官方库:点击“扩展”,在“官方库”中,选择“行空板”与“Opencv”。

(2)添加用户库:选择“numpy”、“opencv_maxbot”、“maxbot神经网络”、“Maxbot行空板小车电机驱动”。

第12课 转向标志识别系统3284.png

 

3. 编写程序

使用ONNX模型进行物体识别,需要通过模型加载和预处理、图像处理、图像预测与展示这三个步骤。这些步骤已在第4课任务三中学习过,具体说明可参考该部分内容,此处不再赘述。

注意:因只训练了左转和右转识别模型,因此创建的Numpy数组为1,2。

第12课 转向标志识别系统3439.png

 

摄像头识别和巡线是两个独立的功能,需通过多线程实现同时运行。使用“线程对象thread启动”指令与“当线程对象thread1启动后执行”指令,在“Python主程序开始”下,启动线程。在“当线程对象thread1启动后执行”指令下,并添加“循环执行”指令。

第12课 转向标志识别系统3597.png

 

巡线的程序,需要在线程中来完成。可以新建一个“函数 line_track”,并在函数体中完成巡线的程序,然后在线程启动的循环执行指令中,调用“函数 line_track”即可。

注意:需要在“Python主程序开始”下,使用“pin初始化 引脚号 模式 数字输入”指令,对连接在P10 、P11、P13引脚上的L、C、R三个巡线传感器进行引脚初始化操作。

第12课 转向标志识别系统3804.png

小车在巡线过程中,怎么才能判断已经到达十字路口呢?通过下面的示意图来了解一下,哪些情况能够确定小车到达十字路口。

第12课 转向标志识别系统3897.png

如上图所示,小车到达十字路口的判定条件有两种:第一种,当左侧三个巡线传感器(L1、L、C)同时检测到黑线。第二种,当右侧三个巡线传感器(R1、R、C)同时检测到黑线,这两种情况,都能说明小车到达十字路口。

第12课 转向标志识别系统4029.png

上面两种情况中,只需要满足一种即可,因此使用逻辑运算符“”将两个判断小车到达十字路口的条件,连接起来。由于L1、L、C这三个巡线传感器几乎在同一条线上,因此只要当L1和C巡线传感器同时检测到黑线时(使用逻辑运算符“与”),就能说明L1、L、C这三个巡线传感器都检测到黑线。同理,右侧也只需要判断R1和C巡线传感器同时检测到黑线即可。

注意:需要在“Python主程序开始”下,使用“pin初始化 引脚号 模式 数字输入”指令,对连接在P12 、P14引脚上的L1、R1两个巡线传感器进行引脚初始化操作。

第12课 转向标志识别系统4311.png

当小车到达十字路口后,使用“电机全部停止”指令,让小车停在十字路口两秒。然后开始判断该十字路口是否出现转向标志。

第12课 转向标志识别系统4397.png

这里,我们以识别到左转标志为例。当识别到左转标志时,也就是“变量 predict_result”的值为“left”,使用“电机 以300速度正转”前进0.2秒,并通过M1、M2电机的转速差,控制小车左转0.4秒。

注意:这里用到了“变量 predict_result”,需要在线程启动指令下,设置该变量为全局变量

第12课 转向标志识别系统4584.png

通过设置M1电机反转(250速度)和M2电机正转(300速度),利用转速差实现小车左转。如何判断左转完成?当中间巡线传感器C检测到黑线时,说明左转完成。使用“重复执行直到 ”指令,判断最中间的巡线传感器C是否检测到黑线,如果检测到黑线,说明左转完成。

第12课 转向标志识别系统4739.png

左转完成后,将“变量predict_result”设置为空文本字符,以便下次检测转向标志。

第12课 转向标志识别系统4814.png

下面,以同样的方式,完成识别右转标志的程序,完整程序如下:

微信图片_2025-06-13_135648_059.png

4. 程序运行

远程连接192.168.1.80,连接成功后,点击运行。程序运行成功后,摄像头打开,将摄像头检测到的画面实时显示在行空板屏幕上,小车开始巡线。在巡线过程中,小车到达十字路口后,会先停下来,如果识别到左转标志,小车左转;如果识别到右转标志,小车右转。

注意事项:

1. 转向标志识别对光线要求较高,需确保光线均匀。

2. 可以根据实际情况调节HSV的范围上限和范围下限。

3. 可以使用卡纸夹,将转向标志卡纸立起来,并调节摄像头到合适的位置。

第12课 转向标志识别系统5119.png

5. 想一想

思考: 小车识别转向标志后,为何需先前进0.2秒再转向0.4秒?直接转向会有什么问题?如果不前进0.2秒,不执行对应的转向0.4秒,而是直接执行转向操作,会出现什么问题呢?

 

挑战自我

小车到达十字路口,面临的是左转、右转、直行的选择,但是上面几个任务,我们只完成了左转和右转的操作。下面,大家通过上面学习过的内容,增加直行的图像采集,然后训练新的识别模型,最后修改任务三中的程序,让小车可以识别左转、右转、直行标志,并在识别成功后,执行对应的操作。

第12课 转向标志识别系统5377.png

评论

user-avatar