1.预备知识
2.样例程序介绍
3.运行代码
3.1.能在笔记本上成功运行 mobilenet_ssd 样例代码。
3.2.理解 Tengine 的工作方式。
3.3.能在 RK3399 上运行该程序。
3.4.能在 RK3399 上运行该程序并使用 GPU 加速
1.预备知识
CLion:一款优秀的C语言开发工具。主要是有免费的社区版本,并且能支持cmake文件的编译。最大的福利就是支持Ubuntu安装。
环境安装:0#00 Tengine 的安装
2.样例程序介绍
样例程序位于tengine目录下," tengine安装路径/examples/mobilenet_ssd/"
我们使用 CLion 打开该项目。
1.选中mobilenet_ssd文件夹
2.右键->open with(打开方式)->Other Applications->View All Applications->CLion(使用CLion打开该文件夹。)
打开该文件的目的:
1.能在笔记本上成功运行 mobilenet_ssd 样例代码。
2.理解 Tengine 的工作方式。
3.能在 RK3399 上运行该程序。
4.能在 RK3399 上运行该程序并使用 GPU 加速
注:当前阶段并不去理解 SSD 的工作方式,因为官方已经为我们提供训练好的 caffe 模型( prototxt + caffemodel )
从百度云中下载 caffe 模型 Tengine model zoo (密码: 57vb)
找到:
MobileNetSSD_deploy.caffemodel
MobileNetSSD_deploy.prototxt
将其存放在 tengine路径下/models/
3.运行代码
TODO:1.能在笔记本上成功运行 mobilenet_ssd 样例代码。
如果直接使用 CLion 对该程序进行编译,会产生报错信息,类似缺少(找不到)头文件。
/usr/bin/cmake --build /home/lee/Documents/tengine/examples/mobilenet_ssd/cmake-build-debug --target MSSD -- -j4
......(省略)
/common.cpp:4:27: fatal error: tengine_c_api.h: 没有那个文件或目录
compilation terminated.
CMakeFiles/MSSD.dir/build.make:86: recipe for target 'CMakeFiles/MSSD.dir/home/lee/Documents/tengine/examples/common/common.cpp.o' failed
make[3]: *** [CMakeFiles/MSSD.dir/home/lee/Documents/tengine/examples/common/common.cpp.o] Error 1
make[3]: *** Waiting for unfinished jobs....
/home/lee/Documents/tengine/examples/mobilenet_ssd/mssd.cpp:32:27: fatal error: tengine_c_api.h: 没有那个文件或目录
compilation terminated.
CMakeFiles/MSSD.dir/build.make:62: recipe for target 'CMakeFiles/MSSD.dir/mssd.cpp.o' failed
......(省略)
cd example/mobilenet_ssd
cmake -DTENGINE_DIR=/home/firefly/tengine .
make
所以问题出在 -DTENGINE_DIR 指定 Tengine 的安装路径。
解决办法:
在 CMAKE 文件中加入该行。
cmake_minimum_required (VERSION 2.8)
project(MSSD)
add_definitions(-std=c++11)
# TODO:设置 TENGINE_DIR 的路径
set( TENGINE_DIR /home/lee/Documents/tengine )
set( INSTALL_DIR ${TENGINE_DIR}/install/)
set( TENGINE_LIBS tengine)
那为什么不使用官方的方法,在CMAKE中加入一个选项呢?
这是我的一些尝试得到的经验:
1.不方便,每次 CMAKE 加入该行,有时我们使用的 tengine 路径和官方不一样,CMAKE 不会报错,修改的时候,要删除一些 CAMKE 产生的内容,才能重新 CMAKE。
2.无法利用 CLion 提供的优势,CLion 每次 CMAKE 会产生一个类似 build 的文件夹,方便管理,不需要再手动删除了。
3.直接编写,能为后续报错信息提供一些思路,有时候使用 ”-DTENGINE_DIR“ 进行指定路径 启动的减号是有中/英文字符区别的,会产生莫名奇妙的错误。
再次编译cmake文件就会没有报错信息了,注意:使用的 Tengine 路径需要修改为适合自己环境特征的。
clion.png
运行该程序:
image.png
所以我们已经完全能够 运行 该 样例 了。
任务1:完成。
TODO:2.理解 Tengine 的工作方式。
任务1:只是单纯的运行程序,测试结果,和 example 差不多,类似于 我们安装的 Tengine 是否能够正常工作。
任务2:已知 MobileNet_SSD 能正常工作的前提下,进行代码的分析。
如果对于 Tengine 一无所知的话,可以利用 "MobileNet_SSD"进行理解,并且可以充分的利用 CLion 这个工具,进行函数查找,OAID 为 Tengine 编写的 "tengine_c_api.h" 文件提供了丰富的注释信息,我们可以将其改为中文,以便确认我们使用了哪些函数。
我的经历总结如下:
TODO:1. 调用 init_tengine() 对 tengine进行初始化
TODO:2. 调用 create_graph 将 训练好的模型 导入到 图(网络)中
TODO:3.1通过 get_graph_input_tensor 获取输入的 tensor
TODO:3.2用 set_tensor_shape 设置输入Tensor的shape
TODO: 4. 调用 prerun_graph 函数预启动图(类似 malloc,申请资源)
TODO: 5.1.向 input_data 写入输入的数据,
TODO: 5.2.并调用 set_tensor_buffer 把数据转移到输入Tensor上
TODO: 6. 调用 run_graph 运行图(做一次前向传播)
TODO: 7.1 向 input_data 写入输入的数据
TODO: 8. 调用 run_graph 运行图(做一次前向传播)
TODO: 9.1.调用 get_graph_output_tensor 获取输出Tensor
TODO: 9.2.并用 get_tensor_shape