2024-6-14 17:52:47 [显示全部楼层]
2577浏览
查看: 2577|回复: 6

[教程] 基于行空板的CNN货物识别系统

[复制链接]
科技的发展使得自动化和智能化成为现代物流、仓储和零售业的重要趋势。而无人驾驶小车和货物识别技术的应用也得到了更加广泛地关注。而货物识别技术就可以帮助小车识别和处理不同的货物,进一步提升自动化和智能化的水平。本项目将使用行空板和USB摄像头,设计一个可以识别鞋子、纸箱以及瓶子的货物识别系统。

基于行空板的CNN货物识别系统图1

任务目标
当摄像头识别到鞋子、纸箱、瓶子这几个物体时,将对应的货物名称在Mind+终端打印出来。

基于行空板的CNN货物识别系统图2

材料清单
硬件清单:

基于行空板的CNN货物识别系统图3

软件使用:Mind+编程软件 x1

接下来我们将通过采集、训练以及识别三个过程,逐步体验CNN的货物识别实现过程。

任务一:采集物体图像
1. 硬件连接
将USB摄像头连接到行空板上,如下图。硬件连接成功后,使用USB线将行空板连接到计算机。

基于行空板的CNN货物识别系统图4

2. 软件准备
(1)添加官方库:点击“扩展”,在“官方库”中,选择“行空板”与“Opencv”。
(2)添加用户库:选择“numpy”、“opencv_maxbot”、“maxbot神经网络”。
注意:numpy”、“opencv_maxbot”和“maxbot神经网络”的查找,只需要在检索框中输入下列链接,然后点击完成加载。
3. 编写程序
这个任务中,主要是使用USB摄像头,对货物卡纸进行图片拍照。拍好的图片,需要使用“创建文件夹 来保存数据”指令,来对拍好的图片进行保存。使用时填好要保存的路径,也可以用变量保存路径,然后再使用。
注意:文件路径是文本型,所以路径需要放到“文本 ”指令中。


基于行空板的CNN货物识别系统图6


然后,设置摄像画面。打开摄像头,并设置摄像头画面全部显示(全屏)。


基于行空板的CNN货物识别系统图7


接下来,使用“从VideoCapture对象vd中抓取下一帧grab以及状态ret”指令,从捕获的视频流中抓取一帧图像。



基于行空板的CNN货物识别系统图8


图像捕获成功后,使用“获取图片 的高h 宽w 通道数c”指令,获取帧的形状,以便计算裁剪区域。



基于行空板的CNN货物识别系统图9


如何才能计算出裁剪区域的起点坐标和终点坐标呢?上一步我们已经获取了图片的高(h)和宽(w),要从图片中心裁剪出一个正方形区域。因此,要裁剪的正方形边长已经等于图像的高度(h)。

基于行空板的CNN货物识别系统图10


图像起始坐标x,就为(w-h)//2。新建“变量start_x”,并将变量start_x的值赋值为(w-h)//2。



基于行空板的CNN货物识别系统图11


图像起始坐标y,就为(h-h)//2。新建“变量start_y”,并将变量start_y的值赋值为(h-h)//2。


基于行空板的CNN货物识别系统图12


而终点坐标变量end_x变量end_y,只需要在起点坐标(start_x,start_y)的基础上加一个高h就可以了。



基于行空板的CNN货物识别系统图13


然后,使用“对象 调整图像 大小为 ”指令,将图像frame根据计算好的坐标进行裁剪。将裁剪后的图像重新命名为crop_frame,图像裁剪的大小为[start_y:end_y, start_x:end_x]。


基于行空板的CNN货物识别系统图14


使用“显示图像 到窗口”指令,将裁剪后的图像显示在行空板屏幕上。但是,我们希望在行空板上看到的图像是镜像的,所以在显示图像指令前,使用“对象名 将图像 水平翻转”指令,对图像进行水平翻转后再显示。要让摄像头的图像是实时的视频流,使用“每 毫秒刷新图像”指令,每隔1毫秒刷新一次图像。


基于行空板的CNN货物识别系统图15


按下A按键,开始保存图片。通过条件语句“如果……那么执行”指令,对“按钮A被按下?”指令进行判断,如果条件为真,将“对象名 用opencv将图像 剪裁为宽 高 ”指令放到该指令中。然后,将图像crop_frame裁剪为宽96,高96的图片,并将裁剪后的图片重新创建一个对象名resized_frame。
注意:“对象名 用opencv将图像 剪裁为宽 高 ”指令,是指对图像进行缩放。其中宽96和高96,是将图像缩放到96*96像素,96*96这个尺寸是经常被用于机器学习和深度学习模型的尺寸。


基于行空板的CNN货物识别系统图16


图像缩放后,就需要对图像文件进行保存了。图片保存的格式为“xx.jpg”,保存路径为“/root/data/shoe”,并将路径保存起来,用于给采集的图片命名。

基于行空板的CNN货物识别系统图17


最后,在Mind+终端增加一些文字提示并将采集图片名显示在行空板屏幕上,完整程序如下:



基于行空板的CNN货物识别系统图18


4. 程序运行
连接行空板成功后,点击运行。程序运行成功后,Mind+终端打印区出现提示“按下A键开始图像数据采集”。图像数据采集操作如下:将USB摄像头,对着货物卡纸鞋子,行空板上出现鞋子的图像后,按下A键不松手,可快速采集图像数据。直到采集到大约500张图像数据后,松开按键。
注意:采集图像过程中,需要调整摄像头角度,多角度采集物体图像,可以提高识别率。


基于行空板的CNN货物识别系统图19


5. 试一试
大家还可以尝试采集更多种类的货物图片,比如瓶子和纸箱的图片(bottle、box)。
提示:任务一的程序中修改file_name中的文件名,再次运行程序后,进行对应的图像采集即可。


基于行空板的CNN货物识别系统图20


任务二:训练物体识别模型1. 编写程序
要完成物体识别模型的训练,需要用的卷积神经网络算法,程序主要通过以下6个步骤来完成:导入数据集、数据预处理、创建神经网络、训练模型、评估模型、保存模型。
(1) 导入数据集
采集好的图片保存在路径“/root/data”这个文件夹中,新建“变量dataset_path”,并初始化变量的值为文本型的“/root/data”。然后,我们可以将要识别的货物,按照采集顺序(即为保存并排序后的图片文件夹顺序)写入列表变量,如下图中的列表["bottle","box", "shoe"]。


基于行空板的CNN货物识别系统图21


(2) 数据预处理
这个项目中,要用到numpy库和TensorFlow库,来完成数据集的划分。一般数据集分为用于训练的训练集和用于测试模型效果的验证集。实现过程是:首先进行模块初始化,然后划分数据集并创建模型,完整的程序如下图所示。

基于行空板的CNN货物识别系统图22



(3) 创建神经网络
下面,就可以开始构建卷积神经网络模型了,一个卷积神经网络模型,需要包含多个卷积层、最大池化层和全连接层。添加卷积层,使用“为模型 添加 层”指令。


基于行空板的CNN货物识别系统图23


然后,使用“卷积层,卷积核数量 激活函数为 ,输入数据格式 层”指令,对输入的图片数据进行卷积操作,以从局部区域中提取特征。其中,选择卷积核数量32,表示卷积层的滤波器数量,也就是卷积后得到的特征图数量。激活函数为relu,输入数据格式为(32x32x1)。



基于行空板的CNN货物识别系统图24


使用“为模型 添加 层”指令与“池化层”指令,对卷积层进行池化操作,减小特征图的空间维度,保留最重要的特征。



基于行空板的CNN货物识别系统图25


重复添加第二个卷积层和池化层,修改卷积层的卷积和数量为64,激活函数为relu,输入格式为none。



基于行空板的CNN货物识别系统图26



添加第三个卷积层和池化层,修改卷层的卷积核数量为128,激活函数为relu,输入格式为none。



基于行空板的CNN货物识别系统图27



接下来使用“为模型 添加 层”指令和“展平层”指令,添加展平层。展平层的作用是将卷积层提取的特征图展平成一个向量,为全连接层做准备。



基于行空板的CNN货物识别系统图28



然后,使用“为模型 添加 层”指令,和“Dense层,神经元个数为 激活函数 为 层”指令,添加一个全连接层。设置神经元个数为128,激活函数为relu。这一层的作用是连接上一层的所有神经元,实现对特征的组合和分类。



基于行空板的CNN货物识别系统图29


最后,使用“为模型 添加 层”指令,和“Dense层,神经元个数为 激活函数 为 层”指令,再添加一个全连接层。并修改神经元个数为“列表 变量classes 的长度”,修改激活函数为softmax。这一层的作用是将具有类别数目的classes列表,使用softmax函数进行多类别分类。



基于行空板的CNN货物识别系统图30


(4) 训练模型
卷积神经网络构建成功后,使用“模型 的结构”和“打印”指令,打印一下模型的结构。


基于行空板的CNN货物识别系统图31


(5) 评估模型
使用“设置模型 参数,优化器,损失函数,评价函数”指令,对模型进行编译,并设置优化器为“Adam”,损失函数为“CategoricalCrossentropy”,评价函数为“accuracy”。


基于行空板的CNN货物识别系统图32


模型编译完成后,使用“训练模型 训练数据集 训练次数 验证数据集”指令,结合刚才分好的数据集,进行模型训练。



基于行空板的CNN货物识别系统图33


(6) 保存模型
模型训练完成后,使用“以saved_model格式保存模型 到 ”指令,将训练好的模型保存为TensorFlow SavedModel 格式,可用于部署和后续使用。

基于行空板的CNN货物识别系统图34


使用“将saved_model模型 转化为ONNX模型 ”指令,将TensorFlow模型转换为ONNX格式。



基于行空板的CNN货物识别系统图35


最后,完整训练程序如下:



基于行空板的CNN货物识别系统图36


2. 程序运行
连接行空板,点击运行。直到Mind+终端打印“模型转化完成,程序终止”字符串后,模型训练完成,自动退出程序。
注意:由于要加载的图片数据比较多,整个模型训练所花的时间也比较久,需要3-5分钟左右。


基于行空板的CNN货物识别系统图37


在模型训练过程中,出现了“no module name ‘tf2onnx’”的报错,我们可以在终端中输入指令“pip install tf2onnx”按回车键,进行安装,安装完成后,再次运行程序即可。



基于行空板的CNN货物识别系统图38


任务三:货物识别
1. 编写程序
使用ONNX模型进行物体识别,需要通过模型加载和预处理、图像处理、图像预测与展示这三个步骤。
(1) 模型加载和预处理
首先,使用“初始化numpy”指令与“初始化OPENCV”指令,进行初始化操作,再加载任务二保存好的model.onnx模型。


基于行空板的CNN货物识别系统图39


货物类别和预测结果初始化(赋值为“none”),依然可以通过变量完成。注意类别要和训练时建立的列表顺序保持一致,如“['bottle', 'box', 'shoe']”。



基于行空板的CNN货物识别系统图40


(2) 图像处理
要从摄像头中读取待识别的图像,使用“对象名 初始化 号摄像头并设置帧缓冲”指令,创建一个视频捕获对象“cap”,并初始化摄像头的编号为0。使用“创建窗口winname并设置为全屏”指令,在屏幕上创建一个名为winname的窗口,并将窗口设置为全屏模式,以便将摄像头中的视频流全屏显示在行空板屏幕上。


基于行空板的CNN货物识别系统图41


新建“变量input_data”,并将该变量复制为“创建Numpy数组[1,2,3]”指令,初始化Numpy数组的输入数据。


基于行空板的CNN货物识别系统图42


接下来,就需要使用“从VideoCapture对象vd中抓取下一帧grab以及状态ret”指令,从捕获的视频流中抓取一帧图像。


基于行空板的CNN货物识别系统图43


抓取图片后,需要使用“如果……那么执行”指令与“逻辑运算符 =”指令,判断状态ret的值是否True(判断读取帧是否成功)。



基于行空板的CNN货物识别系统图44


判断条件为真时,说明成功读取了帧,使用“对象名 将图片 转换为HSV格式”指令,将摄像头捕获的图像img从BGR颜色空间转换为HSV颜色空间。



基于行空板的CNN货物识别系统图45


接下来,使用“对象名 提取图片 的范围内像素 范围下限 范围上限 并进行形态学去噪”指令,通过设定范围上限和范围下限的阈值,进行颜色分割,得到我们感兴趣的物体区域。范围下限与范围上限,使用“创建Numpy数组 ”指令,设置下限为“[40,50,50]”,上限为“[100,255,255]”。



基于行空板的CNN货物识别系统图46


图片分割成功后,使用“对象名 剪裁图像 中最大的轮廓 宽 高 并处理数组维度”指令,设置宽为32,高为32,对分割出来的区域进行轮廓检测,来定位可能的物体。
注意:设置宽为32,高为32,是因为要与模型训练的图像尺寸一致。

基于行空板的CNN货物识别系统图47


最后,使用“显示图片img并设置图片名称“Mind+.png””指令,将抓取的图像显示在创建的行空板窗口中,并使用“每1毫秒刷新图像”指令,不断地刷新图像,将摄像头中的视频流显示在行空板上。



基于行空板的CNN货物识别系统图48


(3) 图像预测与展示
模型预测前,需要使用“获取数据 的格式”指令,检查提取的图像区域是否符合模型所期望的输入形状。使用条件判断指令“如果……那么执行”,判断“获取数据 变量input_data的格式”是否为(1,32,32,1)。
注意:在条件(1,32,32,1)中,第一个1是指:单个样本;两个32分别指:高度和宽度为32像素,最后一个1是指:通道参数。


基于行空板的CNN货物识别系统图49


当条件为真时,说明剪裁的图像符合图像预测模型。使用“对象名 用ONNX模型 预测图片数组 ”指令,将变量input_data作为预测图片数组,加载到ONNX模型中,进行预测。



基于行空板的CNN货物识别系统图50


然后,使用“将预测结果 映射到分类 ”指令,从模型输出的预测结果中获取最大概率所对应的类别标签,并返回预测概率最高的类别索引,将类别名称赋值给变量predict_result。



基于行空板的CNN货物识别系统图51


最后,使用“打印”指令,将预测结果打印出来,完整程序如下:



基于行空板的CNN货物识别系统图52



2. 程序运行连接行空板,点击运行。程序运行成功后,行空板上显示摄像头检测到的画面,当识别鞋子、纸箱、瓶子卡纸中的物体时,Mind+终端打印出货物名称。


基于行空板的CNN货物识别系统图53




知识园地
1. 卷积神经网络算法的训练过程
使用卷积神经网络算法训练模型,主要是为了解决物体识别问题。而训练模型程序框架大致分为6步:导入数据集、数据预处理、创建神经网络、训练模型、评估模型、保存模型。
  • 导入数据集:首先需要将准备好的用于训练的图片数据集导入。




基于行空板的CNN货物识别系统图54


  • 数据预处理:在训练模型之前,需要对数据进行预处理以准备好输入模型。数据预处理包括对图像进行随访、裁剪、标准化等操作,提高模型的训练效果。


基于行空板的CNN货物识别系统图55



  • 创建神经网络:根据识别要求,设计并创建卷积神经网络。包括合适的网络结构、确定卷积层、池化层、全连接层的数量和大小,以及选择合适的激活函数和优化算法,这个项目就是利用TensorFlow来构建模型。其中,包括3层卷积层、3层池化层、1层展平层、两层dense层。



基于行空板的CNN货物识别系统图56



  • 训练模型:将准备好的数据输入到神经网络模型中进行训练。通过迭代的方式,将数据输入到模型中,计算损失函数并更新模型的参数。这个过程通过多次迭代和调整参数来优化模型,使其逐渐收敛到最佳状态。其中Epoch2/3,表示在三个训练周期中的第二个周期。



基于行空板的CNN货物识别系统图57



  • 评估模型:使用独立的验证集或测试集对训练得到的模型进行评估。通过计算模型在验证集或测试集上的准确率、精确率、召回率等指标,来评估模型的性能和泛化能力。根据评估结果,可以调整模型的超参数或进行进一步的优化。



基于行空板的CNN货物识别系统图58



  • 保存模型:最后,将训练好的模型保存下来,以便后续在应用中的使用。


基于行空板的CNN货物识别系统图59





2. 卷积神经网络算法的实现过程

神经网络算法的实现过程如下,相比传统的机器学习算法,神经网络算法最大的优势是免去了繁琐的特征工程,由算法自动发现数据潜在特征。



基于行空板的CNN货物识别系统图60






基于行空板的CNN货物识别.zip

2.11 MB, 下载次数: 20

easy猿  初级技师

发表于 2024-6-16 08:53:06

好教程
回复

使用道具 举报

easy猿  初级技师

发表于 2024-6-16 21:57:03

老师我今天用你的教程物体识别模型训练这一步,提示no module named tf2onnx
回复

使用道具 举报

刘睿鹏  见习技师

发表于 7 天前

用二哈识图不可以吗
回复

使用道具 举报

ki123456  中级技师

发表于 5 天前

easy猿 发表于 2024-6-16 21:57
老师我今天用你的教程物体识别模型训练这一步,提示no module named tf2onnx

在模型训练过程中,出现了“no module name ‘tf2onnx’”的报错,可以在终端或者库管理,输入指令“pip install tf2onnx”按回车键,进行安装,安装完成后,再次运行程序即可。

教程里面有写的
回复

使用道具 举报

ki123456  中级技师

发表于 5 天前

刘睿鹏 发表于 2024-6-19 17:55
用二哈识图不可以吗

可以啊,二哈识图是AI摄像头,里面自带物体检测模型。这个是用行空板和USB摄像头拍摄并训练分类模型的,方法和器材都不同。
回复

使用道具 举报

easy猿  初级技师

发表于 前天 20:18

ki123456 发表于 2024-6-21 17:14
在模型训练过程中,出现了“no module name ‘tf2onnx’”的报错,可以在终端或者库管理,输入指令“pip  ...

谢谢老师!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail