TinyML:Edge Impulse训练图片分类模型

2024-03-10 17:36

本文主要是介绍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训练图片分类模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/794988

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像