本文主要是介绍TinyML:Edge Impulse训练图片分类模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文将介绍如何在没有任何深度学习知识背景的情况下,如何使用Edge Impulse快速训练一个图片分类网络。
本次教程使用到的是XIAO ESP32S3 Sense开发板,该开发板带有数字麦克风和ov2640摄像头,能够满足本次项目的要求。本文同时也适用于其它带有ov2640摄像头的ESP32开发板,只需要修改对应摄像头的管脚映射即可。
软硬件设备
- XIAO ESP32S3 Sense开发板
- Edge Impulse
- Arduino
Arduino 环境搭建
本次教程基于Arduino进行编程实现,因此我们首先需要将ESP32板包添加到Arduino IDE中。
导航到文件>首选项,并在“Additional Boards Manager url”末尾添加一行url: https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json(国内可能需要魔法)
导航到Tools > Board > Boards Manager…, 在搜索框中键入关键字* esp32 选择最新版本的 esp32, 然后安装它。
选择您的板和端口。 在Arduino IDE的顶部,您可以直接选择端口。这可能是COM3或更高版本(COM1和COM2通常保留用于硬件串行端口),并在左侧的开发板中选择对应的开发板。这里我们选择的是XIAO_ESP32S3。
至此我们就完成了XIAO ESP32S3程序编写环境的准备。
Edge Impulse介绍
Edge Impulse 是一个用户友好的开发平台,用于在边缘设备上进行机器学习。它为初学者提供了友好且强大的网页交互界面和工具包,涵盖 TinyML 学习路径所需的从数据收集到模型部署的整个流程。可以让你快速实现自己的模型训练和推理。Edge Impulse 可利用 TensorFlow 生态系统进行训练和优化,并将深度学习模型部署到嵌入式设备上。
创建工程
首先先创建一个新工程。
工程创建完成后会进入到我们的工程界面下,之后的整个训练过程将通过这个仪表盘中进行实现。
首先拉到仪表盘的底部,在右下角会有一个Project info选项卡。由于我们仅仅需要对图片进行分类,不需要对图片进行目标检测(后者需要在图片上画框将识别到的物体圈出),因此我们在“Labeling method”一栏选择“One label per data item”。并且在“Target device”选择“Espressif ESP-EYE”。
收集训练图片
在进行模型的训练之前,我们首先需要收集原始数据集。这里值得注意的是,Edge Impulse是原生支持ESP-EYE开发板的,如果你使用的是ESP-EYE开发板,则可以在训练过程中直接连接进行数据集的采集和模型的验证,但是由于我们使用XIAO ESP32S3并不支持,因此我们还需要单独采集数据集。
这里我们使用一个基于Arduino的HTTP_Server程序来进行摄像头数据的采集和存储。该程序设计了一个Web网页,保证电脑和开发板接入同一局域网的条件下,在电脑浏览器栏输入ESP32的ip地址即可进入该web界面。
在该界面中,点击”capture“我们可以观察到摄像头拍摄到的图片,之后点击“save”即可将图片保存到内存卡内(开发板需要插入内存卡)并捕获下一张图片。(程序源码请在微信公众号:通信电子坊 回复 “ESP32采集图片程序” 获取。)
在收集到足够多的图片后,我们就可以开始构建数据集了。这里我一共采集了两组图片:宠物猫(cat)和背景(bk)。
点击左侧菜单栏中的“data acquisition”,并点击“Upload data”将我们采集到的数据进行上传。
我们需要分两次分别上传我们的宠物猫图片和背景图片。我们先选中存放图片的文件夹,并选择自动分割训练集和测试集,并最后设置我们这组图片的标签,最后点击“upload data”即可完成数据集的上传。
预处理及模型定义
创造脉冲信号
在收集好数据集后,我们需要从左侧菜单栏进入Impulse design对数据进行预处理并定义模型。首先我们在imagedata选项卡中将图片统一缩放为96*96大小。
之后添加processing block对图片数据进行预处理,这里我们选择image,选择“raw data”的话在后面额能会遇到奇怪的错误。
最后添加learning block定义模型,这里我们选择“transfer learning”。根据经验,这里的“transfer learning”要比“Classification”效果要好。
完成以上步骤后的图片如下所示:
最后点击最右侧的save impulse即可完成。
预处理
之后是对预处理模块“image”进行设置,左侧菜单栏点击“image”,进入到其设置界面
在color depth一栏我们可以设置输入模型的图片格式为RGB还是GRAY。GRAY模式仅有一个通道,能够很好的节约内存占用;而RGB包含三个通道,但是能够提高模型的准确度。这里我们选择RGB模式。点击“Save parameters”。
最后在“Generate features”一栏点击“generate features”即可完成。
模型训练
在左侧菜单栏点击Transfer learning进入模型训练界面。在该界面我们能够设置模型训练的轮次(Number of training cycles)和学习率(Learning rate)。模型训练的轮次越多,模型的准确度越高。
此外,我们还可以点击左侧的EON Tuner,对不同模型的效果进行对比并选择效果相对最好的模型进行训练。
模型测试
模型训练完毕后,我们可以点击右侧的model testing来检验模型的效果。
导出模型
最后点击左侧的Deployment进入模型导出界面。Edge impulse提供了多种导出的格式,如果你要获取训练后的模型,可以选择Custom block。这里我们选择Arduino库选项(Arduino library),并在底部选择Quantized (Int8)并按下按钮Build。由于我们使用的是esp32s3开发板,因此应该保持不选中启用EON编译器选项。
下一篇文章将介绍如何将下载得到的Arduino库添加到Arduino中并在ESP32S3中运行该模型。
图片采集的程序源码请在微信公众号:通信电子坊 回复 “ESP32采集图片程序” 获取。
这篇关于TinyML:Edge Impulse训练图片分类模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!