一.开发环境的搭建
(一). SDK的搭建
首先配置美信SDK,因为外网墙的原因,使用官方下载方式进行下载速度很慢,正好交流群里有大佬分享了离线下载方式,所以可以很快的配置好SDK。SDK环境我搭建在windows系统上,所以按照windows环境展开。
下面是SDK安装步骤
1. 进入 MaximSDK本地包 目录,解压 data_MaximSDK.zip 到当前目录
2. 解压后,当前目录出现 data_MaximSDK 目录,点进去后马上能看到 www.mxim.net 目录,表示解压正确
3. 点击 启动本地SDK服务 ,自动打开黑窗口,按照窗口提示进行操作
3.1 使用管理员权限,打开记事本
3.2 在打开的记事本中,从文件->打开,选择C:\Windows\System32\drviers\etc目录,在下面 选择所有文件,然后点击hosts文件打开
3.3 在最后,添加:127.0.0.1 www.mxim.net
3.4 然后点击保存;如果提示无权保存,说明不是用管理团权打开的
4. 进入 MaximMicrosSDK安装包 目录,点击 MaximMicrosSDK,先点设置不使用代理,然后按照提示下一步下一步,进行安装即可
5. 安装完成,可重复3的操作,使用 # 注释掉添加的行
根据上述步骤一步一步来,我们最后成功安装好美信SDK,可以进行基本的外设开发了。
下面是SDK界面
因为是基于eclipse内核的,所以界面操作与以往用过的比如ADS很相似,我们可以在project里面导入官方例程,完成点灯
点击上方RUN,可以看到灯亮灭。
(二). AI训练环境的搭建
因为系统原因,通过microsoft store下载的ubuntu没法办法正常展开配置,所以我选择了用VM搭建虚拟机,安装ubuntu系统。
1.下载好Orcale VM,打开,这里因为我提前安装好了,所以已经可以运行
2.创建虚拟系统,要提前下载好ubuntu系统的镜像安装包,然后就和重做电脑系统一样,安装好就行。
3.完成ubuntu基础配置,配置AI训练环境
因为和直播讲解有一些不同,所以我同时参考MaximIntegratedAI/ai8x-training: Model Training for ADI's MAX78000 and MAX78002 AI Devices (github.com)给出的步骤。
把需要的东西下载好,放进创建好的文件夹,后面根据官方给的步骤,进行
Creating the Virtual Environment再
Synthesis Project等,然后成功完成了training和synthesis的配置,注意,这里要安装Python版本3.8.11,才能完成后续工作
因为一起从没有接触过linux系统,对于linux的用法和系统指令都不是很熟悉,因此在入门时浪费了很多时间,不过好在最后成功完成了配置。
二.官方rain_kws20 DEMO的验证
通过上面工作,我们已经把基本环境的配置完成了,这个时候我们可以跑一下官方的demo
我们首先打开ubuntu控制台,激活虚拟环境,直接跑训练
然后就开始训练了
训练就一直在跑了,因为训练工程量大,再加上我用虚拟机的原因,耗时很长,但到此也算完成了基本盘吧。
三.水果训练搭建
(一)训练模型
1.关于数据集的搭建,参考了群里大佬的素材,一共对六种水果进行了训练,分别是苹果、香蕉、橙子、梨、菠萝、西瓜。
2.将数据集分好类放到目录ai8x-training/data/fruit,利用控制台“touch”指令创建fruit.py放在ai8x-training/datasets,将数据集的图片统一为64*64
import torch.nn as nn
import torchvision
from torchvision import transforms
import ai8x
def fruit_get_datasets(data, load_train=True, load_test=True):
(data_dir, args) = data
image_size = (64, 64) #图片大小为64X64
if load_train:
train_data_path = data_dir + '/fruit/train_datasets/'
train_transforms = transforms.Compose([
transforms.RandomHorizontalFlip(), #随机翻转,水平方向
transforms.Resize(image_size),
transforms.ToTensor(), #转化成Tensor
# transforms.Normalize(mean=[0.485,0.456,0.406],
# std=[0.229,0.224,0.225])]),
ai8x.normalize(args=args)
])
train_dataset = torchvision.datasets.ImageFolder(root = train_data_path,
transform = train_transforms)
else:
train_dataset = None
if load_test:
test_data_path = data_dir + '/fruit/test_datasets/'
test_transforms = transforms.Compose([
transforms.Resize(image_size),
transforms.ToTensor(),
# transforms.Normalize(mean=[0.485,0.456,0.406],
# std=[0.229,0.224,0.225])]) #标准化处理
ai8x.normalize(args=args)
])
test_dataset = torchvision.datasets.ImageFolder(root = test_data_path,
transform = test_transforms)
if args.truncate_testset:
test_dataset.data = test_dataset.data[:1]
else:
test_dataset = None
return train_dataset, test_dataset
datasets = [
{
'name': 'fruit',
'input': (3, 64, 64),
'output': ('apple', 'banana', 'orange', 'pear',
'pineapple', "watermelon"),
'loader': fruit_get_datasets,
},
]
3.搭建训练模型
import torch
import torch.nn as nn
import ai8x
class AI85Net_Fruit(nn.Module):
def __init__(self, num_classes=6, num_channels=3,dimensions=(64, 64), bias=False, **kwargs):
super().__init__()
self.conv1 = ai8x.FusedMaxPoolConv2dReLU(num_channels, 16, 3, pool_size=2, pool_stride=2,
stride=1, padding=1, bias=bias, **kwargs)
self.conv2 = ai8x.FusedConv2dReLU(16, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
self.conv3 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
self.conv4 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
self.resid1 = ai8x.Add()
self.conv5 = ai8x.FusedMaxPoolConv2dReLU(20, 20, 3, pool_size=2, pool_stride=2,
stride=1, padding=1, bias=bias, **kwargs)
self.conv6 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
self.resid2 = ai8x.Add()
self.conv7 = ai8x.FusedConv2dReLU(20, 44, 3, stride=1, padding=1, bias=bias, **kwargs)
self.conv8 = ai8x.FusedMaxPoolConv2dReLU(44, 48, 3, pool_size=2, pool_stride=2,
stride=1, padding=1, bias=bias, **kwargs)
self.conv9 = ai8x.FusedConv2dReLU(48, 48, 3, stride=1, padding=1, bias=bias, **kwargs)
self.resid3 = ai8x.Add()
self.conv10 = ai8x.FusedMaxPoolConv2dReLU(48, 32, 3, pool_size=2, pool_stride=2,
stride=1, padding=0, bias=bias, **kwargs)
self.fc = ai8x.Linear(32*2*2, num_classes, bias=True, wide=True, **kwargs)
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
def forward(self, x): # pylint: disable=arguments-differ
"""Forward prop"""
x = self.conv1(x) # 16x32x32
x_res = self.conv2(x) # 20x32x32
x = self.conv3(x_res) # 20x32x32
x = self.resid1(x, x_res) # 20x32x32
x = self.conv4(x) # 20x32x32
x_res = self.conv5(x) # 20x16x16
x = self.conv6(x_res) # 20x16x16
x = self.resid2(x, x_res) # 20x16x16
x = self.conv7(x) # 44x16x16
x_res = self.conv8(x) # 48x8x8
x = self.conv9(x_res) # 48x8x8
x = self.resid3(x, x_res) # 48x8x8
x = self.conv10(x) # 96x4x4
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
def ai85net_fruit(pretrained=False, **kwargs):
"""
Constructs a AI85Net5 model.
"""
assert not pretrained
return AI85Net_Fruit(**kwargs)
models = [
{
'name': 'ai85_fruit',
'min_input': 1,
'dim': 2,
},
]
4.在policies文件夹下创建参数文件schedule-fruit.yaml
---
lr_schedulers:
training_lr:
class: MultiStepLR
milestones: [80, 140]
gamma: 0.2
policies:
- lr_scheduler:
instance_name: training_lr
starting_epoch: 0
ending_epoch: 600
frequency: 1
5.在scripts下新建train_fruit.sh训练文件,接着运行在命令符运行
pyenv local 3.8.11
python -m venv venv --prompt ai8x-training
source venv/bin/activate
scripts/train_fruit.sh
以上就是训练过程。
这里有报错,训练失败,导致tar文件无法获取。
(二).后续的模型的量化、评估、转换等因为虚拟机驱动无法开展,故没有完成。
四.总结
很感谢硬禾学堂,提供一个平台,能够在空余时间提高自己开发的能力,学习到了更多的知识。个人对于图像识别方向还是非常感兴趣的,因为初次接触linux以及学业安排等原因,这次喜成股东,不过在后面我会继续学习,把MAX78000搞明白!