2026-4-16 15:33:58 [显示全部楼层]
43浏览
查看: 43|回复: 0

[ESP8266/ESP32] 用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测

[复制链接]
乐鑫提供了很多机器学习的例子,今天看见例子中有YOLO11目标检测的例子,拿来放在FireBeetle 2 ESP32-P4 上跑一下。
1、下载ESP-DL
https://github.com/espressif/esp-dl
ESP-DL​​ 是乐鑫为旗下 ESP 系列芯片开发的深度学习开发库。它提供了从模型转换、量化到部署推理的全套工具链。下载后可以看见在examples下有很多深度学习的例子,其中yolo11_detect是一个YOLO11目标检测的例子,因为手头没有合适FireBeetle 2 ESP32-P4的摄像头,这里修改这个例子,改为为从SD卡上读取图片进行目标检测。
2、准备SD卡
准备一张SD卡,格式化为fat32格式。在放入待识别的目标图片,命名为test.jpg。
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图1
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图3
将模型文件拷贝到SD卡上,乐鑫提供的esp32p4下的模型文件在“esp-dl\models\coco_detect\models\p4”,将“models\p4”整个拷贝到SD卡上。
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图2
3、修改代码
我这里使用vscode做为编辑器,注意esp-idf版本号,需要esp-idf5.5的版本,将芯片设置为ESP32P4。
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图4
官方例程是使用flash做为存储空间,将模型、图片都放到flash上的。这里需要修改,将模型路径修改到SD卡上。
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图5
修改main下的CMakeLists.txt文件,将测试图片部分去掉。
  1. set(src_dirs        ./)
  2. set(include_dirs    ./)
  3. idf_component_register(SRC_DIRS ${src_dirs} INCLUDE_DIRS ${include_dirs} REQUIRES ${requires} )
复制代码
修改app_main.cpp文件。添加了SD卡的加载;修改了测试图片来源,改为由SD卡读取;修改了模型读取的路径,改为SD卡读取模型;添加了计算模型运行时长;添加了将检测结果绘制框图写回SD卡。
  1. #include "coco_detect.hpp"
  2. #include "dl_image_draw.hpp"
  3. #include "dl_image_jpeg.hpp"
  4. #include "esp_log.h"
  5. #include "bsp/esp-bsp.h"
  6. #include "esp_timer.h"
  7. const char *TAG = "yolo11n";
  8. extern "C" void app_main(void)
  9. {
  10. #if CONFIG_COCO_DETECT_MODEL_IN_SDCARD
  11.     ESP_ERROR_CHECK(bsp_sdcard_mount());
  12. #endif
  13.     dl::image::jpeg_img_t jpeg_img = dl::image::read_jpeg("/sdcard/test.jpg");
  14.     auto img = dl::image::sw_decode_jpeg(jpeg_img, dl::image::DL_IMAGE_PIX_TYPE_RGB888);
  15.     COCODetect *detect = new COCODetect();
  16.      //  开始计时
  17.     int64_t start_time = esp_timer_get_time();
  18.     auto &detect_results = detect->run(img);
  19.      //  结束计时并计算耗时
  20.     int64_t end_time = esp_timer_get_time();
  21.     ESP_LOGI(TAG, "Model inference time: %.2f ms", (end_time - start_time) / 1000.0f);
  22.     for (const auto &res : detect_results) {
  23.         ESP_LOGI(TAG,
  24.                  "[category: %d, score: %f, x1: %d, y1: %d, x2: %d, y2: %d]",
  25.                  res.category,
  26.                  res.score,
  27.                  res.box[0],
  28.                  res.box[1],
  29.                  res.box[2],
  30.                  res.box[3]);
  31.         std::vector<uint8_t> color = {0, 255, 0};
  32.         uint8_t line_width = 1;
  33.         dl::image::draw_hollow_rectangle(img, res.box[0], res.box[1], res.box[2], res.box[3], color, line_width);
  34.     }
  35.     delete detect;
  36.     dl::image::jpeg_img_t out_jpeg_img = dl::image::sw_encode_jpeg_base(img);
  37.     heap_caps_free(img.data);
  38.     dl::image::write_jpeg(out_jpeg_img, "/sdcard/out.jpg");
  39. #if CONFIG_COCO_DETECT_MODEL_IN_SDCARD
  40.     ESP_ERROR_CHECK(bsp_sdcard_unmount());
  41. #endif
  42. }
复制代码
然后编译、烧录。
4、运行程序
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图6
用FireBeetle 2 ESP32 P4跑一下YOLO11目标检测图7
可以看见,图片中的人、船均被识别出来了!识别效果很不错,但是识别时长接近6秒,如果使用摄像头进行实时识别,这个时长还是太夸张了。但是YOLO物体识别还是成功地跑起来了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail