游乐游手机版
首页/AI热点日报/热点详情

HPM6750边缘AI框架运行实测与TFLM基准测试

类型:热点整理2026-07-14
如果您关注嵌入式AI领域的开发,一定听说过TensorFlow——谷歌开源的机器学习框架,它同时支持模型训练与推理。但今天我们要聊的是它的一个特殊分支:TensorFlow Lite for Microcontrollers,简称TFLM。 先理清几个关键概念。TensorFlow Lite(TFL

如果您关注嵌入式AI领域的开发,一定听说过TensorFlow——谷歌开源的机器学习框架,它同时支持模型训练与推理。但今天我们要聊的是它的一个特殊分支:TensorFlow Lite for Microcontrollers,简称TFLM。

先理清几个关键概念。TensorFlow Lite(TFLite)是谷歌为将模型部署到手机、平板等移动设备而推出的轻量级方案,可以理解为“手机版TensorFlow”。而TFLM则是TFLite的微控制器版本,专门针对内存仅有几千字节的单片机设计。它不依赖操作系统,不需要标准C/C++库,甚至无需动态内存分配。官方数据显示,在Cortex M3上,核心运行时仅需16KB,再加上一个语音关键词检测模型也不过22KB。这三者的关系可以想象成一棵树:TensorFlow是主干,TFLite是分支,而TFLM则是分支上的细枝。如今它们并行发展,但很长一段时间内代码都存放在同一个仓库——TensorFlow包含后两者,TFLite又包含TFLM。

那么,TFLM在HPM6750上如何运行?HPM SDK已经为我们做了不少准备工作。

HPM SDK中的TFLM

TFLM中间件

HPM SDK集成了TFLM中间件,位于 hpm_sdk/middleware 子目录。该目录的代码是从TFLM开源项目裁剪而来,删除了大量无关文件,仅保留最核心的运行部分。

TFLM中间件目录

TFLM示例

SDK还提供了示例代码,位于 hpm_sdk/samples/tflm 子目录。该示例基于官方的person_detection示例改造,增加了摄像头采集和LCD显示功能。但由于手头缺少配套的摄像头和显示屏,这里就不以此示例进行演示了。

TFLM示例目录

换一个思路,直接运行TFLM的基准测试(benchmark)——person detection benchmark,效果更加直观。

在HPM6750上运行TFLM基准测试

将person detection benchmark源代码添加到HPM SDK环境

按照以下步骤操作:

  1. 在HPM SDK的 samples 子目录下创建 tflm_person_detect_benchmark 目录,并在其中创建 src 目录。
  2. 从已经运行过person detection benchmark的tflite-micro目录中,拷贝以下文件到 src 目录:
    • tensorflow/lite/micro/benchmarks/person_detection_benchmark.cc
    • tensorflow/lite/micro/benchmarks/micro_benchmark.h
    • tensorflow/lite/micro/examples/person_detection/model_settings.h
    • tensorflow/lite/micro/examples/person_detection/model_settings.cc
  3. src 目录下创建 testdata 子目录,并将tflite-micro目录下 tensorflow/lite/micro/tools/make/gen/linux_x86_64_default/genfiles/tensorflow/lite/micro/examples/person_detection/testdata 中的文件全部拷贝到 testdata 中。
  4. 修改 person_detection_benchmark.ccmodel_settings.ccno_person_image_data.ccperson_image_data.cc 文件中部分 #include 预处理指令的文件路径(根据拷贝后的相对路径修改)。
  5. person_detection_benchmark.cc 文件的main函数开头添加一行 board_init();,并在文件顶部添加 #include "board.h"

添加CMakeLists.txt和app.yaml文件

src 同级目录下创建 CMakeLists.txt,内容如下:

cmake_minimum_required(VERSION 3.13)
set(CONFIG_TFLM 1)
find_package(hpm-sdk REQUIRED HINTS $ENV{HPM_SDK_BASE})
project(tflm_person_detect_benchmark)
set(CMAKE_CXX_STANDARD 11)

sdk_app_src(src/model_settings.cc)
sdk_app_src(src/person_detection_benchmark.cc)
sdk_app_src(src/testdata/no_person_image_data.cc)
sdk_app_src(src/testdata/person_image_data.cc)

sdk_app_inc(src)
sdk_ld_options("-lm")
sdk_ld_options("--std=c++11")
sdk_compile_definitions(__HPMICRO__)
sdk_compile_definitions(-DINIT_EXT_RAM_FOR_DATA=1)
# sdk_compile_options("-mabi=ilp32f")
# sdk_compile_options("-march=rv32imafc")
sdk_compile_options("-O2")
# sdk_compile_options("-O3")
set(SEGGER_LEVEL_O3 1)
generate_ses_project()

再创建 app.yaml 文件,内容如下:

dependency:
  - tflm

编译和运行TFLM基准测试

接下来进入熟悉的编译运行流程。首先使用命令生成项目:

generate_project

将HPM6750开发板连接至PC,在Embedded Studio中打开刚刚生成的项目:

打开项目

由于引入了TFLM的源码,文件数量较多,右侧源码导航窗的Indexing需要等待一段时间才能完成。之后按F7编译,再按F5开始调试:

编译调试

编译完成后,打开串口终端(波特率115200),启动调试并继续运行,即可看到基准测试的输出结果:

==============================
 hpm6750evkmini clock summary
==============================
cpu0:            816000000Hz
cpu1:            816000000Hz
axi0:            200000000Hz
axi1:            200000000Hz
axi2:            200000000Hz
ahb:             200000000Hz
mchtmr0:         24000000Hz
mchtmr1:         1000000Hz
xpi0:            133333333Hz
xpi1:            400000000Hz
dram:            166666666Hz
display:         74250000Hz
cam0:            59400000Hz
cam1:            59400000Hz
jpeg:            200000000Hz
pdma:            200000000Hz
==============================

----------------------------------------------------------------------
$$   $$ $$$$$$$  $$      $$ $$
$$ |  $$ |$$  __$$ $$$    $$$ |__|
$$ |  $$ |$$ |  $$ |$$$$  $$$$ |$$  $$$$$$$  $$$$$$   $$$$$$
$$$$$$$$ |$$$$$$$  |$$$$$$ $$ |$$ |$$  _____|$$  __$$ $$  __$$
$$  __$$ |$$  ____/ $$ $$$  $$ |$$ |$$ /      $$ |  __|$$ /  $$ |
$$ |  $$ |$$ |      $$ |$  /$$ |$$ |$$ |      $$ |      $$ |  $$ |
$$ |  $$ |$$ |      $$ | _/ $$ |$$ |$$$$$$$ $$ |      $$$$$$  |
__|  __|__|      __|     __|__| _______|__|       ______/
----------------------------------------------------------------------
InitializeBenchmarkRunner took 114969 ticks (4 ms).

WithPersonDataIterations(1) took 10694521 ticks (445 ms)
DEPTHWISE_CONV_2D took 275798 ticks (11 ms).
DEPTHWISE_CONV_2D took 280579 ticks (11 ms).
CONV_2D took 516051 ticks (21 ms).
DEPTHWISE_CONV_2D took 139000 ticks (5 ms).
CONV_2D took 459646 ticks (19 ms).
...
NoPersonDataIterations(1) took 10694160 ticks (445 ms)
...
WithPersonDataIterations(10) took 106960312 ticks (4456 ms)
NoPersonDataIterations(10) took 106964554 ticks (4456 ms)

从输出日志可以看出,在HPM6750EVKMINI开发板上,连续运行10次人像检测模型,总耗时4456毫秒,平均每次耗时445.6毫秒。

在树莓派3B+上运行TFLM基准测试

作为对比,我们在树莓派3B+上运行相同的基准测试。在树莓派上可以直接使用PC端的测试命令,得到如下结果:

树莓派结果

可以看到,对于包含人脸的图片,连续运行10次平均耗时418.6毫秒;对于不包含人脸的图片,平均耗时419毫秒。

HPM6750与树莓派3B+、AMD R7 4800H的对比

将HPM6750EVKMINI、树莓派3B+和AMD R7 4800H上运行人脸检测模型的平均耗时汇总如下:

对比表

有趣的是,在TFLM人脸检测模型场景下,HPM6750EVKMINI和树莓派3B+表现相当。尽管HPM6750主频为816MHz,远低于树莓派3B+的BCM2837 Cortex-A53 1.4GHz,但单核计算能力并未拉开明显差距。

需要说明的是,树莓派上的测试运行在64位Debian Linux系统上,而HPM6750运行在裸机环境中。操作系统的任务调度器会带来一定的性能损耗,因此这一对比并非严格意义上的公平对比,仅作为参考之用。

来源:https://m.elecfans.com/article/2132001.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。