iotboy · 8月4日

C语言部署深度学习模型--CPU篇

本文介绍如何利用推理框架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仓库

此时目录结构应该是这样:

├── 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专栏。
3 阅读 481
推荐阅读
0 条评论
关注数
1156
内容数
19
关于AIoT相关的技术文章以及相关资源。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息