183浏览
查看: 183|回复: 1

[ESP8266/ESP32] 用esp32s3AI模块做昆虫活动时间观察记录仪

[复制链接]
本帖最后由 dlzxlsx 于 2025-4-10 21:27 编辑

我是闽北人,闽北以茶与虫闻名。武夷岩茶不在本文讨论范围。闽北地貌复杂,气候温暖潮湿,生态环境极好,有丰富的动植物资源,其中昆虫品种繁多。

用esp32s3AI模块做昆虫活动时间观察记录仪图47

笔者家乡发现的国家一级重点保护野生动物金斑喙凤蝶

用esp32s3AI模块做昆虫活动时间观察记录仪图46

本文涉及的项目是一个可用于野外观察某一地点昆虫出没情况的仪器,设计功能是:1.把仪器固定在室外某处后,打开电源,仪器会拍摄视野内新出现的物体,并把照片存储到SD卡中;2.若干天后,使用者取出SD卡,把照片分类标注,得到这一地点出没昆虫的图片;3.使用者把这些图片做为数据集,上传到edge impulse上训练获取物品分类模型,下载安装到该仪器的esp32s3AI开发板上;4.具有昆虫识别功能的仪器能把视野范围昆虫的名称、出现的时间以csv格式记录到SD上。在一段时间后,使用者取出SD卡,对获得的数据做进一步分析,可作为珍稀昆虫保护或害虫防治的决策使用。

下面罗列该项目的制作过程,因笔者学识与技术方面的欠缺,肯定存在不少不足之处,肯请同行指出。同时,对dfrobot提供的ESP32 S3 AI CAM模块,以及在制作过程中dfrobot工程师提供的技术支持表示感谢。

一、开发环境与器材
电脑:win11, i5-1135G7,Arduino ide;
开发板:dfrobot提供的ESP32 S3 AI CAM模块

其他:铁架台,3D打印机,昆虫模型
用esp32s3AI模块做昆虫活动时间观察记录仪图45捕捉野生动物违法,因此我用昆虫模型代替真实昆虫

二、对ESP32 S3 AI CAM进行测试

1.在arduino ide2.3.3安装了esp32开发板后,上打开示例文件中的cameraWebServer.
用esp32s3AI模块做昆虫活动时间观察记录仪图44
2.先删除该示例文件中的全部代码,把下面的代码粘贴到该文件中,并把下图中wifi信息修改成自己的wifi.

  1. #include "esp_camera.h"
  2. #include <WiFi.h>
  3. //
  4. // WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality
  5. //            Ensure ESP32 Wrover Module or other board with PSRAM is selected
  6. //            Partial images will be transmitted if image exceeds buffer size
  7. //
  8. //            You must select partition scheme from the board menu that has at least 3MB APP space.
  9. //            Face Recognition is DISABLED for ESP32 and ESP32-S2, because it takes up from 15
  10. //            seconds to process single frame. Face Detection is ENABLED if PSRAM is enabled as well
  11. #define PWDN_GPIO_NUM     -1
  12. #define RESET_GPIO_NUM    -1
  13. #define XCLK_GPIO_NUM     5
  14. #define Y9_GPIO_NUM       4
  15. #define Y8_GPIO_NUM       6
  16. #define Y7_GPIO_NUM       7
  17. #define Y6_GPIO_NUM       14
  18. #define Y5_GPIO_NUM       17
  19. #define Y4_GPIO_NUM       21
  20. #define Y3_GPIO_NUM       18
  21. #define Y2_GPIO_NUM       16
  22. #define VSYNC_GPIO_NUM    1
  23. #define HREF_GPIO_NUM     2
  24. #define PCLK_GPIO_NUM     15
  25. #define SIOD_GPIO_NUM  8
  26. #define SIOC_GPIO_NUM  9
  27. // ===========================
  28. // Enter your WiFi credentials
  29. // ===========================
  30. const char *ssid = "***********";
  31. const char *password = "************";
  32. void startCameraServer();
  33. void setupLedFlash(int pin);
  34. void setup() {
  35.   Serial.begin(115200);
  36.   Serial.setDebugOutput(true);
  37.   Serial.println();
  38.   camera_config_t config;
  39.   config.ledc_channel = LEDC_CHANNEL_0;
  40.   config.ledc_timer = LEDC_TIMER_0;
  41.   config.pin_d0 = Y2_GPIO_NUM;
  42.   config.pin_d1 = Y3_GPIO_NUM;
  43.   config.pin_d2 = Y4_GPIO_NUM;
  44.   config.pin_d3 = Y5_GPIO_NUM;
  45.   config.pin_d4 = Y6_GPIO_NUM;
  46.   config.pin_d5 = Y7_GPIO_NUM;
  47.   config.pin_d6 = Y8_GPIO_NUM;
  48.   config.pin_d7 = Y9_GPIO_NUM;
  49.   config.pin_xclk = XCLK_GPIO_NUM;
  50.   config.pin_pclk = PCLK_GPIO_NUM;
  51.   config.pin_vsync = VSYNC_GPIO_NUM;
  52.   config.pin_href = HREF_GPIO_NUM;
  53.   config.pin_sccb_sda = SIOD_GPIO_NUM;
  54.   config.pin_sccb_scl = SIOC_GPIO_NUM;
  55.   config.pin_pwdn = PWDN_GPIO_NUM;
  56.   config.pin_reset = RESET_GPIO_NUM;
  57.   config.xclk_freq_hz = 20000000;
  58.   config.frame_size = FRAMESIZE_UXGA;
  59.   config.pixel_format = PIXFORMAT_JPEG;  // for streaming
  60.   //config.pixel_format = PIXFORMAT_RGB565; // for face detection/recognition
  61.   config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
  62.   config.fb_location = CAMERA_FB_IN_PSRAM;
  63.   config.jpeg_quality = 12;
  64.   config.fb_count = 1;
  65.   // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  66.   //                      for larger pre-allocated frame buffer.
  67.   if (config.pixel_format == PIXFORMAT_JPEG) {
  68.     if (psramFound()) {
  69.       config.jpeg_quality = 10;
  70.       config.fb_count = 2;
  71.       config.grab_mode = CAMERA_GRAB_LATEST;
  72.     } else {
  73.       // Limit the frame size when PSRAM is not available
  74.       config.frame_size = FRAMESIZE_SVGA;
  75.       config.fb_location = CAMERA_FB_IN_DRAM;
  76.     }
  77.   } else {
  78.     // Best option for face detection/recognition
  79.     config.frame_size = FRAMESIZE_240X240;
  80. #if CONFIG_IDF_TARGET_ESP32S3
  81.     config.fb_count = 2;
  82. #endif
  83.   }
  84. #if defined(CAMERA_MODEL_ESP_EYE)
  85.   pinMode(13, INPUT_PULLUP);
  86.   pinMode(14, INPUT_PULLUP);
  87. #endif
  88.   // camera init
  89.   esp_err_t err = esp_camera_init(&config);
  90.   if (err != ESP_OK) {
  91.     Serial.printf("Camera init failed with error 0x%x", err);
  92.     return;
  93.   }
  94.   sensor_t *s = esp_camera_sensor_get();
  95.   // initial sensors are flipped vertically and colors are a bit saturated
  96.   if (s->id.PID == OV3660_PID) {
  97.     s->set_vflip(s, 1);        // flip it back
  98.     s->set_brightness(s, 1);   // up the brightness just a bit
  99.     s->set_saturation(s, -2);  // lower the saturation
  100.   }
  101.   // drop down frame size for higher initial frame rate
  102.   if (config.pixel_format == PIXFORMAT_JPEG) {
  103.     s->set_framesize(s, FRAMESIZE_QVGA);
  104.   }
  105. #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  106.   s->set_vflip(s, 1);
  107.   s->set_hmirror(s, 1);
  108. #endif
  109. #if defined(CAMERA_MODEL_ESP32S3_EYE)
  110.   s->set_vflip(s, 1);
  111. #endif
  112. // Setup LED FLash if LED pin is defined in camera_pins.h
  113. #if defined(LED_GPIO_NUM)
  114.   setupLedFlash(LED_GPIO_NUM);
  115. #endif
  116.   WiFi.begin(ssid, password);
  117.   WiFi.setSleep(false);
  118.   Serial.print("WiFi connecting");
  119.   while (WiFi.status() != WL_CONNECTED) {
  120.     delay(500);
  121.     Serial.print(".");
  122.   }
  123.   Serial.println("");
  124.   Serial.println("WiFi connected");
  125.   startCameraServer();
  126.   Serial.print("Camera Ready! Use 'http://");
  127.   Serial.print(WiFi.localIP());
  128.   Serial.println("' to connect");
  129. }
  130. void loop() {
  131.   // Do nothing. Everything is done in another task by the web server
  132.   delay(10000);
  133. }
复制代码


3.在IDE2.3.3的工具菜单中对开发板进行设置(如下图)
用esp32s3AI模块做昆虫活动时间观察记录仪图43
在实验中发现,烧录失败,错误提示如下:
用esp32s3AI模块做昆虫活动时间观察记录仪图42
Sketch uses 3148101 bytes (100%) of program storage space. Maximum is 3145728 bytes.
Compilation error: text section exceeds available space in board.
后改在arduino IDE1.8.4中能烧录成功。不明白IDE2.3.3是什么原因不能烧录,如何解决?

三、项目制作
1.设计制作项目支架

在tinkercad上设计3D模型,打印成型。用esp32s3AI模块做昆虫活动时间观察记录仪图41
  把esp32s3AI模块固定到盒子下方,盒子上方是电池仓。整个盒子安装在铁架上,实际效果如下图。

   2.为了省约时间,减少流程,笔者把设计功能的“1.把仪器固定在室外某处后,打开电源,仪器会拍摄视野内新出现的物体,并把照片存储到SD卡中;2.若干天后,使用者取出SD卡,把照片分类标注,得到这一地点出没昆虫的图片”两部分简化为手动采集昆虫图片数据。
   把IDE串口监视器输出的IP地址复制到浏览器上,在下面的界面上点击save,采集昆虫图片,每种昆虫的图片不少于50张,在拍摄照片过程中,要不断变化昆虫的方向。考虑到硬件的性能,为了提高识别率,在拍摄照片时,要注意数据集照片的环境(背景、光照)要到测试时的环境一致。因此,把ESP32S3 AI模块固定到支架上,把昆虫模型放在镜头下方拍摄,这样每张照片中昆虫与镜头的距离、角度、光线者相对稳定。


用esp32s3AI模块做昆虫活动时间观察记录仪图39用esp32s3AI模块做昆虫活动时间观察记录仪图40


3. 把五种昆虫的照片分类存入在五个文件夹内。
用esp32s3AI模块做昆虫活动时间观察记录仪图38

4. 到edge impulse上注册账号。

Edge Impulse是一个应用于嵌入式领域的在线的机器学习网站,不仅为用户提供了一些现成的神经网络模型以供训练,还能直接将训练好的模型转换成能在单片机MCU上运行的代码,使用方便,容易上手。因此本项目利用该平台训练图像分类模型,再部署到esp32s3上。

在Projects中创建工程Create new project,填写工程信息。
用esp32s3AI模块做昆虫活动时间观察记录仪图37
用esp32s3AI模块做昆虫活动时间观察记录仪图36

5.上传照片数据集
用esp32s3AI模块做昆虫活动时间观察记录仪图33用esp32s3AI模块做昆虫活动时间观察记录仪图34
用esp32s3AI模块做昆虫活动时间观察记录仪图35


做出相应的选择后,“选择文件夹”,把五个昆虫的图片上传到网站。

用esp32s3AI模块做昆虫活动时间观察记录仪图32

之后,对每个图进行框选,标注。这一步骤十分费时,当然,也有更简单的方法,直接用文件夹的名称作为图片的Label。
用esp32s3AI模块做昆虫活动时间观察记录仪图31
标注好的数据集:
用esp32s3AI模块做昆虫活动时间观察记录仪图30

6.选择目标开发板
点击右上角的开发板选择按钮。
用esp32s3AI模块做昆虫活动时间观察记录仪图29

按下图进行选择。
用esp32s3AI模块做昆虫活动时间观察记录仪图28

7.开始impulse desgin
依次设置如下
用esp32s3AI模块做昆虫活动时间观察记录仪图27

颜色深度,考虑到部署机器的性能,我选择“grayscale".
用esp32s3AI模块做昆虫活动时间观察记录仪图26

在”Generate features”页面,点击“Generate features”按钮生成图像特征
用esp32s3AI模块做昆虫活动时间观察记录仪图24
用esp32s3AI模块做昆虫活动时间观察记录仪图25
8.训练模型。在模型训练参数上,可设置如下

用esp32s3AI模块做昆虫活动时间观察记录仪图23

点击保存与训练
用esp32s3AI模块做昆虫活动时间观察记录仪图22
此时可以离开电脑,去拖地板、清洗冬天的棉袄。

回来之后,发现结果很满意!
用esp32s3AI模块做昆虫活动时间观察记录仪图21

千万不要手贱,别点击
用esp32s3AI模块做昆虫活动时间观察记录仪图20

否则再去洗一遍地板!

9.部署模型
点击

用esp32s3AI模块做昆虫活动时间观察记录仪图19

在跳出的页面中设置如下
用esp32s3AI模块做昆虫活动时间观察记录仪图18

点击build,右侧出现
用esp32s3AI模块做昆虫活动时间观察记录仪图17
片刻后会下载一个库文件压缩包,为了后面的叙述方面,将此文件称为模型库文件

用esp32s3AI模块做昆虫活动时间观察记录仪图16

10.在esp32s3 ai模块上测试模型

将下载的
模型库文件解压到电脑中"……arduino->libraies"中

用esp32s3AI模块做昆虫活动时间观察记录仪图14

到DF的网站下载edge impulse demo文件(https://img.dfrobot.com.cn/wikic ... 974096d7a9e8650.zip),后文称此文件为demo文件
用esp32s3AI模块做昆虫活动时间观察记录仪图15

解压该demo文件,效果如下
用esp32s3AI模块做昆虫活动时间观察记录仪图11
把上面
demo文件夹中的"depthwise_conv.cpp"和"conv.cpp"文件复制到模型库文件中,具体操作:

用esp32s3AI模块做昆虫活动时间观察记录仪图10
选择
demo文件夹中的这两个文件后复制,开打arduino->libraries->的模型库文件insects_inferencing下的“src\edge-impulse-sdk\tensorflow\lite\micro\kernels”

用esp32s3AI模块做昆虫活动时间观察记录仪图12

粘贴到该目录下,替换原来的"depthwise_conv.cpp"和"conv.cpp"文件

再将demo文件夹中的整个edge_camera文件夹复制到arduino->libraries->的模型库文件中的的examples中。

用esp32s3AI模块做昆虫活动时间观察记录仪图13

打开arduino IDE2.3.3,选择edge_camera示例,将代码中的第一行模型库名称改为自己训练后的库名称,填入自己WiFi账号密码,然后编译烧录。

用esp32s3AI模块做昆虫活动时间观察记录仪图9


编译过程十分缓慢,十分钟左右。

程序第185行“ei_printf("%s (%f)[x: %u, y: %u, width: %u, height: %u ]\n", bb.label, bb.value, bb.x, bb.y, bb.width, bb.height);”中bb.label就是昆虫的名称。

上传成功后,测试发现,识别率令人满意。

用esp32s3AI模块做昆虫活动时间观察记录仪图8


11.在该文件的基础上进行修改,实现设计目标。先把该文件复制一份作为备份文件。

由于要把昆虫活动的时间记录在SD卡,因此要加入时间与SD卡的相关库。通过查阅esp32se的wiki,SD卡采用SPI,占用引脚如下

用esp32s3AI模块做昆虫活动时间观察记录仪图7

我电脑上SD卡的库是https://github.com/espressif/arduino-esp32/tree/master/libraries/SD

从注释中可看出,该库文件与ESP32S3AI模块上SD卡的连接完成一样,可直接引用。


另外,我用NTP功能实现时间戳,NTC库如下

用esp32s3AI模块做昆虫活动时间观察记录仪图6

在对NTP以及SD卡的代码逐个测试通过后,再把相应的功能组合在一组,写入代码中,下面是增加部分代码的截图。

引用与定义部分

用esp32s3AI模块做昆虫活动时间观察记录仪图5


初始化

用esp32s3AI模块做昆虫活动时间观察记录仪图4


模型识别出昆虫后,记录昆虫名称与时间到SD卡。

用esp32s3AI模块做昆虫活动时间观察记录仪图3


logDataToSD()函数

用esp32s3AI模块做昆虫活动时间观察记录仪图2


经过漫长的编译后,尝试把代码上传到开发板上。

不过,在烧录时出现了错误提示:

A fatal error occurred: Failed to connect to ESP32-S3: No serial data received

用esp32s3AI模块做昆虫活动时间观察记录仪图1


在上电情况下,长按板上的“boot"键不放,快按"RST"键,松开"boot",重新上传代码。用esp32s3AI模块做昆虫活动时间观察记录仪图48

此时串口输出以下提示:
E (326) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0
E (334) esp_core_dump_elf: Elf write init failed!
E (339) esp_core_dump_common: Core dump write failed with error=-1
Rebooting...
完整信息截图:
用esp32s3AI模块做昆虫活动时间观察记录仪图49
项目又进入困境……

下载附件esp32_s3_cam.rar

全文完。










zoey不种土豆  超级版主

发表于 3 天前

好漂亮的蝴蝶!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail