stm32机器学习_嵌入式机器学习系列00:STM32图像分类

4904e78592ef679323e999539a75eed1.png

16c7d6bb97a04d338c66aceec44aca2f.png

​前言

可能有的同学会有疑问,STM32 能做图像分类这么复杂的事情吗?

b57bc6a7e2a72a78512ee1b867ecec78.png

我们可以肯定的告诉你:完全可以,这就是嵌入式机器学习(EmbeddedML)技术!不要忘了MCU才是真正的“霸主”!

下面请听小编为你慢慢道来。

首先嵌入式机器学习是一个很大的话题,涉及到的技术主要有:

  • 嵌入式软硬件技术:ARM、DSP、C/C++、Linux、Android等
  • 图像处理:数字图像理论、OpenCV等
  • 机器学习理论:高数、线代、CNN、激活函数、损失函数、梯度下降等
  • 机器学习框架:TensorFlow、Caffe等
  • Python . . .

cef571418f0d033a9f8d191182f32388.png

这么多!想想都头晕,如果我们把这些都写在一片文章里那么你一定不干,我们也不干啊。所以我们决定做一个嵌入式机器学习(EmbeddedML)专栏,通过一系列的文章和视频,带你走进这个新奇的世界!

机器学习技术简介

机器学习是一种新的编程方式,一种能够让机器具有学习能力的编程方式。

我们来看看传统的编程方式与机器学习这种编程方式有何不同。

9e42e409cb05ec7327159f20c1bb73bb.png

传统的编程方式是使用规则(由程序员要编写)和数据生成结果。

00ed2d1b5ba19d7b1a3e04c9dbbc1392.png

机器学习与传统的编程方式相反,我们输入的是结果和数据,得到的是规则,这个规则是通过机器学习技术得到的,而不是由程序员编写的。

为什么要使用机器学习技术?

在某些应用场景中,使用机器学习技术的好处是显而易见的。对于计算机来说,实际生活中的很多应用场景都非常的复杂,比如分辨猫和狗,大多数时候,我们无法事先编写一套规则让计算机分辨出哪个是猫哪个是狗。此时机器学习技术的优越性就显现出来了,我们使用大量已标记的猫狗图片,去训练深度网络模型,得到一个识别猫狗的规则,计算机利用这个规则就能进行猫狗识别了。

机器学习的过程

机器学习应用一般分为两个过程:

  • 一是模型的训练,这个过程需要大量的数据和计算量,一般在计算能力很强的计算机上进行。
  • 二是使用训练所得的模型对输入进行预测,这个过程计算量相对就会小很多,可以在手机上,甚至是在MCU上进行。

自动手尝试,是了解一个新事物最好的方式。我们为你准备了一个轻松易行的实验项目,不需要开发板,只要你有一台电脑就能运行。下面开始!

在STM32上进行图像分类实验

这里仅介绍如何在STM32上运行机器学习模型,从而对输入图像的类别进行预测。至于模型的网络搭建、训练和转换将在后续文章中介绍。

项目地址:

edgeML/cifar10_image_classifier_on_stm32​github.com
dd618bb38bfec9d4090d75c556e4c6b9.png

图像分类项目简介

本项目实现了在STM32上进行图像分类的任务。使用CIFAR-10数据集,通过Caffe机器学习框架搭建和训练神经网络模型,然后将所得模型进行转换,使其能够运行在STM32上。本项目运行在Keil的模拟器中,所以无需开发板即可体验机器学习在STM32上的应用效果。

CIFAR-10数据集简介

CIFAR-10数据集由10类32x32的彩色图片组成,一共包含60000张图片,每一类包含6000图片。其中50000张图片作为训练集,10000张图片作为测试集。

有了CIFAR-10数据集我们就不用自己到处去收集照片了,可以直接开始训练模型,然后使用模型。

CIFAR-10数据集官网:

https://www.cs.toronto.edu/~kriz/cifar.html​www.cs.toronto.edu

ee12f73d5b1078f62335e4a4a420608d.png

项目的输入

9228cf0a8721ac12a9753b40645ae22f.png

输入是一幅宽32像素高32像素的彩色图像,为方便STM32实验操作,事先将图像转换为像素值数组,存放在armnnexamplescifar10_inputs.h中。

项目输出

输出是测试图像所属的类别的概率,概率值最大的就是目标图像的所属类,输出结果如下图所示:

c7a4a3990483d4e50a6928334f1f80be.png

细心的同学可能要问了,为什么这里的输出是127,而不是一个0~1之间的数?

这个跟我们使用的Softmax函数有关,一般Softmax函数的公式是这样的:

y_i = e^(x_i) / sum(e^x_j)

而在STM32上我们采用的是以2为底Softmax函数,所以其输出会有所不同。

y_i = 2^(x_i) / sum(2^x_j)

众所周知,微控制器的计算性能有限,这样做可以大大减小计算量,并且从数学上来讲梯度是一样的,我们依然能够很好地分辨出目标图像的所属类别。

调试运行

下面的视频讲解了本项目的使用方法,最后从互联网随机下载一张图片进行了测试,识别效果都非常好,点开看看吧!

2649fdd323218531a3762369dd0ad885.png
https://www.zhihu.com/video/1183438461008277504

关注边缘智能实验室,后台回复 "edgeAI",获取本文相关资源链接!

c1b6918fdff4c4e95f29698c66227e28.png

版权声明:本文为weixin_39787089原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。