日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

K210学习记录(3)——kmodel生成与使用

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 K210学习记录(3)——kmodel生成与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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生成与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。