【CanMV K230】windows部署AICube,训练模型


请添加图片描述

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_size
            self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)
            # build参数包含输入shape和输出shape
            self.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=["菠菜","长茄子","红苋菜","胡萝卜","西红柿","西蓝花"]
    # 初始化PipeLine
    pl=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()


在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼桨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值