0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ESP32的TinyML图像分类摄像头的设计方案

科技观察员 来源: MJRoBot 作者: MJRoBot 2022-04-29 16:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

项目背景

我们正面临着越来越多的嵌入机器学习革命。而当我们谈到机器学习(ML)时,首先想到的就是图像分类,一种 ML Hello World!

ESP32-CAM 是最受欢迎且价格合理的已集成摄像头的开发板之一,它结合了 Espressif ESP32-S MCU 芯片和 ArduCam OV2640 摄像头。

ESP32 芯片功能强大,甚至可以处理图像。它包括 I2C、SPI、UART 通信以及 PWM 和 DAC 输出。

参数:

工作电压:4.75-5.25V

飞溅:默认 32Mbit

RAM:内部 520KB + 外部 8MB PSRAM

无线网络:802.11b/g/n/e/i

蓝牙:蓝牙 4.2BR/EDR 和 BLE 标准

支持接口(2Mbps):UART、SPI、I2C、PWM

支持TF卡:最大支持4G

IO口:9

串口速率:默认115200bps

频谱范围:2400 ~2483.5MHz

天线形式:板载PCB天线,增益2dBi

图像输出格式:JPEG(仅支持OV2640)、BMP、GRAYSCALE

pYYBAGJrpBaAdu3jAAN9MvWlhn8537.png

下面,一般电路板引脚排列:

poYBAGJrpBKAdO7LAAI4-uGd_GU340.png

请注意,此设备没有集成 USB-TTL 串行模块,因此要将代码上传到 ESP32-CAM 需要一个特殊的适配器,如下所示:

poYBAGJrpAqASFiyAAIf0iDQaNc523.png

或 USB-TTL 串行转换适配器如下:

poYBAGJrpAeAYIRAAAWte5XzKL8809.png

如果你想了解 ESP32-CAM,我强烈推荐Rui Santos 的书籍和教程。

Arduino IDE 上安装 ESP32-Cam

从 Arduino IDE 打开首选项窗口并转到:Arduino 》偏好

使用以下行输入:

https://dl.espressif.com/dl/package_esp32_index.json

Additional Board Manager URLs 中输入下图内容

pYYBAGJrpAOACRnKAAGJaRYETn0024.png

接着,打开 boards manager,转到Tools 》 Board 》 Boards Manager.。。并使用esp32 输入。选择并安装最新的软件包

poYBAGJro_-AR8hJAAGpMS5r9SM184.png

选择 ESP32 开发板:

例如,AI-Thinker ESP32-CAM

poYBAGJro_uACO5BAAMqdyYd_0Q188.png

最后别忘记选择连接 ESP32-Cam的端口

这就对了!设备应该没问题。让我们做一些测试。

用 BLINK 测试电路板
ESP32-CAM 有一个与 GPIO33 连接的内置 LED。因此,相应地更改 Blink 草图:

#define LED_BUILT_IN 33 void setup() { pinMode(LED_BUILT_IN, OUTPUT); // Set the pin as output } // Remember that the pin work with inverted logic // LOW to Turn on and HIGH to turn off void loop() { digitalWrite(LED_BUILT_IN, LOW); //Turn on delay (1000); //Wait 1 sec digitalWrite(LED_BUILT_IN, HIGH); //Turn off delay (1000); //Wait 1 sec }

特别提醒,LED 位于电路板下方。

测试 WiFi
ESP32S 的声音特性之一是其 WiFi 功能。所以,让我们测试一下它的收音机,扫描它周围的 wifi 网络。你可以做到这一点,运行板附带的代码示例之一。

转到 Arduino IDE 示例并查找WiFI ==> WiFIScan

在串行监视器上,您应该会看到设备范围内的 wifi 网络(SSID 和 RSSI)。这是我在家里得到的:

poYBAGJro_WAWMmAAAD8G47L5us561.png

测试相机
对于相机测试,您可以使用以下代码:

示例 ==> ESP32 ==> 相机 ==> CameraWebServer

只选择合适的相机:

#define CAMERA_MODEL_AI_THINKER

并使用网络凭据输入:

const char* ssid = "*********";
const char* password = "*********";

pYYBAGJro_CAK4PDAAIo8p8zJKA349.png

在串行监视器上,您将获得正确的地址来运行您可以控制摄像机的服务器:

poYBAGJro-yAE9CZAAH4Fo7Dtm0203.png

这里我输入的是:http: //172.16.42.26

pYYBAGJro-eAAs5GAANIg5X5dzw580.png

运行你的网络服务器

到目前为止,我们可以测试所有 ESP32-Cam 硬件(MCU 和摄像头)以及 wifi 连接。现在,让我们运行一个更简单的代码来捕获单个图像并将其呈现在一个简单的网页上。本代码基于 Rui Santos 伟大的教程:ESP32-CAM Take Photo and Display in Web Server 开发

从 GitHub 下载文件:ESP332_CAM_HTTP_Server_STA ,更改 wifi 凭据并运行代码。结果如下:

poYBAGJro-OAXmJnAAQqOKF4tag693.png

尝试检查代码;更容易理解相机的工作原理

水果与蔬菜 - 图像分类

现在我们已经运行了嵌入式相机,是时候尝试图像分类了。

我们应该开始训练模型并继续在 ESP32-CAM 上进行推理。我们需要找到大量的数据用于训练模型。

TinyML 是一组与嵌入式设备上的机器学习推理相关的技术,由于限制(在这种情况下主要是内存),我们应该将分类限制为三到四个类别。我们将苹果与香蕉和土豆区分开来(您可以尝试其他类别)。

因此,让我们找到一个包含这些类别的图像的特定数据集。Kaggle 是一个好的开始:

https://www.kaggle.com/kritikseth/fruit-and-vegetable-image-recognition

该数据集包含以下食品的图像:

水果-香蕉、苹果、梨、葡萄、橙子、猕猴桃、西瓜、石榴、菠萝、芒果。

蔬菜- 黄瓜、胡萝卜、辣椒、洋葱、土豆、柠檬、番茄、萝卜、甜菜根、卷心菜、生菜、菠菜、大豆、花椰菜、甜椒、辣椒、萝卜、玉米、甜玉米、红薯、辣椒粉、墨西哥胡椒、姜、 大蒜、 豌豆、 茄子。

每个类别分为训练(100 张图像)、测试(10 张图像)和验证(10 张图像)。

将数据集从 Kaggle 网站下载到您的计算机。

使用 Edge Impulse Studio 训练模型

我们将使用 Edge Impulse 进行培训,这是在边缘设备上进行机器学习的领先开发平台。

在 Edge Impulse 输入您的帐户凭据(或创建一个免费帐户)。接下来,创建一个新项目:

pYYBAGJro9uAWY3rAAEQkHxppng834.png

数据采集

接下来,在上传数据部分,从您的计算机上传所选类别的文件:

poYBAGJro9aAMr0VAAFV4_42Uug403.png

如果您以三类数据结束,阅读培训会有所帮助

poYBAGJro9GAeC8GAAIlr3FQ5E4756.png

您还可以上传额外的数据以进行进一步的模型测试或拆分训练数据。

冲动设计

脉冲获取原始数据(在本例中为图像),提取特征(调整图片大小),然后使用学习块对新数据进行分类。

如前所述,对图像进行分类是深度学习最常见的用途,但要完成这项任务需要使用大量数据。每个类别我们有大约 90 张图片。这个数字够吗?一点也不!我们将需要数千张图像来“教授或建模”以区分苹果和香蕉。但是,我们可以通过使用数千张图像重新训练先前训练的模型来解决这个问题。我们将这种技术称为“迁移学习”(TL)。

pYYBAGJro82AbQFlAAKXf8yyqmM616.png

使用 TL,我们可以在我们的数据上微调预训练的图像分类模型,即使在相对较小的图像数据集(我们的案例)中也能达到良好的性能。

因此,从原始图像开始,我们将调整它们的大小(96x96)像素,然后将它们提供给我们的迁移学习块:

poYBAGJro8iAb37ZAAHNrHBggsw500.png

预处理(特征生成)

除了调整图像大小外,我们还应该将它们更改为灰度,以保持实际的 RGB 颜色深度。这样做,我们的每个数据样本都将具有 9 维、216 个特征 (96x96x1)。保持RGB,这个尺寸会大三倍。使用灰度有助于减少推理所需的最终内存量。

pYYBAGJro8OAGNjfAAHdmRuKuWQ835.png

不要忘记“保存参数”。这将生成要在训练中使用的特征。

培训(迁移学习和数据增强)

2007 年,Google 推出了MobileNetV1,这是一个通用计算机视觉神经网络系列,专为移动设备而设计,支持分类、检测等。MobileNets 是小型、低延迟、低功耗的模型,参数化以满足各种用例的资源限制。

尽管基本的 MobileNet 架构已经很小并且具有低延迟,但很多时候,特定用例或应用程序可能需要模型更小更快。为了构建这些更小且计算成本更低的模型,MobileNet 引入了一个非常简单的参数α (alpha),称为宽度乘数。宽度乘数 α 的作用是在每一层均匀地细化网络。

Edge Impulse Studio 提供 MobileNet V1(96x96 图像)和 V2(96x96 和 160x160 图像),具有多个不同的α值(从 0.05 到 1.0)。例如,对于 V2、160x160 图像和 α=1.0,您将获得最高准确度。当然,有一个权衡。精度越高,运行模型所需的内存就越多(大约 1.3M RAM 和 2.6M ROM),这意味着更多的延迟。

在另一个极端,使用 MobileNet V1 和 α=0.10(大约 53.2K RAM 和 101K ROM)将获得更小的占用空间。

为了在 ESP32-CAM 上运行这个项目,我们应该停留在可能性的较低端,保证推理的情况,但不能保证高精度

与深度学习一起使用的另一项必要技术是数据增强。数据增强是一种可以帮助提高机器学习模型准确性的方法。数据增强系统在训练过程中(如翻转、裁剪或旋转图像)对训练数据进行小的、随机的更改。

在这里,您可以看到 Edge Impulse 如何对您的数据实施数据增强策略:

# Implements the data augmentation policy
def augment_image(image, label):
# Flips the image randomly
image = tf.image.random_flip_left_right(image)
# Increase the image size, then randomly crop it down to
# the original dimensions
resize_factor = random.uniform(1, 1.2)
new_height = math.floor(resize_factor * INPUT_SHAPE[0])
new_width = math.floor(resize_factor * INPUT_SHAPE[1])
image = tf.image.resize_with_crop_or_pad(image, new_height, new_width)
image = tf.image.random_crop(image, size=INPUT_SHAPE)
# Vary the brightness of the image
image = tf.image.random_brightness(image, max_delta=0.2)
return image, label

在训练期间暴露于这些变化可以帮助防止模型通过“记忆”训练数据中的表面线索而走捷径,这意味着它可以更好地反映数据集中深层的潜在模式。

我们模型的最后一层将有 16 个神经元,其中 10% 的 dropout 用于防止过拟合。这是训练输出:

poYBAGJro7aASo2yAAHrnIgBhy4566.png

结果不是很好。该模型达到了大约 77% 的准确率,但预计在推理期间使用的 RAM 内存量非常小(大约 60 KB),这非常好。

部署

训练后的模型将部署为 .zip Arduino 库,用于特定的 ESP32-Cam 代码。

pYYBAGJro7GAPuL0AAFWH_hmevI292.png

打开您的 Arduino IDE 并在Sketch 下,转到Include Library并添加.ZIP Library。选择您刚刚从 Edge Impulse Studio 下载的文件,就是这样!

在Arduino IDE 的示例选项卡下,您应该在项目名称下找到一个草图代码。

pYYBAGJro6yAGtsLAATHGyZvxTs785.png

打开静态缓冲区示例:

poYBAGJro6SAMpJ6AALmET_FMeU062.png

您可以看到,第一段代码正是调用了一个库,该库具有在您的设备上运行推理所需的一切。

#include 《ESP32-CAM-Fruit-vs-Veggies_inferencing.h》

当然,这是一个通用代码(一个“模板”),它只获取一个原始数据样本(存储在变量中:features = {} 并运行分类器,进行推理。结果显示在串行监视器上。

我们应该做的是从相机中获取样本(图像),对其进行预处理(调整为 96x96,转换为灰度并平整它。这将是我们模型的输入张量。输出张量将是一个包含三个值,显示每个类的概率。

poYBAGJro52AZUgvAAD5GiuyUbQ758.png

在网站上:https ://github.com/edgeimpulse/example-esp32-cam,Edge impulse 改编了可用于相机测试的代码(示例 ==》 ESP32 ==》 相机 ==》 CameraWebServer),包括必要的在 ESP32-CAM 上运行推理。在 GitHub 上,下载代码Basic-Image-Classification,包括您的项目库,选择您的相机和您的 wifi 网络凭据:

poYBAGJro5iANZKOAAJPmzh8WTk905.png

将代码上传到您的 ESP32-Cam,您应该可以开始对水果和蔬菜进行分类了!您可以在串行监视器上检查它:

pYYBAGJro5CAHDSKAALPaWRi-NY686.png

测试模型(推理)

poYBAGJro36AZ3MuAAQFW6WgeQc716.png

用相机拍照,分类结果会出现在串口监视器上:

poYBAGJro3qAA79fAAIO9iUwqUo068.png

可以在网页上验证相机捕获的图像:

poYBAGJro3SANpLrAADo1z9nlTM244.png

其他测试:

pYYBAGJro2-AJ6mRAAJVof4LO4g825.png

poYBAGJro2qAJofHAANE27_WhpI259.png

结论

ESP32-Cam 是一种非常灵活、不昂贵且易于编程的设备。该项目可以证明 TinyML 的潜力,但我不确定整体结果是否可以应用于实际应用程序(以开发的方式)。只有最小的迁移学习模型才能正常工作(MobileNet V1,α=0.10),任何使用更大的α来提高准确性的尝试都会导致 Arena 分配错误。可能的原因之一是运行相机的最终通用代码中已经使用的内存量。因此,项目的下一步是优化最终代码,释放更多内存用于运行模型。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 摄像头
    +关注

    关注

    61

    文章

    5115

    浏览量

    103482
  • ESP32
    +关注

    关注

    27

    文章

    1222

    浏览量

    22320
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B 网络摄像头方案

    1.方案简介本方案将演示如何利用EASY-EAI-Nano-TB以及MIPI-CSI摄像头制作一个【网络摄像头(IPCamera)】:两路MIPI-CSI
    的头像 发表于 04-15 16:49 548次阅读
    瑞芯微(EASY EAI)RV1126B 网络<b class='flag-5'>摄像头</b><b class='flag-5'>方案</b>

    摄像头可靠性EMC设计优化

    更好解决摄像头EMC问题。二摄像头工作原理摄像头模组通过镜头(LENS)将光学图像投射到图像传感器(Sensor)表面,转换为电信号后经过A
    的头像 发表于 04-07 11:34 140次阅读
    <b class='flag-5'>摄像头</b>可靠性EMC设计优化

    零知派——ESP32‑S3 基于 ESP32-CAM 驱动 OV3660 摄像头模块开发

    ** 摄像头模组构建的无线视频监控方案。设备通过 WiFi 连接局域网,内置 HTTP Web 服务器,用户可通过浏览器或手机实时访问视频流。代码针对 OV3660 传感器进行了特定的图像校正与优化
    发表于 04-02 11:01

    乐鑫发布首个 MCU 级 Matter 摄像头方案,启明云端乐鑫代理

    乐鑫科技(688018.SH)正式推出业内首个运行于RTOS的MCU级Matter摄像头解决方案。该方案基于ESP32-P4,助力品牌商与开发者打造可在Matter生态中无缝互通的智能
    的头像 发表于 02-27 18:02 826次阅读
    乐鑫发布首个 MCU 级 Matter <b class='flag-5'>摄像头</b><b class='flag-5'>方案</b>,启明云端乐鑫代理

    ESP32-S3在初始化摄像头时检测到摄像头模组型号不被支持

    、供电不足或ESP32-S3引脚配置错误。 二、分步解决方案 1. 第一步:确认摄像头模组型号(关键) ESP32-S3官方驱动仅原生支持 OV2640(200万像素)和 OV5640
    发表于 02-11 06:38

    仅39.9元!ESP32-P4开发板+7寸屏+摄像头,嵌入式视觉入门方案完整开源,启明云端乐鑫代理

    的开源代码和丰富的资料,新手老手都能快速上手!硬件清单在开始之前,请先准备好以下硬件:ESP32-P4TINY开发板MIPI转接板软排线&杜邦线MIPI摄像头模块7寸
    的头像 发表于 02-05 18:03 689次阅读
    仅39.9元!<b class='flag-5'>ESP32</b>-P4开发板+7寸屏+<b class='flag-5'>摄像头</b>,嵌入式视觉入门<b class='flag-5'>方案</b>完整开源,启明云端乐鑫代理

    乐鑫科技发布首个MCU级Matter摄像头解决方案

    乐鑫科技 (688018.SH) 正式推出业内首个运行于 RTOS 的 MCU 级 Matter 摄像头解决方案。该方案基于 ESP32-P4,助力品牌商与开发者打造可在 Matter
    的头像 发表于 01-26 14:12 608次阅读

    Termux手机摄像头采集图像/视频流 部署 YOLO 模型推理

    Termux手机摄像头采集图像/视频流 部署 YOLO 模型推理
    的头像 发表于 12-14 07:26 3295次阅读

    自动驾驶既然有双目摄像头了,为什么还要三目摄像头

    [首发于智驾最前沿微信公众号]在自动驾驶领域,纯视觉方案一直受到不少人的认可。双目摄像头由于模拟了人眼的工作方式,能够通过视差计算还原三维信息,在距离判断和空间感知上具有天然优势,因此被广泛应用于纯
    的头像 发表于 12-09 08:59 1247次阅读
    自动驾驶既然有双目<b class='flag-5'>摄像头</b>了,为什么还要三目<b class='flag-5'>摄像头</b>?

    车载双目摄像头如何“看见”世界?

    源自:网络 车载双目摄像头(也称立体视觉摄像头,Stereo Camera)模仿人眼的视觉机制,通过两个略有间距的摄像头同时拍摄同一场景,比较两幅图像之间的差异,从而计算出深度信息。
    的头像 发表于 11-13 09:17 1663次阅读
    车载双目<b class='flag-5'>摄像头</b>如何“看见”世界?

    创世SD NAND贴片卡:智能摄像头存储难题的完美解决方案 #人工智能 #智能摄像头 #摄像头

    摄像头
    深圳市雷龙发展有限公司
    发布于 :2025年08月05日 11:17:13

    红外摄像头模组是什么?科技时代的眼睛

    深入探讨红外摄像头模组的工作原理、应用领域以及选择红外摄像头时需要考虑的因素。什么是红外摄像头模组?红外摄像头模组是一种能够捕捉红外线图像
    的头像 发表于 07-31 10:07 1305次阅读
    红外<b class='flag-5'>摄像头</b>模组是什么?科技时代的眼睛

    有偿求助!esp32cam摄像头车牌识别代码执行时,上位机闪退

    esp32cam摄像头车牌识别在操作执行识别车牌打开摄像头,上机位直接闪退,摄像头在例程检测是有图片的,有偿找一个能帮我修改整体代码的
    发表于 06-03 16:18

    乐鑫ESP-RTC实时音视频通信方案

    ESP32-S3-Korvo-2多媒体开发板为核心。ESP32-S3-Korvo-2搭载ESP32-S3AISoC,拥有双麦克风阵列,支持近/远场语音唤醒和语音识别。它还集成了摄像头
    的头像 发表于 05-26 18:07 1833次阅读
    乐鑫<b class='flag-5'>ESP</b>-RTC实时音视频通信<b class='flag-5'>方案</b>

    ESP32-CAM带OV2640摄像头视频显示

    本文介绍了如何在Arduino IDE上开发实现ESP32-CAM模块获取实时图像视频
    的头像 发表于 05-23 10:47 1999次阅读
    <b class='flag-5'>ESP32</b>-CAM带OV2640<b class='flag-5'>摄像头</b>视频显示