9. 使用AI Cube开发
注:
- 本章节使用SDK1.1.0版本和nncase2.4.0版本实现,后续更改请参考: 嘉楠开发者社区 (canaan-creative.com)->资料下载->Tools->AI Cube->AI_Cube_V##_用户指南。
- 开发时需要注意版本对应,k230_sdk版本和nncase版本对应关系参考链接:K230 SDK nncase版本对应关系 — K230 文档 (canaan-creative.com)。
- MicroPython开发时需要注意版本对应,k230_canmv(MicroPython开发)版本和k230_sdk、nncase版本对应关系参考链接:CanMV-K230_SDK_nncase版本对应关系 — K230 CanMV 文档 (canaan-creative.com)。
- 相关教学视频,见参考章节链接。
- AI Cube不支持AMD训练显卡。
本章节以图像分类和目标检测为例,详细地介绍了AI Cube工具在Ubuntu平台和Windows平台的使用方法,并将任务在K230开发板上部署运行的过程。AI Cube是一款离线训练工具,适合具有计算资源,追求数据安全性,但不关注底层训练代码的用户使用。
9.1 使用AI Cube实现图像分类任务
9.1.1 软件安装
AI Cube是嘉楠为开发者提供的离线开发工具,该平台保证了数据安全性,实现可视化的本地训练。该平台支持图像分类、目标检测、语义分割、OCR检测、OCR识别、度量学习、多标签分类、异常检测共8个任务。
现在以使用Ubuntu版本AI Cube实现蔬菜分类并在CanMV-K230上部署为例,介绍利用AI Cube快速开发的流程。请准备一台带有界面的ubuntu系统PC,安装cuda驱动。
首先,在嘉楠开发者 社区 (canaan-creative.com)的资料下载页面,选择Tools,下载Linux版本AI Cube,推荐使用V1.2版本。
在安装包下载目录解压安装包:
unzip AI_Cube_for_Linux_v1.2.zip
解压后,内部目录如下图所示:
打开一个新的Terminal,先按如下步骤安装dotnet sdk 7.0,如果您的计算机已安装dotnet sdk 7.0,请跳过此步骤。
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt update
apt install -y apt-transport-https
apt install -y dotnet-sdk-7.0
在Terminal进入解压目录,启动AI Cube:
./run.sh
9.1.2 功能页介绍
AI Cube包含5个功能页,“项目”页面主要实现项目管理功能,展示当前项目和最近项目;“图像”页面展示当前项目的数据集信息,便于用户查看数据集的图片;“拆分”页面展示拆分信息,统计拆分类别和不同拆分集的图片;“训练”页面实现训练参数配置,训练信息和训练曲线的显示;“评估”页面实现模型评估和评估信息的展示,并且可以配置部署必要参数生成部署包。
“项目”页面图示:
“图像”页面图示:
“拆分”页面图示:
“训练”页面图示:
“评估”页面图示:
9.1.3 创建数据集
按照不同任务的数据集格式组织数据集。对应数据集格式在“项目”页面点击新建项目查看,同时我们提供了不同任务的示例数据集,在AI Cube/example_dataset/目录下,vegetable_cls就是图像分类任务的示例数据集。
关于不同任务的示例数据集,对应关系如下:
数据集名称 | 对应任务 | 说明 |
---|---|---|
vegetable_cls | 图像分类 | 蔬菜分类场景 |
insect | 目标检测 | 昆虫检测场景 |
Ocular_lesions | 语义分割 | 眼球病变区域分割场景 |
dataset_td100 | OCR检测 | OCR文字检测场景 |
ProductionDate | OCR识别 | 生产日期识别场景 |
drink | 度量学习 | 饮料瓶分类场景 |
multilabel2000 | 多标签分类 | 自然风光多标签分类场景 |
bottle | 异常检测 | 瓶口异常检测场景 |
您既可以使用我们提供的示例数据集,也可以自己按照对应格式组织您的数据集。下面是蔬菜分类场景的数据集的结构:
每个类别一个子目录,子目录内是对应类别的所有图片。
9.1.4 创建项目
进入“项目”页面—>点击“新建项目”按钮—>选择任务类型—>导入数据集—>选择项目的存储路径—>添加项目的名称—>创建项目。
新建项目界面如下图所示:
项目新建完成后,会自动跳转到“图像”页面,您可以查看您的数据集详情。进入“拆分“页面,您可以按照自定义比例对数据集进行拆分,并查看拆分集的统计信息。
9.1.5 启动训练
进入“训练”页面,在左侧配置模型、数据增强和训练参数。
常见参数解析:
平台参数名称 | 常用参数定义 | 参数含义解析 |
---|---|---|
模型 | model | 不同结构的网络模型,用于实现不同的任务; |
Backbone | model backbone | 模型中的特征提取部分网络结构,比如检测和分割任务的模型; |
是否预训练 | pretrain | 是否加载AI Cube提供的预训练模型; |
预训练模型语言 | pretrain language | OCR识别的特定任务参数,选择训练预训练模型的样本语言; |
模型大小 | model size | n、s、m、l、x,同一模型的变体,区别是模型尺寸和输入分辨率,用于平衡准确率和速率; |
模型宽度 | model width | 宽度越大,参数量越大; |
图像尺寸 | image size | 模型输入分辨率,单值表示输入为[x,x],双值表示输入为[x,y]; |
ASPP空洞率 | ASPP dilation rate | 语义分割的参数,不同空洞卷积和池化操作的尺度,不同的空洞率进行空洞卷积可以扩大感受野,获得更广阔的的上下文信息; |
编码长度 | embedding length | 度量学习的特定任务参数,样本被向量化的向量长度; |
自动数据增强 | TrivialAugment | 无参数单图单次自动数据增强; |
其他数据增强方法 | — | 亮度、对比度、饱和度、色度、锐度增强,翻转,旋转,随机缩放,随机裁剪,透视变换,高斯模糊,直方图均衡化,灰度世界算法,CutOut,Random Erasing,Mask; |
学习率 | learning rate | 优化算法的参数,每次迭代的调整步长; |
迭代轮数 | epoch | 一个epoch是神经网络使用全部训练样本训练一次的过程; |
训练批大小 | batchsize | 每次前向和反向传播使用的样本数量; |
优化器 | optimizer | 优化网络的时候使用的优化函数,比如SGD、Adam等; |
AutoAnchor | autoanchor | 目标检测任务中的锚框自适应; |
NMS选项 | nms option | 目标检测任务中区别类内和类间的非极大值抑制选项; |
置信度阈值 | confidience threshold | 用于预测框类别的过滤,低于此阈值的预测框都将被删除; |
交并比阈值 | IOU threshold | 对多个重叠框进行极大值筛选,计算所有检测框的得分,依次与得分最高的检测框对比,大于此阈值的检测框被删除;OCR检测中的Box阈值类似; |
自动混合精度 | AMP | 针对不同层采用不同的数据精度,以节省显存并提高计算速度; |
指数移动平均 | EMA | 平滑方法,防止异常值的影响,权重随时间指数递减; |
早停 | Early Stopping | 增加模型泛化性和防止过拟合的方法; |
预热策略 | WarmUp | 操作训练初始阶段的learning rate,使模型更快的收敛; |
多尺度训练 | MST | 实现对不同尺度的输入图像进行训练,提高检测模型对不同大小物体的检测泛化性; |
损失函数 | loss function | 用于评估模型预测值和真实值的差距程度,损失越小,模型性能越好; |
学习率调度 | learning rate scheduler | 学习率调整策略,训练过程中动态的调整学习率以适应梯度下降过程,包括StepLR、CosineAnnealingLR、LinearLR、MultiStepLR等; |
损失刷新步长 | loss refresh step | 界面Loss曲线绘制频率,以batch为单位; |
GPU索引 | gpu index | 显卡索引号; |
按照不同的任务配置好对应参数后,可以点击“增强样本”按钮查看经过数据增强的部分示例样本;点击“学习率曲线”可以查看不同的学习率策略导致的学习率变化;点击“开始训练”按钮,训练的信息会在右上方面板显示,损失曲线和指标曲线会在中间位置绘制;示例样本的预测结果会在右下面板迭代显示每个epoch的变化。训练时界面如下图:
9.1.6 模型测试
进入“评估”页面,选择训练好的模型,然后选择测试方式。测试方式如下:
测试方式 | 说明 |
---|---|
测试集测试 | 对拆分得到的测试集进行测试评估,输出测试指标数据; |
额外数据测试 | 使用和训练数据集相同格式的带标注数据进行测试,输出测试指标数据; |
图像目录测试 | 只选择使用训练的模型和参数对图片目录下的所有无标注样本进行推理,无测试指标; |
点击“开始测试”按钮,进行测试,测试结束后,根据评估指标查看您的模型性能;双击测试数据列表的条目可以查看推理结果大图。
9.1.7 模型部署
如果模型的性能符合您的需求,您可以在芯片适配面板配置部署参数,主要是模型的输入分辨率和一些基础参数,点击“部署”按钮生成部署包。
部署包生成后您可以在当前项目的根目录下找到如下文件:
- deployment_source.zip
- mp_deployment_source.zip
- *.kmodel
- deploy_config.json
9.1.8 上板准备
完成4.1.1~4.1.7步骤后,AI Cube的部分结束,现在要将得到的kmodel在CanMV-K230开发板部署。CanMV-K230开发板如下图所示:
在进行上板部署前,您需要准备好:
- CanMV-K230开发板一块;
- USB-TypeC数据线一条;
- SD卡一张;
- 读卡器一个;
- Hdmi显示器一台,满足1080P;
- 网线一根,也可不用网络传输,直接使用SD卡拷贝文件;
9.1.8.1 镜像烧录
首先在嘉楠开发者社区 (canaan-creative.com)的资料下载页面,选择K230->Images,选择K230_canmv_sdcard_v##_nncase_v###.img.gz,通过查看9.1.7章节得到的deploy_config.json中的”nncase_version”字段选择对应版本的镜像。
注:
k230_sdk版本和nncase版本对应关系请查看链接:
CanMV-K230_SDK_nncase版本对应关系 — K230 CanMV 文档 (canaan-creative.com)
Linux:
在SD卡插到宿主机之前,输入:
ls -l /dev/sd\*
查看当前的存储设备。
将TF卡插入宿主机后,再次输入:
ls -l /dev/sd\*
查看此时的存储设备,新增加的就是TF卡设备节点。
假设/dev/sdc就是TF卡设备节点,执行如下命令烧录TF卡:
sudo dd if=sysimage-sdcard.img of=/dev/sdc bs=1M oflag=sync
Windows:
Windows下可通过rufus工具对TF卡进行烧录,rufus工具下载地址。
1)将SD卡插入PC,然后启动rufus工具,点击工具界面的”选择”按钮,选择待烧写的固件。
2)点击“开始”按钮开始烧写,烧写过程有进度条展示,烧写结束后会提示“准备就绪”。
烧录结束后,将SD卡插入开发板上电启动:
显示器连接HDMI连接口,需要使用网络可以连接网口。
9.1.8.2 网络配置
如果您选择离线使用读卡器拷贝文件可以跳过此步骤。
- 串口工具调试
安装串口调试工具:MobaXterm安装:在https://mobaxterm.mobatek.net/download.html下载安装。
MobaXterm启动后,选择Session–>Serial:
Serial Port选择两个连续的串口,波特率Speed(bps)选择115200。
需要登录的是小核串口,进入后输入root登录;不需要登录的是大核串口,进入后按”q”回车,退出自启人脸识别程序。
- Windows系统PC端网络配置
控制面板->网络和共享中心->更改适配器设置->以太网网卡->右键属性->选中(TCP/IPv4)->属性
配置IP地址、掩码、网关,配置DNS服务器地址:
- 开发板网络配置
进入小核命令行,执行:
# 查看是否有eth0
ifconfig
# 配置开发板IP,和PC在同一网段下
ifconfig eth0 192.168.1.22
# 查看IP配置
ifconfig
注意:每次断电后都需要重新执行网络配置命令。