欣博STKN开发小记
总体思路
flowchart LR
A[您的模型<br>my_model.pt] -->|导出| B[ONNX 模型<br>my_model.onnx]
B -->|STKN模型编译器<br>make -C .../tools/| C[STKN 模型<br>my_model.param/.bin]
C -->|部署到板子| D[欣博板卡]
B -->|Netron 工具| E[可视化检查<br>模型结构]
subgraph F[PC端仿真测试]
direction TB
C -->|C-Model/Simulator| G[验证结果正确性]
end
F -- 验证成功 --> D
好吧这图其实是找AI帮画的
准备工作
开发环境准备
厂家给的套件是linux版的,建议开发机系统是Ubuntu 20.04
。太老了!我直接用Arch!反正都能用!他的工具链都是静态编译的怕啥!!!I use Arch BTW!
解压他们厂家给的压缩包,里面有一个riscv64的编译器。把它再解压,然后要对它进行环境变量配置。
我是创建了envsetup
脚本,source
它一下就好了。文件如下:
1 |
|
模型准备
转换为onnx
格式
二更!和甲方交流后得知这个东西其实是支持yolo v8的!所以后面会在v8相关的地方做注明。
首先,你得要有一个已经训练好了的yolo模型。它可以是v5的,也可以是v7的。但我手里的是v8的,用不了(悲),就只能用他们厂家提供的了。
那么我们就要对模型进行格式转换。欣博他们有自己的一套框架,格式是STKN
,由xxx.bin
和xxx.param
构成。为了兼容性,他们提供了一套工具用来把onnx
模型转换成STKN
格式的。这一步怎么那么像LLVM的IR啊。
所以第一步我们需要对模型进行格式转换。
这个是yolov8/v5的转换脚本(因为它们都来自ultralytics
库),完成后会生成同名.onnx
文件:
1 |
|
转换为STKN
格式
以yolov7为例,我们用这个命令转就行:
1 |
|
或者用我的这个v8命令:
1 |
|
对v8支持的测试
既然厂家说是支持v8的,但是文档和案例里都没给出相关代码。我这里记录下我的移植尝试:
修改MakeFile和cpp文件
先在models
文件夹下创建yolov8
文件夹,然后放入转换成onnx
格式的yolov8.onnx
,并创建如下Makefile
:
1 |
|
复制demo/yolov7-tiny.cpp
-> demo/yolov8.cpp
,并将里面对v7tiny
的引用改成v8
的。
添加单元测试
修改demo/CMakeLists.txt
,在最后的add_example
里依葫芦画瓢加上:
1 |
|
然后在images
目录下创建images/yolov8.jpg
,从别的地方找一张你的模型适用的图片就行。
编译主程序
我这里就编译了C_MODEL
模式的,直接进入demo
目录然后make
就行。
完成后会在demo/build-c_model
下生成face_detect
, plate_detect
, yolov5s
, yolov7-tiny
, yolov7-tiny_float
五个可执行文件,我们接下来就可以用它们来进行识别了。
按照yolov8
移植的做了之后,还会有个yolov8
的二进制文件。
运行识别demo
我们使用yolov7-tiny
来进行识别。
1 |
|
在添加LD_LIBRARY_PATH
后,给yolov7-tiny
这个二进制传递两个参数即可,第一个参数是模型所在文件夹,要包含STKN
格式模型的两个文件,第二个参数是你要识别的图片。随后会将识别好带框的图片存在二进制程序所在目录下,和二进制程序同名的jpg。
yolov8
的用法和上面的一样。