项目介绍
我们每天都会产生各种垃圾,比如废纸、塑料瓶、果皮等。大家都知道垃圾分类对环境保护的重要性,但是在实际操作中,不是所有人都能准确地把垃圾放入正确的垃圾桶。那能不能通过人工智能技术帮助解决这个给问题呢?
当然可以,我们可以利用物体分类算法来解决这个问题。物体分类算法可以让计算机识别并区分不同的物体,包括各种类型的垃圾。我们只需要用摄像头拍摄垃圾图片,然后让物体分类算法识别垃圾种类,就可以成功帮助我们完成垃圾分类任务了。
本节课我们就使用行空板和摄像头,制作一个AI垃圾分类装置,帮助我们更好地进行垃圾分类,让我们更好地管理和保护我们的教室环境。

1 项目功能
本项目将制作一个AI垃圾分类装置,利用物体分类算法实现垃圾种类的识别。
物体分类算法的实现分为采集、训练、识别三个过程,因此项目也将分为下面三个任务:
■ 任务一:采集垃圾图片。通过摄像头采集不同种类的垃圾图片,建立图片集以便于后面的训练和识别。
■ 任务二:训练垃圾分类模型。基于建立好的图片集,让行空板处理图片,训练获得专门用于垃圾分类的模型。
■ 任务三:识别垃圾种类。利用训练好的垃圾分类模型,识别摄像头拍摄的垃圾种类,并显示提示信息。
任务一:采集垃圾图片
先来利用摄像头采集不同种类的垃圾图片,建立图片集。
1 连接硬件
首先,将USB摄像头接入行空板USB接口。然后,将行空板通过USB线连接到电脑上,等待行空板屏幕亮起,并显示行空板LOGO,表示连接成功。

2 准备软件
按照下面步骤,设置Mind+软件编程方式为 Python图形化编程,并完成行空板的加载和连接。

3 编写程序
编写程序,完成按键采集不同垃圾种类图片,建立训练所用图片集。
物体分类库并不属于内置库,而是属于用户自定义库功能,所以需要加载用户自定义库。进入“扩展库”中的“用户库”检索“物体分类”,点击“行空板机器学习”图形化库,完成加载。
注意:物体分类算法功能依然要使用一些依赖库,本项目不需要安装是因为相关依赖库已经内置在行空板固件里了。

加载完文字识别指令后,我们就可以按照“初始化摄像头 → 读取摄像头画面图片 → 按键拍摄保存对应分类图片到指定的文件夹中”的流程编写程序,由于录入的图片不止一张,别忘了放 循环执行 。
完整参考代码如下图。

4 运行程序
点击运行按钮,运行程序,行空板屏幕上显示视频画面。摄像头画面对准垃圾(可参考附录可回收垃圾图片或者对准实物拍摄),当垃圾较为完整的出现在视频画面中时,按下A键,拍摄一次图片。此时,终端会显示采集图片存储的位置和张数。

长按A键,同一分类下可以采集多张图片,一般来说采集图片越多,识别准确率越高,但是训练耗费的时间就越久,本项目我们选择采集30到40张图片即可。学习结束后,点击停止运行,结束本次采集。

拍摄的图片在哪里?进入“行空板中的文件”,在下图所示位置,查看和下载拍摄图片。

5 小试牛刀
请修改代码,重复刚才的过程,采集不可回收垃圾的图片。
提示:每次运行只能学习一个类别图片,填写分类名称时,别忘了按顺序添加序号。修改核心代码示例如下:

任务二:训练垃圾分类模型
用采集的图片训练一个专门用来垃圾分类的模型。
1 编写程序
训练垃圾分类模型需要经过“导入图片集 → 创建模型 → 训练模型 → 保存模型”几个步骤。
由于我们目前只采集了两个分类的垃圾图片,在 导入图片 指令中填入分类数量为2。为了让模型效果更好,我们可以在 训练模型 指令中设置一定数量的训练次数,比如3次。当然,我们也可以加入适当的提示表示训练完成。完整示例代码如下:
注意:训练次数不要填入太多,会导致训练时间变长,也不一定会让模型变得更好。

2 运行程序
检查行空板的连接情况,运行程序,行空板会按照采集图片文件夹顺序导入图片,训练模型。
此时,终端会显示导入图片数量及训练过程,等待直到显示“训练完成”,表示垃圾分类模型训练成功并已保存在行空板内。

保存的垃圾分类模型在哪里?打开“文件系统”,在“行空板中的文件”里即可找到如下图所示的模型文件。

任务三:识别垃圾种类
基于训练好垃圾分类模型,用摄像头拍摄垃圾,按键识别垃圾种类并显示在行空板屏幕上。
1 编写程序
(1)识别垃圾种类
既然要使用摄像头来拍摄图像,利用垃圾分类模型识别垃圾种类,识别垃圾种类就需要导入模型、初始化摄像头、读取摄像头画面、按键识别以及显示摄像头画面几个部分。参考代码如下图所示。

(2)显示识别结果
识别获得的结果有两个“索引”和“置信度”。其中,“索引”表示采集图片时类别文件夹的序号,“置信度”则表示识别为该类别的可能性。

识别结果中没有垃圾类别名称,我们可以建立一个“表格”用“索引”去取“表格”里面的垃圾类别名称。而这个“表格”就叫做列表。

具体实现方法如下:
先建立 分类表 和 识别结果 两个变量用来保存所有垃圾种类名称以及识别的垃圾类别名称。然后,在代码开始部分将 变量分类表 初始化为 [”可回收垃圾”,”不可回收垃圾”],变量识别结果 则初始化为””(双引号内没有内容)。
注意:程序中所使用的符号(引号和逗号)均为英文。

当按键获得识别结果后,从 分类表 中按 识别的索引 取出识别的垃圾类别名称,并存入 变量识别结果。

获得了识别到的垃圾种类的名称,接下来我们就可以将它显示在摄像头画面上。

当然,为了可以看到更加完整的识别信息,我们也可以建立 变量置信度 存储置信度,并将它也显示在摄像头画面上,项目完整示例程序如下图所示:

2 运行程序
点击运行按钮,运行程序,待模型导入成功后,终端会显示“model loaded”表示模型导入成功。

模型导入成功后,行空板屏幕上显示视频画面。摄像头画面对准已学习过的垃圾(可参考附录中的垃圾图片或者对准实物拍摄),当垃圾图像较为完整的出现在视频画面中时,按下A键,识别成功后屏幕显示垃圾类别和置信度。

附录 垃圾图片样例

附件
hgfdgasdhhgdghj2024.05.10
不错