打印
[应用相关]

如何在 OpenMV 生态系统中集成 STM32Cube.AI 生成的代码

[复制链接]
楼主: 哈根达斯uz
手机看帖
扫描二维码
随时随地手机跟帖
21
哈根达斯uz|  楼主 | 2020-8-26 22:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
从 STM32Cube.AI 中将文件复制到 AI 目录中:
PC $> cp $HOME/openmv_workspace/X-CUBE-AI.5.0.0/Middlewares/ST/AI/
Inc/* AI/Inc/PC $> cp $HOME/openmv_workspace/X-CUBE-AI.5.0.0/Middlewares/ST/AI/
Lib/ABI2.1/STM32H7/NetworkRuntime*_CM7_IAR.a AI/Lib/NetworkRuntime
_CM7_GCC.a

使用特权

评论回复
22
哈根达斯uz|  楼主 | 2020-8-26 22:58 | 只看该作者
操作完成后,AI 目录应如下所示
AI/
├── Inc
│ ├── ai_common_config.h
│ ├── ai_datatypes_defines.h
│ ├── ai_datatypes_format.h
│ ├── ai_datatypes_internal.h
│ ├── ai_log.h
│ ├── ai_math_helpers.h
│ ├── ai_network_inspector.h
│ ├── ai_platform.h
│ ├── ...
├── Lib
│ └── NetworkRuntime_CM7_GCC.a
└── LICENSE

使用特权

评论回复
23
哈根达斯uz|  楼主 | 2020-8-26 22:59 | 只看该作者
1.5 步骤 3-生成神经网络模型所需的代码↑
在此步骤中,您将训练卷积神经网络来识别手写数字。然后借助 STM32Cube.AI,为此网
络生成 STM32 优化的 C 代码。这些文件将被添加到 OpenMV 固件源代码中。然后将生成
一个优化的 C 代码

使用特权

评论回复
24
哈根达斯uz|  楼主 | 2020-8-26 23:09 | 只看该作者
1.5.1 训练卷积神经网络↑
或者,您可以跳过此步骤,使用已完成训练的 mnist_cnn.h5 文件(见下章)。
来自 Keras 的用于数字分类的卷积神经网络(MNIST)将用作示例。若您想训练网络,则
需安装 Keras。
运行以下指令,来训练网络并将模型保存到磁盘:
PC $> cd $HOME/openmv_workspace/openmv/src/stm32cubeai/example
PC $> python3 mnist_cnn.py

使用特权

评论回复
25
哈根达斯uz|  楼主 | 2020-8-26 23:09 | 只看该作者
1.5.2 STM32 优化代码的生成↑
生成 STM32 优化代码,请按照以下要求使用 stm32ai 指令行工具:
PC $> cd $HOME/openmv_workspace/openmv/src/stm32cubeai
PC $> stm32ai generate -m example/mnist_cnn.h5 -o data/

使用特权

评论回复
26
哈根达斯uz|  楼主 | 2020-8-26 23:10 | 只看该作者
以下文件生成于$HOME/openmv_workspace/openmv/src/stm32cubeai/data:
* network.h
* network.c
* network_data.h
* network_data.c

使用特权

评论回复
27
哈根达斯uz|  楼主 | 2020-8-26 23:12 | 只看该作者
1.5.3 预处理↑
若您需要在运行推断之前进行一些特殊预处理,则必须修改
src/stm32cubeai/nn_st.c 中的 ai_transform_input 函数。默认情况下,该代码执行
以下操作:
• 简单的大小调整(二次采样)
• 从无符号字符转化为浮点数
• 将像素从[0,255]缩放到[0, 1.0]
提供的示例对您的应用程序而言可能是开箱即用的,但您可能需要查看一下这一函数。

使用特权

评论回复
28
哈根达斯uz|  楼主 | 2020-8-26 23:12 | 只看该作者
1.6 步骤 4-编译↑
• 编辑 omv/boards/OPENMV4/omv_boardconfig.h 76 行并
将 OMV_HEAP_SIZE 设置为 230K。这会降低 RAM 中的堆部分,从而为神经网络激
活缓冲区留出了更多空间。
• 执行以下指令行进行编译:
PC $> cd $HOME/openmv_workspace/openmv/src/
PC $> make clean
PC $> make CUBEAI=1

使用特权

评论回复
29
哈根达斯uz|  楼主 | 2020-8-26 23:13 | 只看该作者
若 编 译 失 败 并 显 示 .heap 部分使 RAM1 溢 出 , 则 您 可 编 辑 文 件
src/omv/boards/OPENMV4/omv_boardconfig.h 并将 OMV_HEAP_SIZE 降低
几千字节,然后尝试再次构建。
请记得在构建间隔时执行清理 make clean。

使用特权

评论回复
30
哈根达斯uz|  楼主 | 2020-8-26 23:14 | 只看该作者
1.7 步骤 5-烧录固件↑
• 使用 micro-USB 线将 OpenMV 摄像头插入电脑。
• 打开 OpenMV IDE
• 在工具栏中选择工具 >运行引导程序。
• 选择固件文件(位于 openmv/src/build/bin/firmware.bin)并按照指示操作。
Windows 用户的固件在以下位置:
C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLi
mited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs\
home\<username>\openmv_workspace\openmv\src\build\bin\firmw
are.bin

使用特权

评论回复
31
哈根达斯uz|  楼主 | 2020-8-26 23:15 | 只看该作者
完成后,您可单击位于 IDE 窗口左下方的连接按钮。

使用特权

评论回复
32
哈根达斯uz|  楼主 | 2020-8-26 23:15 | 只看该作者
1.8 步骤 6-使用 micropython 编程↑
• 打开 OpenMV IDE,并单击位于 IDE 窗口左下方的连接按钮
• 创建一个新的 microPython 文件文件>新文件
• 您可以从此示例脚本开始,该脚本运行业已嵌入固件的 MNIST 神经网络

使用特权

评论回复
33
哈根达斯uz|  楼主 | 2020-8-26 23:16 | 只看该作者
'''
Copyright (c) 2019 STMicroelectronics
This work is licensed under the MIT license
'''
# STM32Cube.AI on OpenMV MNIST Example
import sensor, image, time, nn_st
sensor.reset() # Reset and initialize the sensor.
sensor.set_contrast(3)
sensor.set_brightness(0)
sensor.set_auto_gain(True)
sensor.set_auto_exposure(True)
sensor.set_pixformat(sensor.GRAYSCALE) # Set pixel format to Grays
cale
sensor.set_framesize(sensor.QQQVGA) # Set frame size to 80x60
sensor.skip_frames(time = 2000) # Wait for settings take effec
t.
clock = time.clock() # Create a clock object to track t
he FPS.
# [STM32Cube.AI] Initialize the network
net = nn_st.loadnnst('network')
nn_input_sz = 28 # The NN input is 28x28
while(True):
clock.tick() # Update the FPS clock.
img = sensor.snapshot() # Take a picture and return the image.
# Crop in the middle (avoids vignetting)
img.crop((img.width()//2-nn_input_sz//2,
img.height()//2-nn_input_sz//2,
nn_input_sz,
nn_input_sz))
# Binarize the image
img.midpoint(2, bias=0.5, threshold=True, offset=5, invert=Tru
e)
# [STM32Cube.AI] Run the inference
out = net.predict(img)
print('Network argmax output: {}'.format( out.index(max(out))
))
img.draw_string(0, 0, str(out.index(max(out))))
print('FPS {}'.format(clock.fps())) # Note: OpenMV Cam runs abo
ut half as fast when connected

使用特权

评论回复
34
哈根达斯uz|  楼主 | 2020-8-26 23:17 | 只看该作者
取一张白纸,用黑笔画数字,将相机对准纸。该代码必须产生以下输出:

摄像机的输出

使用特权

评论回复
35
哈根达斯uz|  楼主 | 2020-8-26 23:18 | 只看该作者
MicroPython STM32Cube.AI 包装器的文档

使用特权

评论回复
36
哈根达斯uz|  楼主 | 2020-8-26 23:19 | 只看该作者
2.1 loadnnst↑
nn_st.loadnnst(network_name)
初始化名为 network_name 的网络。
参数:
• network_name :字符串,通常为'network'
返回值:
• 网络对象,用于预测

使用特权

评论回复
37
哈根达斯uz|  楼主 | 2020-8-26 23:20 | 只看该作者
示例:
import nn_st
net = nn_set.loadnnst('network')

使用特权

评论回复
38
哈根达斯uz|  楼主 | 2020-8-26 23:21 | 只看该作者
2.2 预测↑
out = net.predict(img)

使用特权

评论回复
39
哈根达斯uz|  楼主 | 2020-8-26 23:22 | 只看该作者
使用 img 作为输入运行网络预测。
参数:
• img :图像对象,来自 nn_st 图像模块,通常取自 sensor.snapshot()
返回值:
• 网络预测作为 python 列表

使用特权

评论回复
40
哈根达斯uz|  楼主 | 2020-8-26 23:23 | 只看该作者
img.crop((img.width()//2-nn_input_sz//2,
img.height()//2-nn_input_sz//2,
nn_input_sz,
nn_input_sz))

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则