一、项目介绍
随着社会的快速发展,家里的年轻人都选择了外出挣钱,家里只留下老人,而老人年纪大行动不便,在日常行动中容易摔倒,因此对老人的监控,特别是跌倒实时检测就显得十分重要,在老人发生跌倒时可以及时通知家属和医院并提供救助。基于MAX78000设计一款实时监测器,实时监测老人的状态,通过AI技术实时分析老人是否发生跌倒,若老人跌倒了可以发出警报并联系家人或者医院。此外,可用电池为这款监测器供电。由于整体系统运行在MCU之上,整体功耗极低。
二、项目设计和素材搜集思路
2.1 基本思路
通过传感器(如:陀螺仪)采集摔倒时的数据,多次采集并在电脑上训练神经网络,部署到单片机上运行,使用芯片内置的CNN神经网络加速器。
训练、部署神经网络主要参考板卡官方的Github
仓库:
ai8x-training
仓库,用于在电脑上训练神经网络:https://github.com/MaximIntegratedAI/ai8x-trainingai8x-synthesis
仓库,用于把训练好的模型文件转换成c语言代码:https://github.com/MaximIntegratedAI/ai8x-synthesismsdk
仓库,用于编写单片机程序:https://github.com/Analog-Devices-MSDK/msdk
2.2 环境准备
(1)相关软件
- MaximMicrosSDK_win (官方工具包)
- VScode (硬件编程及烧录)
- Ubuntu(模型训练)
(2)软件安装
链接:https://pan.baidu.com/s/1eboDnag9OPlScf0jA1_76A?pwd=LM23
提取码:LM23
- 双击MaximMicrosSDK_win.exe安装:参考教程:【window下配置Maxim SDK环境】_maximmicrossdk下载_2345VOR的博客-CSDN博客
- VScode安装和配置:教程:https://analog-devices-msdk.github.io/msdk/USERGUIDE/#getting-started-with-visual-studio-code
安装所需插件:
- https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug
- https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools
- 推荐插件:
- Atom One Dark Theme
- C/C++
- C/C++ Extension Pack
- C/C++ Theme
- Chinese(Simplified)
- CMake
- CMake Tools
- GitLens
- Header Source Switch
- Maekfile Tools
- Serial Montior
- vscode-icons
相关配置:
使用 CTRL + SHIFT + P后输入Open User Settings 并选择"Preferences: Open User Settings (JSON)"
添加完以下配置代码后保存重启
"MAXIM_PATH": "E:/learning/MaximSDK/MAX78000/MaximSDK",//MaximMicrosSDK_win的安装目录
"update.mode": "manual",
"extensions.autoUpdate": false,
"cmake.configureOnOpen": true,
3.Ubuntu系统安装:参考官方教程网址GitHub - MaximIntegratedAI/ai8x-training: Model Training for ADI's MAX78000 and MAX78002 AI Devices
- 安装一些基础工具:
sudo apt update
sudo apt upgrade
sudo apt install python3-pip
sudo apt-get install python-is-python3//安装python3.8
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
...
其它具体的资源下载可参考官方教程网址,也可根据直播视频进行安装。
安装资源时可能会失败,可多次尝试。因为我的电脑没有英伟达的GPU,所以无需安装pytorch。如果电脑有CUDA且安装了pytorch,可以用此命令检查CUDA 硬件加速是否可用:
(ai8x-training) $ nvidia-smi -q
...
Driver Version : 470.57.02
CUDA Version : 11.4
Attached GPUs : 1
GPU 00000000:01:00.0
Product Name : NVIDIA TITAN RTX
Product Brand : Titan
...
如果可用再验证 PyTorch 是否识别 CUDA:
(ai8x-training) $ python check_cuda.py
System: linux
Python version: 3.8.11 (default, Jul 14 2021, 12:46:05) [GCC 9.3.0]
PyTorch version: 1.8.1+cu111
CUDA acceleration: available in PyTorch
2.3 硬件烧录
(1)VScode:
用VSode打开“..\MaximSDK\Examples\MAX78000...”该路径下任意一个需要用到的demo,例如Hello_World
然后修改“.vscode/settings.json”里关于板子配置"board"的参数,将"board": "EvKit_V1"修改为"board": "FTHR_RevA",修改保存后需要重新加载一下窗口。
之后按下CTRL + SHIFT + B------>运行“clear”清理任务------>运行“build"编译任务------>运行”flash&run“进行烧录并运行------->最后打开串口助手进行测试
三、模型训练
也可参考作者zzzz的教程进行训练:https://www.eetree.cn/project/detail/2187(需要安装Anaconda和PyCharm)
当然也可以根据大赛里的老师直播的教程进行模型训练:
3.1 例程训练
按照教程或者直播视频对官方给出的例程进行训练,一边熟悉相关操作和知识。本次,对catsdogs例程进行训练量化。
(1)训练:首先使用以下命令进入ai8x-training环境
$ cd ai8x-training
$ source venv/bin/activate
之后使用scripts/train_catsdogs.sh "$@"命令进行训练
(ai8x-training) dl@DESKTOP-UK0GTDF:/mnt/e/luospace/ai8x-training$ scripts/train_catsdogs.sh "$@"
训练完成后会在“ai8x-training\logs”目录下生成6个文件,之后对其中的best文件进行量化。
(2)量化:退出ai8x-training环境,进入ai8x-synthesis环境,先用以下命令在\ai8x-synthesis\training目录下生成“best-q.pth.tar”文件
python quantize.py trained/ai85-catsdogs-qat8.pth.tar trained/ai85-catsdogs-qat8-q.pth.tar --device MAX78000 -v "$@"
之后再用此命令进行量化
scripts/gen_catsdogs_max78000.sh
在gen_catsdogs_max78000.sh文件里也可对相关信息进行修改,例如量化后文件的保存路径。
最后在/Examples/$DEVICE/CNN目录下可以找到训练的文件。
(3)将量化后的文件用MaximMicrosSDK或者VScode将其打开便可写入MAX78000硬件进行测试识别。
效果如下:按SW1键开始拍照识别
狗:
猫:
3.2 实际训练
因为本人时初次接触深度学习以及时间原因,所以就直接使用官方例程中的猫狗模型进行训练。cat_vs_dog中的网络模型是一个七层的神经网络
// Configuring 7 layers
// Input data: HWC
// Layer 0: 3x128x128 streaming, no pooling, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 16x128x128 output
// Layer 1: 16x128x128 streaming, max pool 2x2 with stride 2/2, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 32x64x64 output
// Layer 2: 32x64x64, max pool 2x2 with stride 2/2, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 64x32x32 output
// Layer 3: 64x32x32, max pool 2x2 with stride 2/2, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 32x16x16 output
// Layer 4: 32x16x16, max pool 2x2 with stride 2/2, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 32x8x8 output
// Layer 5: 32x8x8, no pooling, conv2d with kernel size 3x3, stride 1/1, pad 1/1, ReLU, 16x8x8 output
// Layer 6: 16x8x8 flattened to 1024x1x1, no pooling, linear, no activation, 2x1x1 output
开始训练前可以对\ai8x-training\scripts目录下的“train_catsdogs.sh”文件进行修改
python train.py --epochs 200 --optimizer Adam --lr 0.001 --wd 0 --deterministic --compress policies/schedule-catsdogs.yaml --qat-policy policies/qat_policy_cd.yaml --model ai85cdnet --dataset cats_vs_dogs --confusion --param-hist --embedding --device MAX78000 "$@"
各个参数的含义如下:
--epochs 200:训练的次数
--optimizer Adam:优化器
--lr 0.001:learning rate 学习率
--wd 0:weight decay
--deterministic:设置随机数种子,制造可重复的训练结果
--compress:设置压缩和学习率时间表
--qat-policy policies/qat_policy_cd.yaml:量化参数的策略
--model ai85cdnet:模型选择,模型定义在models文件夹下
--dataset cats_vs_dogs:数据集名称,之前在数据集加载文件中定义的
--confusion:显示混淆矩阵
--param-hist:收集参数统计信息
--embedding:显示嵌入
--device MAX78000:单片机芯片型号
(1)数据收集:因为时间有限所以就随便在网上找了个数据集进行训练,数据集来源:https://www.bilibili.com/video/BV1F94y1S7Tg/?spm_id_from=333.337.search-card.all.click&vd_source=69791353ee016d00d12531c613ff05e8
(2)将数据集放入ai8x-training/data目录下后便可按照上面的3.1例程训练进行模型训练
训练结果如下
训练完成后会生成如下文件
(3)训练完成后进行量化
量化结束后可在demo目录下找到量化后的文件
(4)将量化好的文件用VScode打开进行测试,本次测试使用了B站的相关视频进行验证。结果如下:
- 没有检测到目标时
- 检测到目标
站立时:屏幕
串口
跌倒时:屏幕
串口:
这些测试结果可以说是失败的,数据集和模型都还可以改进,之后会继续学习的,争取下次可以做的更好。
3.3 屏幕连接
屏幕:TFT LCD:ILI9341
接法:
屏幕和MAX78000FTHR开发板连接好后,在有使用屏幕的例程中修改部分程序,例如cats-dogs_demo,然后修改 main.c:设置RESET、BLK控制引脚
#if defined(BOARD_FTHR_REVA)
// Wait for PMIC 1.8V to become available, about 180ms after power up.
//MXC_Delay(200000);
mxc_gpio_cfg_t tft_reset_pin = {MXC_GPIO0, MXC_GPIO_PIN_19, MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH};
mxc_gpio_cfg_t tft_blen_pin = {MXC_GPIO0, MXC_GPIO_PIN_9, MXC_GPIO_FUNC_OUT, MXC_GPIO_PAD_NONE, MXC_GPIO_VSSEL_VDDIOH};
MXC_TFT_Init(MXC_SPI0, 1, &tft_reset_pin, &tft_blen_pin);
/* Enable camera power */
Camera_Power(POWER_ON);
//MXC_Delay(300000);
printf("\n\nFall_Recognition Feather Demo\n");
#else
printf("\n\nFall_Recognition Evkit Demo\n");
#endif
其他信息可参考电子森林的HonestQiao作者的内容。
四、遇到的问题及解决方法
1.安装Ubuntu系统是电脑C盘内存不够,可按照此教程安装到其他盘:https://blog.csdn.net/wgqabc/article/details/127745880?ops_request_misc=&request_id=&biz_id=102&utm_term=ubuntu%20%E5%AE%89%E8%A3%85%E9%9D%9Ec%E7%9B%98&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-127745880.142
2.git(http)拉取代码一直失败
这个是因为网络不稳定无法连接到网址,可以多次尝试或者挂梯子,也可以改用git(ssh)拉取代码 (首次使用需要配置一下)教程:https://zhuanlan.zhihu.com/p/108972475。
3.训练时发现缺少模块,可重新安装环境或者使用命令$pip install "缺少的模块名"进行安装
五、总结
总的来说这是一次失败的训练,十月份和十一月份一直生病,住院了一个多月,并且我还是初学者,所以很多地方都没做好,不过我还会继续学习,完成这个项目的,争取用上imu。