本文介绍如何利用推理框架Tengine使用C语言在Khadas VIM3 CPU上部署 MobileNet v1 分类网络模型,实现指定图片分类的功能。
0x00 Khadas VIM3介绍
为什么要使用Khadas VIM3呢,来跑个分 ,不不不,请先看参数:
- CPU:Amlogic A311D - x4 2.2Ghz Cortex A73, x2 1.8Ghz Cortex A53
- NPU:5 TOPS Performance NPU INT8 inference up to 1536 MAC
- SPI Flash :16MB
- LPDDR4/4X:4GB
- 操作系统: Fenix 1.0.7 Ubuntu 20.04.2 LTS Linux 4.9.241
总结一下就是Khadas VIM3拥有有超低的功耗、强劲的性能,还具备5.0 TOPS神经网络加速器
0x01 Tengine Arm64 Linux 交叉编译
使用交叉编译的好处是可以提高编译的速度。
## 下载源码
git clone https://github.com/OAID/Tengine.git Tengine-lite
## 安装Arm64 Linux 交叉编译工具链
sudo apt install g++-aarch64-linux-gnu
## 编译 Tengine Lite
cd Tengine-Lite
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake ..
make
make install
编译好的目录如下:
install
├── include
│ └── tengine
│ ├── c_api.h C预测库头文件
│ └── defines.h
└── lib
├── libtengine-lite-static.a 静态预测库
└── libtengine-lite.so 动态预测库
当然,你也可以在Khadas VIM3开发板上进行本地编译,可以参考这里:
0x02 代码获取
为了便于演示,本文用的C代码、模型和图片均来自Tengine 官方Github仓库
- 把编译好的so和头文件复制到项目目录中的tengine目录
- 把Tengine/examples/common中部分文件放入common目录
- 把模型仓库的mobilenet.tmfile模型放到models目录,cat.jpg图片放到images目录
- 把tm\_classification.c文件放到src目录
此时目录结构应该是这样:
├── images
│ └── cat.jpg
├── models
│ └── mobilenet.tmfile
├── src
│ ├── common
│ │ ├── common.h
│ │ ├── stb_image.h
│ │ ├── stb_image_write.h
│ │ ├── tengine_operations.c
│ │ └── tengine_operations.h
│ └── tm_classification.c
└── tengine
├── include
│ └── tengine
│ ├── c_api.h
│ └── defines.h
└── lib
└── libtengine-lite.so
0x03 编写 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(tm_classification)
set(CMAKE_CXX_STANDARD 11)
include_directories(tengine/include/ src/common/)
add_library(tengine SHARED IMPORTED)
set_target_properties(tengine PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/tengine/lib/libtengine-lite.so)
add_executable(tm_classification src/tm_classification.c "src/common/tengine_operations.c" )
target_link_libraries(tm_classification -lm tengine)
0x04 编译
mkdir build
cd build
cmake ..
make -j`nproc`
0x05 测试
./build/tm_classification -m ./models/mobilenet.tmfile -i ./images/cat.jpg
输出:
Khadas VIM3上MobileNet v1 模型平均识别是943.29ms,这并没有发挥出Khadas VIM3的真正实力,比较它NPU算力可以达到5 TOPS,既然NPU这么强就不能浪费,下一篇文章将介绍如何使用Khadas VIM3 NPU部署深度学习模型,另外如果小伙伴们有需要,我可以写一个番外篇,讲解一下tm\_classification.c代码
作者:iotboy
首发:知乎
相关阅读
定期更新,更多AIoT相关技术知识请关注动手学AIoT专栏。