一、项目简要介绍
本项目以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张图像。操作细节见下方代码。
设计一个5层神经网络,第一层的输入数量为 784*512。
代码如下。
# 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%。
六、当前工作进度
本文尝试使用自定义网络,查阅官方文档,知道AI8X是支持自定义网络的,详见链接。
参考模型示例,看到使用了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工具中。这样数据集不用调整,后期直接可以导出目标代码。