5

TinyML ESP32 人检测应用的移植和使用

 3 years ago
source link: https://www.taterli.com/7910/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

TinyML ESP32 人检测应用的移植和使用

  • TaterLi
  • 2021年5月23日2021年5月23日

之前已经写过好些Tensorflow Lite Micro的内容,有一段时间没更新,主要是图像检测需要不少数据集来训练,然后一直没申请到数据集,自己准备数据集又没有那么多时间,那么只能用官方演示例子和官方数据集测试了,如果有条件最好还是自己准备数据集,大致就是拍某个东西的很多照片,然后给他们标记上.

注意:如果没看前面的内容,也没有基础,看不懂是正常的,请查找以前的内容看.

建议使用一台Ubuntu 20.04(尽量不使用衍生版,最好英文语言安装,避免各种兼容性问题.)宿主机,并且装好GPU驱动,CUDA库等等环境,然后做以下准备,我相信大家都有基础了,如果没有搜索TinyML关键字找到以前的内容看.

  • Intel GPU Driver & CUDA (可选,只要你能忍受超慢的训练,这个可以不装!)
  • Install ESP-IDF => https://github.com/espressif/esp-idf (确保idf.py可以使用.)
  • Clone Tensorflow Repo => https://github.com/tensorflow/tensorflow (最好bazel构建一份同版本whl,获得最大兼容性.)
  • ESP-IDF for Visual Studio Code => https://code.visualstudio.com (可选,你要有自己习惯的工具也行.)

切换到tensorflow目录,然后开始构建ESP32人体检测的范例.

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=esp generate_person_detection_int8_esp_project

切换到工作目录:

cd tensorflow/lite/micro/tools/make/gen/esp_xtensa-esp32_default/prj/person_detection_int8/esp-idf

然后获取摄像头驱动:

git clone https://github.com/espressif/esp32-camera.git components/esp32-camera

然后构建:

idf.py build # 构建工程,应该会失败.
rm build -rf # 删除构建临时文件

有些文件索引不正确,最后会构建失败,但是这没关系,我们最终是要得到工程文件,把工程压缩后拉到本地Windows继续调试.(要是习惯Ubuntu也可以直接在Ubuntu继续,由于我安装的是无GUI版本,所以我只能拷贝过来方便.)

 zip -r ~/esp.zip *

最后在VSC打开工程应该长这个样子.

现在构建应该会各种丢失文件,但是也应该构建一次,丢什么补什么,然后image_provider要提供int8的数据,所以要改一下高亮的地方.

然后修改main/CMakeLists.txt内容:


#
# Main component of TF Micro project 'person_detection_int8'.
#

idf_component_register(
    SRCS detection_responder.cc image_provider.cc main.cc main_functions.cc model_settings.cc app_camera_esp.c
    INCLUDE_DIRS "./include")

然后修改摄像头配置,比如我用的就是安信可的模块:

然后使能外部RAM并让malloc主动用外部RAM,如果需要还可以提高RAM的时钟频率(可能不稳定).

最后运营得出结果,当前面分数大于后面分数,代表检测到人.

完整示例项目:https://github.com/nickfox-taterli/esp32-tf

注意:为什么没用单片机实现,主要是现在单片机价格也走高,估计还会走高一段时间,能跑摄像头还便宜的,目前应该就只有个这个方案了,含OV2640整板成本可以在20元以内,布板时候可以当他普通单片机用,WIFI部分都不做,输出结果用IO或者串口给另一个单片机或者他全跑完.

经过测试发现其准确率一般般,这是因为INT8本身就有损失,而且模型里面数据可能都是老外为主,所以有必要自己训练模型,你需要出去拍摄大量(数千张)各种各样人的照片,以及大量(数千张)不是人的照片,他们必须覆盖各种各样的环境,不能拍人都在室内,拍物体都在室外,这样会给出很大的误解.

我这里大致说下训练,这里用的CPU训练,如果你有GPU就不要开clone_on_cpu开关,并且步数设置到足够多,比如10万,20万步,因为CPU速度很慢,所以我设置了1000步仅作测试,准确度更加低.

python3 download_and_convert_data.py --dataset_name=visualwakewords \
--dataset_dir=/mnt/data/visualwakewords

python3 train_image_classifier.py --train_dir=/mnt/vww_96_grayscale \
--dataset_name=visualwakewords \
--dateset_split=train \
--dataset_dir=/mnt/data/visualwakewords \
--model_name=mobilenet_v1_025 \
--preprocessing_name=mobilenet_v1 \
--train_image_size=96 \
--use_grayscale=True \
--save_summaries_secs=300 \
--learning_rate=0.045 \
--label_smoothing=0.1 \
--learning_rate_decay_factor=0.98 \
--num_epochs_per_decay=2.5 \
--moving_average_decay=0.9999 \
--batch_size=96 \
--max_number_of_steps=1000 \
--clone_on_cpu=True

学习过程,由于每步都要几秒,学习完也要几个小时了.

数据是由很多图片和一个描述JSON组成,抽取部分数据来看.

如果要做自己的COCO数据集,有很多可用的工具,比如这个就说的很明白:https://patrickwasp.com/create-your-own-coco-style-dataset/

最后得到很多checkpoint文件,然后按照之前教程所说转换并移植过去就行.

最后如果对TPU有兴趣,可以试试更大的数据集,看看谷歌的教程(COCO不需要申请,ImageNet需要申请,并且数量更大.):https://cloud.google.com/tpu/docs/imagenet-setup?hl=zh-cn

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

评论

显示名称 *

电子邮箱地址 *

网站网址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK