k210是一个面向AIOT应用的低功耗,低成本芯片方案。 它目前支持的深度学习模型类型有tensorflow tflite, caffe1.0以及onnx。 值得注意的是,这3个模型类型所支持的算子有限,这会导致复杂些模型不能在k210上运行。k210另外一个缺点是,它内置了SRAM, 给ai模型的内存大小只有2MB,也就是说它只能支持2MB以内的模型。
由于我们项目的模型是yolov3 tiny,而且做了裁剪只有4MB左右大小。再去做8bit量化后只有1MB大小,所以是可以在k210上运行起来的。
1)darknet模型转换到tensorflow框架。
由于我们模型是采用darknet框架训练的,所以第一步需要将darknet模型转成tensorflow。
这里可以参考这个链接:https://github.com/jinyu121/DW2TF.git
最终的转换结果如下所示:
2)由于k210的编译器只支持tensorflow的pb模型输入,所以第二步要将tensorflow的ckpt模型转换成pb
注意,第一步的pb实际上还是模型配置文件,里面没有weights值。
具体ckpt2pb.py的脚本实现可以自行上网解决。
3)用tensorflow自带的toco命令将pb模型转换成tflite轻量级模型。
其实这里并没有做8bit量化,因为后面使用k210的nncase工具可以来完成该量化 。所以这个tflite模型实际上还是float32模型。
4)到这一步,就终于可以用k210工具nncase来讲tflite模型转换成kmodel(回忆下前面,nncase只支持tflite,caffe或onnx)。
nncase的链接如右所示:https://github.com/kendryte/nncase.git
不过该开源代码不容易编译成功,可以直接去下载编译好的可执行文件,如下所示(我的平台为win10 64bit):
nncase解压并配置成功后,就可以在CMD窗口输入如下编译命令:
ncc.exe compile ./model/yolov3-tiny_xxx.tflite ./model/yolov3-tiny_xxx.kmodel -i
tflite -o kmodel --dataset ./dataset/
注意下,上面的--dataset参数,它是指8bit量化时所需要的的参考图像,一般准备500张经典场景训练样本图片。
生成kmodel后,先不要急着去到板子上面运行,可以先跑下仿真命令来得到最后一个conv层的输出。
ncc.exe infer ./model/yolov3-tiny_xxx.kmodel ./result --dataset ./testset
为了验证最后一个仿真层的输出是否正常,可以将该输出值灌到yolo层看看最终输出的检测结果是否正常。
这个只是简单的k210模型移植流程简单介绍。kmodel正确生成还只是一个好的开始,还需要结合软件运行到板上。 这里面细节也比较多,后续有机会再介绍。