在上一篇文章中我们介绍了如何使用edge impulse训练一个图片分类模型并导出arduino库文件。在这篇文章中我们将介绍如何在esp32s3中部署这个训练好的图片分类模型。
添加进Arduino库
有两种方法将下载的文件添加进Arduino库。
- 在Arduino IDE程序中,转到项目选项卡并在导入库中选择选项添加.zip库,之后选择Edge Impulse下载的.zip文件即可添加成功。
- 直接将下载的文件解压到Arduino库文件夹下。
导入成功后Arduino库文件夹下会多出来一个Edge Impulse导出的文件夹。
替换 ESP NN
在使用下载的库之前,需要启用ESP NN加速器。下载链接我放在了公众号“通信电子坊”中,在后台回复“ESP-NN”即可获取。下载并解压后将其替换为Edge Impulse导出库文件夹中“src/edge-impulse-sdk/porting/espressif”文件夹下的ESP-NN文件夹。
修改例程
之后我们在Edge Impulse导出库文件夹中的“examples\esp32\esp32_camera”目录下找到“esp32_camera.ino”示例文件。在这个文件的基础上我们进行修改。
打开PSRAM
由于我们采集到的图片比较占内存,是要存储到PSRAM中的,因此需要在Arduino中打开PSRAM选项。
修改管脚定义
在Edge impulse提供的示例代码中有两种开发板的摄像头管脚定义,分别是“CAMERA_MODEL_ESP_EYE ”和“CAMERA_MODEL_AI_THINKER”。具体如下:
#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM#if defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 4
#define SIOD_GPIO_NUM 18
#define SIOC_GPIO_NUM 23#define Y9_GPIO_NUM 36
#define Y8_GPIO_NUM 37
#define Y7_GPIO_NUM 38
#define Y6_GPIO_NUM 39
#define Y5_GPIO_NUM 35
#define Y4_GPIO_NUM 14
#define Y3_GPIO_NUM 13
#define Y2_GPIO_NUM 34
#define VSYNC_GPIO_NUM 5
#define HREF_GPIO_NUM 27
#define PCLK_GPIO_NUM 25#elif defined(CAMERA_MODEL_AI_THINKER)
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22#else
#error "Camera model not selected"
#endif
如果你是用的是“CAMERA_MODEL_ESP_EYE ”或“CAMERA_MODEL_AI_THINKER”开发板,那么只需要修改开头的宏定义即可
#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_AI_THINKER // Has PSRAM
由于我们这里使用的是XIAO ESP32S3,因此我们需要查看其原理图找到摄像头对应的管脚进行修改。如果使用的是其它开发板,步骤也一样。
我们首先将上面的管脚定义都删除,之后把自己的开发板的管脚定义添加进去
#define PWDN_GPIO_NUM -1
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 10
#define SIOD_GPIO_NUM 40
#define SIOC_GPIO_NUM 39#define Y9_GPIO_NUM 48
#define Y8_GPIO_NUM 11
#define Y7_GPIO_NUM 12
#define Y6_GPIO_NUM 14
#define Y5_GPIO_NUM 16
#define Y4_GPIO_NUM 18
#define Y3_GPIO_NUM 17
#define Y2_GPIO_NUM 15
#define VSYNC_GPIO_NUM 38
#define HREF_GPIO_NUM 47
#define PCLK_GPIO_NUM 13
之后我们编译代码并将其下载到自己的开发板上即可看到效果了。
遇到的问题
在下载完程序后,我还遇到了报错“摄像头初始化失败,错误码0xffffffff”的问题。这个可能是由于摄像头与开发板的连接松动或者是管脚定义错误导致的,只需要重新拔插一下摄像头及其模块或者仔细检查引脚对应情况并修改即可解决。