MAX78000FTHR开发板环境搭建与水果识别的训练过程
完成了开发板外设与AI训练环境的搭建,对于水果识别未完成,仅完成了训练部分,并且因为虚拟机原因,无法训练,后续的模型的量化、评估、转换等无法开展。
标签
嵌入式系统
MAX78000FTHR
voncg
更新2023-01-31
安徽师范大学
1000

一.开发环境的搭建

(一). 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搞明白!

团队介绍
myself
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号