整活时间:通过ncnn在esp32c3上部署神经网络
这篇文章的起因是在b站刷到这个视频,9块9包邮的单片机就能跑深度学习,最近也学了ncnn,所以开始整活,主要是在esp32c3的单片机上部署了两层的简单网络来进行minist数据集的识别。
这篇主要是参考nihui大佬的这篇文章进行复现的,在 esp32c3 用 ncnn 跑神经网络 mnist - 知乎 (zhihu.com)我只要讲解我实现的过程。
源码地址:nihui/ncnn_on_esp32 (github.com)
开发平台
- 虚拟机 ubuntu
- esp32c3简约版(我在淘宝合宙家买的,真9.9元)
- VScode
部署过程
具体查看esp32c3的官方文档
首先安装在虚拟机安装所需依赖
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
获取esp-idf源码
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
git submodule update --init --recursive
安装 esp-idf sdk
sh install.sh
设置环境,是后面所有步骤的先决步骤
source export.sh
下载ncnn on esp源码
git clone https://github.com/nihui/ncnn_on_esp32.git
我这里主打快速上手,所以没有编译原来的ncnn的toolchain.cmake,想了解细节可以看nihui大佬那篇知乎文章
选择编译参数:
cd ncnn_on_esp32
idf.py set-target esp32c3
idf.py menuconfig
编译
idf.py build
编译成功的标志
接下来就是烧录了,
首先输入
ls /dev/tty*
通过type-c数据线连接单片机和电脑串口,再次输入
ls /dev/tty*
比较两次是哪个串口多出来了,那个就是单片机的烧录串口
比如我的叫ttyACM0
之后开始烧录了,输入
idf.py -p /dev/ttyACM0 flash
出现下面标志就是成功了
之后打开minicom,查看串口,关于minicom怎么安装,可以参考这篇博客https://blog.csdn.net/robertsf/article/details/5486108,记得配置的端口是单片机的烧录串口一样,比如我的就是ttyACM0。
之后按下单片机的reset键,等待一会,串口输出如下,那就是成功了。
一些坑:
esp on ncnn的源码中,在ncnn_on_esp32/CMakeLists.txt中的16行,需要改为
#修改前
target_link_libraries(${CMAKE_PROJECT_NAME}.elf ncnn)
#修改后
target_link_libraries(${CMAKE_PROJECT_NAME}.elf PRIVATE ncnn)
不然可能会出现在编译
idf.py set-target esp32c3
的时候,出现
以上也可以不使用虚拟机来进行部署,可能会出现网络桥接的一些坑,所以我也尝试了直接在树莓派上进行编译部署烧录(因为之前在树莓派部署过ncnn,所以可以直接用之前的ncnn工程),如下图所示,过程跟在虚拟机上一致,最后也是成功部署。