当前位置: 首页 > news >正文

esp32-s3部署yolox_nano进行目标检测

ESP32-S3部署yolox_nano进行目标检测

      • 一、生成模型部署项目
        • 01 环境
        • 02 配置TVM包
        • 03 模型量化
          • 3.1预处理
          • 3.2 量化
        • 04 生成项目
      • 二、烧录程序

手上的是ESP32-S3-WROOM-1 N8R8芯片,整个链路跑通了,但是识别速度太慢了,20秒一张图,所以暂时还没打算进一步优化程序。
在这里插入图片描述

一、生成模型部署项目

官方指导文件:使用TVM自动生成模型部署项目

先下载onnx模型:yolox_nano.onnx,将下载好的yolox_nano.onnx放置在esp-dl/tutorial/evm_example路径下。

01 环境
  • ESP-IDF 5.0
  • 虚拟机Ubuntu 20.04
  • python环境
    在这里插入图片描述
02 配置TVM包

按官方文档下载完包后,设置环境变量PYTHONPATH

sudo vim ~/.bashrc
# 在文件的最后添加以下行,其中path-to-esp-dl更换为你的文件路径
export PYTHONPATH='$PYTHONPATH:/path-to-esp-dl/tools/tvm/python'
03 模型量化
3.1预处理
~/esp-dl $ cd tutorial/tvm_example
~/esp-dl/tutorial/tvm_example $ python -m onnxruntime.quantization.preprocess --input yolox_nano.onnx --output yolox_nano_opt.onnx
3.2 量化
  • 生成校准数据
import numpy as np
import cv2
import os# 图片路径
path = 'esp-dl/img/calib'# 读取图片并将它们保存为numpy数组
images = []
for filename in os.listdir(path):img = cv2.imread(os.path.join(path, filename))img_resized = cv2.resize(img, (416, 416))img_array = np.transpose(img_resized, (2, 0, 1))img_array = img_array / 255.0if img_array is not None:images.append(img_array)print(filename)# 将numpy数组保存为npy文件
np.save('esp-dl/tutorial/tvm_example/calib_416x416.npy', images)
  • 生成模型输入
import numpy as np
import cv2
import ospath = 'esp-dl/img/input.jpg'img = cv2.imread(path)
img_resized = cv2.resize(img, (416, 416))
img_array = np.transpose(img_resized, (2, 0, 1))
img_array = img_array / 255.0
images = [img_array]np.save('esp-dl/tutorial/tvm_example/input_416x416.npy', images)
  • 生成量化后的模型
~/esp-dl/tutorial/tvm_example $ python ../../tools/tvm/esp_quantize_onnx.py --input_model yolox_nano_opt.onnx --output_model yolox_nano_quant.onnx --calibrate_dataset calib_416x416.npy
Collecting tensor data and making histogram ...
Finding optimal threshold for each tensor using entropy algorithm ...
Number of tensors : 365
Number of histogram bins : 128 (The number may increase depends on the data it collects)
Number of quantized bins : 128
WARNING:root:Please use QuantFormat.QDQ for activation type QInt8 and weight type QInt8. Or it will lead to bad performance on x64.
04 生成项目
~/esp-dl/tutorial/tvm_example $ python ../../tools/tvm/export_onnx_model.py --model_path yolox_nano_quant.onnx --img_path input_416x416.npy --target_chip esp32s3 --out_path "." --template_path "../../tools/tvm/template_project_for_model/"
Model Information:
------------------
Input Name: images
Input Shape: (1, 3, 416, 416)
Input DType: float
Output Name: output
Output Shape: (1, 3549, 85)
Output DType: float
[17:21:47] /home/gansichen/Workspace/projects/local/framework/tvm/src/relay/transforms/convert_layout.cc:99: Warning: Desired layout(s) not specified for op: nn.max_pool2d
[17:21:47] /home/gansichen/Workspace/projects/local/framework/tvm/src/relay/transforms/convert_layout.cc:99: Warning: Desired layout(s) not specified for op: nn.max_pool2d
[17:21:47] /home/gansichen/Workspace/projects/local/framework/tvm/src/relay/transforms/convert_layout.cc:99: Warning: Desired layout(s) not specified for op: nn.max_pool2d
[17:21:47] /home/gansichen/Workspace/projects/local/framework/tvm/src/relay/transforms/convert_layout.cc:99: Warning: Desired layout(s) not specified for op: image.resize2d
[17:21:47] /home/gansichen/Workspace/projects/local/framework/tvm/src/relay/transforms/convert_layout.cc:99: Warning: Desired layout(s) not specified for op: image.resize2d
esp_dl_library_path: /home/zymidea/Desktop/esp32-cam/esp-dl
generated project in: ./new_project

二、烧录程序

烧录用的windows系统,将虚拟机中生成的new_project文件夹复制到PC端,打开ESP-IDF CMD

cd new_preject
idf.py set-target esp32s3
idf.py flash monitor

这是按照官方的教程进行烧录,但是模型太大会出现内存溢出esp32-template-project.elf section '.dram0.bss' will not fit in region 'dram0_0_seg' region 'dram0_0_seg' overflowed by 2141320 bytes

~/new_project $ idf.py size-components
...
Total sizes:                                                                               
Used static IRAM:   61042 bytes ( 301198 remain, 16.9% used)                                    .text size:   60015 bytes                                                                  .vectors size:    1027 bytes                                                         
Used stat D/IRAM: 2442376 bytes (-2096520 remain, 706.2% used) Overflow detected!              .data size:   11088 bytes                                                                  .bss  size: 2431288 bytes                                                             
Used Flash size : 3729295 bytes                                                                .text     :  473467 bytes                                                                  .rodata   : 3255572 bytes                                                             
Total image size: 3801425 bytes (.bin may be padded larger) 

在这里插入图片描述

找到new_project/build/project_description.jsonlibtvm_model.a静态文件的源代码。
在这里插入图片描述

官方指导片外RAM

需要调整的是将模型的权重文件保存到flash并将模型的输出存放在PSRAM,操作如下

// 打开/new_project/components/tvm_model/model/codegen/host/src/default_lib0.c// 代码最前面
// 增加一个头文件
#include "E:/Espressif/frameworks/esp-idf-v5.0.4/components/esp_common/include/esp_attr.h"// static struct global_const_workspace 将static改为const
const struct global_const_workspace// 代码最后面
// __attribute__((section(".bss.noinit.tvm"), aligned(16))) 将这句话注释掉
static EXT_RAM_BSS_ATTR uint8_t global_workspace[2422784]; // 增加宏EXT_RAM_BSS_ATTR
// 打开/new_project/main/output_data.h
const static _SECTION_ATTR_IMPL(".ext_ram.bss", __COUNTER__) __attribute__((aligned(16))) float output_data[42588] // 指定该数组存放到外部RAM的.ext_ram.bss段
~/new_project $ idf.py menuconfig

在这里插入图片描述
在这里插入图片描述
修改完毕S键保存,Esc键退出。

修改/new_project/partitions.csv分区表中的factory的大小,原本的3000多K存储模型权重不够,将其增大点,三个区的Offset都清空,生成过程它会自动匹配。

在这里插入图片描述

所有的修改完毕后再重新再看一下各个RAM的使用情况

~/new_project $ idf.py size-components
...
Used static IRAM:   61042 bytes ( 301198 remain, 16.9% used).text size:   60015 bytes.vectors size:    1027 bytes
Used stat D/IRAM:   19592 bytes ( 326264 remain, 5.7% used) .data size:   11088 bytes.bss  size:    8504 bytes 
Used Flash size : 3729203 bytes                                                                .text     :  473455 bytes                                                                  .rodata   : 3255492 bytes                                                             
Total image size: 3801333 bytes (.bin may be padded larger) 
...

在这里插入图片描述

最后重新烧录就能运行成功了。

~/new_project $ idf.py flash monitor

在这里插入图片描述

相关文章:

  • STM32-SPI 中断
  • 【自用】ASCii 8*16 点阵字模
  • 2023亚太地区五岳杯量子计算挑战赛
  • Vue在Computed计算属性下,获取Promise then的返回值无效为空
  • 限流、熔断、降级、线程池隔离
  • 【数电笔记】11-最小项(逻辑函数的表示方法及其转换)
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • 一篇文章带你详细了解C++智能指针
  • 2023年第十二届数学建模国际赛小美赛C题雪崩防范求解分析
  • Mysql安全之基础合规配置
  • 服务器数据恢复—服务器重装系统导致逻辑卷发生改变的数据恢复案例
  • 二:C语言-数据类型和变量
  • 深入了解UUID:生成、应用与优势
  • 【译】DispatcherServlet
  • 钉钉提交审批意见,并上传附件接口集成
  • CEF与代理
  • SpingCloudBus整合RabbitMQ
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • XML已死 ?
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 提醒我喝水chrome插件开发指南
  • 用jQuery怎么做到前后端分离
  • 优秀架构师必须掌握的架构思维
  • Mac 上flink的安装与启动
  • UI设计初学者应该如何入门?
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • (2015)JS ES6 必知的十个 特性
  • (solr系列:一)使用tomcat部署solr服务
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (算法)Travel Information Center
  • (转)VC++中ondraw在什么时候调用的
  • .apk 成为历史!
  • .NET Core 版本不支持的问题
  • .NET Core 项目指定SDK版本
  • .Net Winform开发笔记(一)
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net面试题4
  • .NET学习教程二——.net基础定义+VS常用设置
  • 。Net下Windows服务程序开发疑惑
  • @staticmethod和@classmethod的作用与区别
  • @synthesize和@dynamic分别有什么作用?
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [AIGC] Java 和 Kotlin 的区别
  • [Android] Amazon 的 android 音视频开发文档
  • [c#基础]DataTable的Select方法
  • [C]整形提升(转载)
  • [Json.net]快速入门
  • [Linux] day07——查看及过滤文本