基于MAX78000的衣物识别与分类实践
本项目以MAX78000FTHR快速开发平台为基础,用开发板自带的摄像头拍摄生活中常见的衣服、裤子、鞋子、包包等,并通过MAX78000内置的基于RISC-V的低功耗卷积神经网络加速器实施AI推理,判断照片中物品的类别。
标签
嵌入式系统
人工智能
DengCJ96
更新2022-12-02
中国石油大学(华东)
974

一、项目简要介绍

本项目以MAX78000FTHR快速开发平台为基础,用开发板自带的摄像头拍摄生活中常见的衣服、裤子、鞋子、包包等,显示在分辨率172*320的1.7寸IPS显示屏上,并通过MAX78000内置的基于RISC-V的低功耗卷积神经网络加速器实施AI推理,判断图片中的物品类型。

前期先通过Pytorch训练模型,基于Fashion MNIST数据集熟悉训练过程。Fashion MNIST是一个易于获取的图像数据集,它包含了10个不同类物品的70000张图片。本项目使用这些灰度图像训练自定义的五层神经网络模型,主要使用到pytorch、torchvision和matplotlib。训练数据集在GPU下迭代100次,测试结果表明,模型的全局准确率达到89.1%。

(模型至MCU的部署过程待调通后补充。。。)

二、数据准备

使用torchvision下载和处理数据集。对下载的训练和测试数据集进行分割,每批包含64张图像。操作细节见下方代码。

FtfrKbOOzuQ6xk7E1rQvOq-bnIO_

设计一个5层神经网络,第一层的输入数量为 784*512。

FrLOKmOpBMtxFpjmZMnTLWALuYAt

代码如下。

# Create Net Class
class Classifier_fashion(nn.Module):
  def __init__(self,ni,no):
    super().__init__()
    #L1 28*28(defined later)->512
    self.liner1 = nn.Linear(ni,512)
    #L2 512->256
    self.liner2 = nn.Linear(512,256)
    #L3 256->128
    self.liner3 = nn.Linear(256,128)
    #L4 128->64
    self.liner4 = nn.Linear(128,64)
    #L5 64->10(defined later)
    self.liner5 = nn.Linear(64,no)

三、参数设置

使用pytorch中的nn.NLLLoss()作为损失函数。将学习率设置为0.03,使用 StepLR设置每1000步下降 5%;图像是二维的,每个方向有 28 个像素。 pytorch中的.view方法可将这些像素变换成一个维度,然后将数据传递给神经网络的第一层。

四、训练模型

代码的大多数计算都在 GPU 上进行。整个训练迭代了 100 次。 在每次迭代中,首先执行训练,然后计算损失,进行反馈操作,再调用优化器,调整学习率并计算全局损失。 测试数据集的全局准确率在 35 次迭代后达到 89%,并且在随后的 65 次迭代中进展缓慢。 最后三次准确率如下。

Accuracy RATE is: 89.163%.
Accuracy RATE is: 89.303%.
Accuracy RATE is: 89.203%.
Accuracy RATE is: 89.243%.

五、模型评估

使用测试数据集对模型进行评估,评估结果表明该模型的全局准确率达到了89.173%。

Fm9AB8P_LBilkRQF4Hcm2lE0925S

六、当前工作进度

本文尝试使用自定义网络,查阅官方文档,知道AI8X是支持自定义网络的,详见链接。

https://github.com/MaximIntegratedAI/ai8x-synthesis/blob/master/README.md#adding-new-network-models-and-new-datasets-to-the-training-process

参考模型示例,看到使用了AI8X的二维卷积神经网络。

class NewModel(nn.Module):
    def __init__(self, num_classes=10, num_channels=3, dimensions=(64, 64), bias=False, **kwargs):
        super().__init__()
        self.conv1 = ai8x.FusedConv2dReLU(..., bias=bias, **kwargs)
        ...

    def forward(self, x):
        ...
        
def newmodel(pretrained=False, **kwargs):
    ...
    return NewModel(**kwargs)

示例调用了一个模块FusedConv2dReLU,实际上是一种可以直接使用的网络结构,那么是否还支持其他结构呢?查阅文档,发现确实还支持很多其他的结构,其中也包括Linear。

https://github.com/MaximIntegratedAI/ai8x-synthesis/blob/master/README.md#list-of-predefined-modules

FusedConv2dReLU Conv2d, followed by ReLU
... ...
Linear Linear
... ...

Linear是什么?本文衣物识别采用将二维图像展开成一维数组的处理方式,使用的就是Linear,很简单的网络结构,再回顾一下。

class Classifier_fashion(nn.Module):
  def __init__(self,ni,no):
    super().__init__()
    self.liner1 = nn.Linear(ni,512)
    ...
 
  def forward(self,x):
    x = x.view(x.shape[0],-1)
    x = F.relu(self.liner1(x))
    ...
    x = F.log_softmax(self.liner5(x),dim=1)

因此推断AI8X可以支持上文自定义的神经网络模型,即使不使用看起来较复杂的卷积神经网络也可以识别图片。当前正尝试将自定义的神经网络适配到AI8X工具中。这样数据集不用调整,后期直接可以导出目标代码。

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