0、引言

2022更新说明:这块芯片水太深,能不碰最好别碰,官方当时留的资料实在太少(或者说我太菜)。
如果要调用最新的nncase工具箱所支持的算子,最好采用嘉楠自家工具链+VScode进行开发。不建议采用迦南官方编译器,虽然集成了大量栗子,但讲解较为含糊,不利于开发,即使给了例程,大概率也不知道怎么改那些API)。
如果我做成了,后期我会出一个较为详细的文档,记录如何实现整个流程
Pytorch——》ONNX——》KModel——》Run

该博客仅作为学习K210单片机KPU跑目标检测模型记录,本人新人小白,本文旨在备忘,如有错误,还望指出,谢谢。
硬件:Sipeed Maix Dock开发板
软件:MaixPy IDE,NNCase Converter v0.1.0 RC5(模型转换工具)
相关工具及软件点击这里不需积分下载

1、模型转换

1.1、首先需要下载NNCase工具箱,各版本下载地址
1.2、有关nnc的使用,在Windows下首先在运行中,输入CMD,打开命令行窗口
1.3、使用cd命令,到nnc的根目录下
1.4、后使用nnc相关命令行进行操作,命令行说明可以参考
在将yolo.tflite模型放到ncc根目录下后,使用以下命令进行转换

ncc yolo.tflite yolo.kmodel -i tflite -o k210model --dataset images

其中yolo.tflite为ncc工具根目录下的待转换模型,yolo.kmodel为转换完成的模型名称(提前设定),-i tflite代表输入模型格式,而-o k210model则代表输出模型模式,–dataset images代表量化图片所存放的文件夹,images是文件夹名,一般放入训练集图片即可。
最终即可在ncc根目录下找到转换完成的kmodel文件

同时,你也可以使用QT版ncc转换工具,目前仅支持tflift格式的模型文件

2、模型使用

2.1、检查模型

通过上述步骤得到kmodel文件后,将其拷贝进FAT32格式的TF卡中(可以不用格式化),后将TF卡插入K210开发板
并使用以下代码进行测试。如成功读取到TF卡中的模型文件,液晶屏上将显示模型地址及模型尺寸。如下图所示

from Maix import GPIO, I2S, FFT
import image, lcd, math,sensor,time
import KPU as kpu#初始化液晶屏
lcd.init(freq=15000000)
lcd.clear()#加载SD卡中的模型
task = kpu.load("/sd/yolo.kmodel")
##测试模型是否加载成功,如成功会返回模型地址和模型尺寸
lcd.draw_string(1, 1, str(task), lcd.RED, lcd.BLACK)

其中kpu.load()函数的使用说明详见此,博客地址

源代码见此

STATIC mp_obj_t py_kpu_class_load(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args)
{int err = 0;uint32_t model_size;py_kpu_net_obj_t  *o = m_new_obj_with_finaliser(py_kpu_net_obj_t);o->base.type = &py_kpu_net_obj_type;if(mp_obj_get_type(pos_args[0]) == &mp_type_int){    //load from flash addressmp_int_t model_addr = mp_obj_get_int(pos_args[0]);if(model_addr <= 0)//TODO: address of code end{m_del(py_kpu_net_obj_t, o,sizeof(py_kpu_net_obj_t));mp_raise_ValueError("[MAIXPY]kpu: model_addr must > 0 ");return mp_const_false;}o->model_addr = mp_obj_new_int(model_addr);o->model_path = mp_const_none;sipeed_kpu_err_t ret = sipeed_kpu_model_load(&o->kmodel_ctx, model_addr, NULL, &model_size);if(ret != SIPEED_KPU_ERR_NONE){err = ret; //load errorgoto error;}}else if(mp_obj_get_type(pos_args[0]) == &mp_type_str){const char *path = mp_obj_str_get_str(pos_args[0]);o->model_path = mp_obj_new_str(path,strlen(path));o->model_addr = mp_const_none;// if(NULL != strstr(path,".bin"))// {//     err=model_init(kpu_task,path);//     if( err != 0 )//     {//         model_deinit(kpu_task);//         goto error;//     }// }// elseif( (NULL != strstr(path,".kmodel")) || (NULL != strstr(path,".smodel")) || (NULL != strstr(path,".emodel")) ){int ret = sipeed_kpu_model_load(&o->kmodel_ctx, 0, path, &model_size);if(ret != SIPEED_KPU_ERR_NONE){err = ret;goto error;}}else{   m_del(py_kpu_net_obj_t, o,sizeof(py_kpu_net_obj_t));mp_raise_ValueError("[MAIXPY]kpu: model format don't match, only supply .kmodel ");return mp_const_false;}}else{m_del(py_kpu_net_obj_t, o,sizeof(py_kpu_net_obj_t));mp_raise_TypeError("[MAIXPY]kpu: only accept int or string");return mp_const_false;}    o->net_args = mp_const_none;o->net_deinit = mp_const_none;o->model_size = mp_obj_new_int(model_size);o->max_layers = mp_obj_new_int(sipeed_kpu_model_get_layer_num(o->kmodel_ctx));return MP_OBJ_FROM_PTR(o);error:
{char* err_msg = get_kpu_err_str(err);nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "[MAIXPY]kpu: load error:%d, %s", err, err_msg));
}
}STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_kpu_class_load_obj, 1, py_kpu_class_load);

在确认K210单片机能正确识别到tf卡中的kmodel后,我们就可以进行下一步的工作了。

2.2、使用模型

from Maix import GPIO, I2S, FFT
import image, lcd, math,sensor,time
import KPU as kpu#对摄像头进行初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
#sensor.set_windowing((224, 224))
#sensor.set_windowing((320, 240))
sensor.set_brightness(2)
sensor.set_vflip(1)
sensor.run(1)#初始化液晶屏
lcd.init(freq=15000000)
lcd.clear()clock = time.clock()
#标签类名
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']#加载SD卡中的模型
task = kpu.load("/sd/yolo.kmodel")
##测试模型是否加载成功,如成功会返回模型地址和模型尺寸
#lcd.draw_string(1, 1, str(task), lcd.RED, lcd.BLACK)#设置锚框大小
anchor = (1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52)
#初始化kpu yolo2
#形参:模型尺寸,mp_obj
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):#用于计算FPS值clock.tick()#将摄像头采集到的值赋给img这个变量img = sensor.snapshot()code = kpu.run_yolo2(task, img)#打印帧率(115200)print(clock.fps())if code:for i in code:#画矩形框a=img.draw_rectangle(i.rect())#显示出来a = lcd.display(img)for i in code:#打印类标签(根据bbox位置)lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)else:a = lcd.display(img)
a = kpu.deinit(task)

3、参考资料

https://github.com/TonyZ1Min/yolo-for-k210
https://blog.sipeed.com/p/677.html
https://github.com/kendryte/nncase/tree/master/examples/20classes_yolo

K210学习记录(3)——kmodel生成与使用相关推荐

  1. Matlab学习记录-矩阵的生成

    Matlab学习记录-矩阵的生成 matlab中生成矩阵有两种方式: 1.中括号加分号. 中括号表示矩阵,分号表示分行:每一行之间的元素可以用逗号分开也可以用空格分开: 例如 a=[1 2 3; 4 ...

  2. K210学习记录(2)——UART(串口)

    0.引言 本系列博客仅作为本人学习K210单片机的学习记录,主要学习其内部资源使用,作为初学者难免有错误之处,如有发现还望指出. 硬件:Sipeed Maix Dock开发板(推荐官方KD233开发板 ...

  3. python学习记录之随机生成姓名

    def random_name():firstName = '赵钱孙李周吴郑王戚谢邹喻顾孟平黄熊纪舒屈江童颜郭郁单杭洪裴陆荣翁姬申扶堵漆雕乐正汝鄢涂钦羊舌微生伍余元卜'lastName = '伟刚勇毅 ...

  4. 基于深度学习的春联自动生成系统 实验记录

    基于深度学习的春联自动生成系统主要分成两个方面: 1.数据集构造 2.模型搭建 本文将主要从这两个方面展开,之后将介绍实验结果和结果分析. 目录 一.[数据集构造] 1.分词方面 2.编码方面 3.数 ...

  5. 【K210学习笔记】#MaixPy#(3)人脸检测与人脸识别

    目录 一.人脸检测: 1.烧录模型: 2.示例测试: 二.人脸识别: 1.获取机器码: 2.获取人脸识别模型: 3.烧录专用固件: 4.烧录模型: 5.示例测试: 6.报错解决: 一.人脸检测: 1. ...

  6. 【K210】K210学习笔记六——MaixHub在线模型训练识别数字

    [K210]K210学习笔记六--MaixHub在线模型训练识别数字 前言 K210准备工作 数据的获取 MaixHub如何在线训练模型 训练模型在K210上的测试 小结 前言 本人大四学生,电赛生涯 ...

  7. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  8. add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX

    Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...

  9. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

最新文章

  1. Ditto剪贴板增强工具 ,方便复制粘贴多条历史记录
  2. ((ios开发学习笔记五))手动创建Tab Bar Controller 程序
  3. VMware Workstation提示:另一个程序已锁定文件的一部分,进程无法访问,删除.lck文件夹和文件
  4. 通过GPG非对称加密工具验证ECharts发布版本实例演示,win10下Gnu Privacy Guard工具的安装和使用方法
  5. 凯兑换系统服务器角色,王者荣耀新英雄凯怎么兑换
  6. 系统工具源码设计页面
  7. Pots POJ - 3414(bfs)
  8. 2011年计算机一级考试题,2011年计算机一级考试模拟试题及参考答案(1)
  9. 英特尔全部cpu列表_程序员大神Linus转投AMD:我希望英特尔的AVX 512指令集「去死」...
  10. webpack+vue动态加载组件尝试
  11. cacheable中的condition和unless
  12. express router路由管理中间件
  13. mapengpeng1999@163.com 数据库的设计
  14. 薇诺娜如何以创新战略在新消费浪潮中屹立不倒
  15. 电路分析 基尔霍夫定律 详解课堂笔记
  16. 31、通信卫士--拦截黑名单电话
  17. iphone4s拒接电话
  18. 【ZOJ3587】Marlon's String——白四爷×KMP 白濑肆の算法完全解读KMP篇 KMP来袭第二弹前缀什么的果然最讨厌了!【1.0%达成!】
  19. 高德地图小程序步行路线显示_微信小程序----map路线规划
  20. 武侠小说阅读记录 2009-02-18 21:14

热门文章

  1. 群晖nas上部署gitea后修改IP地址
  2. 项目_MySQL比较字符大小的小坑
  3. linux能否批量重命名,linux批量重命名方法
  4. Mac 关闭Cisco AnyConnect 开启启动
  5. VMware虚拟机NAT模式下连不上网
  6. 乖离率背离公式_乖离率BIAS操盘口诀:“W底上涨为先,M顶下跌为先”仅12字,赚得盆满钵满...
  7. java改变字体_java字体设置
  8. 组态王与网关设备的通讯(京金华TNode-M多网口网关)
  9. JPO Summary
  10. linux多重引导工具,Linux多重引导器