【CanMV K230】windows部署AICube,训练模型
- dotnet sdk的下载链接
- 配置环境
- AI_Cube安装训练
- AI_Cube安装
- 模型训练
- 在开发板上运行模型
B站视频链接:《K230 实战》windows系统下使用AI_Cube,训练模型
AI Cube 是由嘉楠科技开发的一款通用视觉 AI 计算平台,该平台能够帮助用户迅速训练 AI 模型,同时可以将训练完毕的模型轻松部署到嘉楠芯片中,如 Canaan k230。使用该平台能够以零代码成本实现项目管理、数据集拆分、数据集分布预览、模型训练评估及模型部署
dotnet sdk的下载链接
dotnet sdk的下载链接
配置环境
输入sysdm.cpl,进入“高级”-“环境变量”
在系统变量中:点击“新建”,创建一个新的环境变量,
变量名为DOTNET_ROOT,变量值为.NET SDK的安装路径,一般的默认安装路径为C:\Program Files\dotnet,所以变量值一般为C:\Program Files\dotnet
然后,在“系统变量”中找到名为Path的变量,选择编辑
保存,确定,然后cmd输入"dotnet",如下图所示即表示成功:
AI_Cube安装训练
AI_Cube安装
AI_Cube的下载地址
下载该包之后,
下载该包之后,进行解压,解压后的包目录如下:
需要注意的是,使用AICube需要去申请许可证,一个许可证管一个月,每个月都需要重新申请,接下来讲解申请的方法:
developersupport developersupport@canaan-creative.com
然后,我们需要把这个许可证复制到我们刚才下载的AI_Cube的文件夹内,具体路径如下:
D:\360安全浏览器下载\AI_Cube_V1.3_for_Windows\AI_Cube(找到自己文件夹就行)
模型训练
打开 AI Cube 后,在项目选项卡页面的右侧可以看到最近的项目和示例项目两部分,由于是
第一次打开,所以最近的项目一栏为空。AI Cube 为用户提供了 8 个示例项目分别是图像分类、目
标检测、语义分割、OCR 检测、OCR 识别、度量学习、多标签分类以及异常检测。
我们这里用的是图像分类:目标检测数据集格式如下
图像格式之前小伙伴给我尺寸了,320*240,再次感谢辽宁第五帅提供的帮助
小伙伴们自己做的时候,创建新项目就行
创建后会进入“图像”页面,我使用的是本身提供的图形分类案例。
我们直接训练,然后看效果
开始训练等着就行
训练等待中
训练时间有点长(我用了大概15分钟)
选练完选职责评估
选择一个模型点击部署
点击后,进入之前创建的项目文件夹,可以看到:
注意:AI_Cube这个包的存放路径不能有中文,不然点击“部署”后不会成功。
在开发板上运行模型
在此处把我们训练的模型添加上
kmodel_path="/sdcard/app/tests/ai_test_kmodel/can2_10.0s_20241022193748.kmodel"
别忘了我们训练好的kmodel文件也要放进来
标签名也改一下哈
labels=["菠菜","长茄子","红苋菜","胡萝卜","西红柿","西蓝花"]
from libs.PipeLine import PipeLine, ScopedTiming
from libs.AIBase import AIBase
from libs.AI2D import Ai2d
import os
import ujson
from media.media import *
from time import *
import nncase_runtime as nn
import ulab.numpy as np
import time
import utime
import image
import random
import gc
import sys# 自定义分类任务类
class ClassificationApp(AIBase):def __init__(self,kmodel_path,labels,model_input_size=[224,224],confidence_threshold=0.7,rgb888p_size=[224,224],display_size=[1920,1080],debug_mode=0):super().__init__(kmodel_path,model_input_size,rgb888p_size,debug_mode)self.kmodel_path=kmodel_path# 分类标签self.labels=labels# 模型输入分辨率self.model_input_size=model_input_size# 分类阈值self.confidence_threshold=confidence_threshold# sensor给到AI的图像分辨率,宽16字节对齐self.rgb888p_size=[ALIGN_UP(rgb888p_size[0],16),rgb888p_size[1]]# 显示分辨率,宽16字节对齐self.display_size=[ALIGN_UP(display_size[0],16),display_size[1]]self.debug_mode=debug_mode# Ai2d实例,用于实现模型预处理self.ai2d=Ai2d(debug_mode)# 设置Ai2d的输入输出格式和类型self.ai2d.set_ai2d_dtype(nn.ai2d_format.NCHW_FMT,nn.ai2d_format.NCHW_FMT,np.uint8, np.uint8)# 配置预处理操作,这里使用了resize,Ai2d支持crop/shift/pad/resize/affine,具体代码请打开/sdcard/app/libs/AI2D.py查看def config_preprocess(self,input_image_size=None):with ScopedTiming("set preprocess config",self.debug_mode > 0):# 初始化ai2d预处理配置,默认为sensor给到AI的尺寸,您可以通过设置input_image_size自行修改输入尺寸ai2d_input_size=input_image_size if input_image_size else self.rgb888p_sizeself.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)# build参数包含输入shape和输出shapeself.ai2d.build([1,3,ai2d_input_size[1],ai2d_input_size[0]],[1,3,self.model_input_size[1],self.model_input_size[0]])# 自定义当前任务的后处理,results是模型输出的array列表def postprocess(self,results):with ScopedTiming("postprocess",self.debug_mode > 0):softmax_res=self.softmax(results[0][0])res_idx=np.argmax(softmax_res)gc.collect()# 如果类别分数大于阈值,返回当前类别和分数if softmax_res[res_idx]>self.confidence_threshold:return self.labels[res_idx],softmax_res[res_idx]else:return "", 0.0# 将结果绘制到屏幕上def draw_result(self,pl,res,score):with ScopedTiming("draw result",self.debug_mode > 0):if res!="":pl.osd_img.clear()mes=res+" "+str(round(score,3))pl.osd_img.draw_string_advanced(5,5,32,mes,color=(0,255,0))else:pl.osd_img.clear()# softmax函数def softmax(self,x):exp_x = np.exp(x - np.max(x))return exp_x / np.sum(exp_x)if __name__=="__main__":# 添加显示模式,支持"hdmi"和"lcd"display_mode="hdmi"if display_mode=="hdmi":display_size=[1920,1080]else:display_size=[800,480]# 模型路径,需要用户自行拷贝到开发板的目录下kmodel_path="/sdcard/app/tests/ai_test_kmodel/can2_10.0s_20241022193748.kmodel"# 根据数据集设置,在线训练平台和AICube部署包的deploy_config.json文件中包含该字段labels=["菠菜","长茄子","红苋菜","胡萝卜","西红柿","西蓝花"]# 初始化PipeLinepl=PipeLine(rgb888p_size=[1280,720],display_size=display_size,display_mode=display_mode)pl.create()# 初始化自定义分类器cls=ClassificationApp(kmodel_path,labels,rgb888p_size=[1280,720],display_size=display_size,debug_mode=0)# 配置分类任务的预处理cls.config_preprocess()try:while True:os.exitpoint()with ScopedTiming("total",1):# 获取当前帧数据img=pl.get_frame()# 推理当前帧res,score=cls.run(img)# 绘制结果到PipeLine的osd图像cls.draw_result(pl,res,score)# 显示当前的绘制结果pl.show_image()gc.collect()except Exception as e:sys.print_exception(e)finally:cls.deinit()pl.destroy()