RT-Thread智能车目标识别系统连载教程——训练卷积神经网络模型(2)

手把手教你实现基于RT-Thread的百度语音识别(一) RT-Thread简介 RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。RT-Thread具备一个IoT OS平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT... 阅读详情

上期回顾:RT-Thread智能车目标识别系统连载教程——手写体识别模型 (1)

这里会介绍如何训练图像领域应用非常广的卷积神经网络 (Convolutional Neural Network)这一部分应当不会涉及到很多理论了,其实用 Keras 训练模型写起代码来非常简单,如果发现不太清楚代码为什么要这么写,可以看看上一部分对应的算子。


2.1 MNIST 手写体训练集

首先我们需要介绍一下训练集,毕竟在训练之前我们得先看看训练集长什么样子。

这就是手写体识别数据库的官网了:http://yann.lecun.com/exdb/mnist/,风格比较跨世纪:

这个图上就是全球各地大家用不同方法做手写体识别得到的准确率汇总,可以看到我用红圈画出来的部分,用前面介绍的 Logistic Regression (Linear Classifier) 做手写体识别效果是最差的,所以我们之后要使用的是卷积神经网络 CNN (之后我就都用 CNN 简写了)。

在网站的下面给出了训练集的二进制格式定义:

当然,这是指自己从网站下载原始训练集,从当中提取图片才需要了解的,我们使用 tensorflow 不需要自己解析数据集。

2.2 开发环境搭建


首先介绍一下机器学习的开发环境,现在主流开发环境都是 Python,但是我们也不是一个裸 Python 打开记事本就直接开始写代码了,实际上数据科学家用的最多的开发环境是 Anaconda,里面集成了 Python 和 R 开发环境。

我们从官网下载 Anaconda 安装包 https://www.anaconda.com/distribution/ 根据自己的操作系统选择就可以了,因为安装过程基本就是单纯地下一步、下一步,所以这里就不介绍了。

安装好之后,我们打开 Anaconda Prompt:

Anaconda 其实是有图形界面的,叫 Anaconda Navigator,但是这里以控制台为主,因为图形界面其实用起来反而比较麻烦,因为控制台一行命令就解决了更加快速方便。

然后我们输入:

1# 如果你是用的 CPU
2conda create -n tensorflow-cpu tensorflow
3
4# 如果你是用的 GPU (NVIDIA 显卡会自动安装显卡驱动,CUDA,cudnn,简直方便)
5conda create -n tensorflow-gpu tensorflow-gpu

这样开发环境就搭好了,我们激活一下当前的开发环境:

1# 如果你是用的 CPU
2conda activate tensorflow-cpu
3
4# 如果你是用的 GPU
5conda activate tensorflow-gpu 

这里 激活 开发环境是指,在 Anaconda 下我们可以有多个开发环境,比如如果你想对比一下 CPU 和 GPU 计算速度的差距,可以同时安装 2 个开发环境,然后根据需要切换到 CPU 开发环境,或者 GPU 开发环境,非常方便。如果不用 Anaconda 而是一个 Python 裸奔的话,要么使用 VirtualEnv,要么就只能反复安装卸载不同的开发环境了。

接下来就可以启动我们写代码的位置了:

1# 这里的软件包 anaconda 可能已经都装好了,以防万一再确认一遍
2pip install numpy scipy sklearn pandas pillow matplotlib keras onnx jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
3
4# 启动编辑器
5jupyter notebook

这样就会自动打开浏览器,看到我们的开发环境了,在这里新建一个 notebook:

可以把它重命名为 mnist-keras:

接下来就可以开始训练模型了。

2.3 Keras 训练模型

2.3.1 导入库函数

我们首先导入需要的库函数,在 In[1] 后面的方框内写入代码:

1#coding:utf-8
2from tensorflow.examples.tutorials.mnist import input_data
3
4import numpy as np
5np.set_printoptions(suppress=True)
6
7import matplotlib.pyplot as plt
8%matplotlib inline

这些代码写进去之后就是这个样子,后面我就不一一截图了。

如果你对上面 导入库 这一个注释比较感兴趣,可以在一个把光标移到到一个输入框,按下 Esc 再按下 m,这个输入框就从 代码段 变成 注释段 了,Anaconda 也是代码、注释、输出可以同时保存所以用起来体验非常好。更多的快捷键可以在菜单栏的 Help --> Keyboard Shortcuts 找到。

把光标移动到刚刚输入的代码块,按下键盘的 Shift + Enter 就自动执行了,并且会自动在下面增加一行代码输入框,导入库根据电脑的配置可能需要一些时间,耐心等待一下。

2.3.2 下载 MNIST 训练集

在代码块输入一行代码:

1mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) #MNIST数据输入

这样就会自动下载数据集了,国内可能下载速度比较慢,可以从这个地址下载MNIST数据集 然后解压到 Anaconda Prompt 启动 Jupyter Notebook 的位置就不用等它慢慢下载了,默认是 C:/Users/你的用户名/

2.3.3 看一看 MNIST 数据

我们把下载下来的数据集分成训练集和测试集,训练集用来训练模型,测试集用来检测最后模型预测的正确率:

1X_train = mnist.train.images
2y_train = mnist.train.labels
3X_test = mnist.test.images
4y_test = mnist.test.labels
5
6# 输入图像大小是 28x28 大小
7X_train = X_train.reshape([-1, 28, 28, 1])
8X_test = X_test.reshape([-1, 28, 28, 1])

如果比较好奇这是一个怎样的图片,可以看看它长什么样子,比如我们看看训练集的第一张图片

1plt.imshow(X_train[0].reshape((28, 28)), cmap='gray')

也可以看看第二张图片:

1plt.imshow(X_train[1].reshape((28, 28)), cmap='gray')

下面就正式开始建立训练模型了。

2.3.4 构建模型

同样先导入一下 Keras 库:

1# Importing the Keras libraries and packages
2# Importing the Keras libraries and packages
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.layers import Conv2D
6from keras.layers import MaxPooling2D
7from keras.layers import Dropout
8from keras.layers import Flatten

接下来就可以建模了,可以看到这里的模型和上一部分介绍的 CNN 算子是一模一样的,熟悉的 conv2d, maxpooling, dropout, flatten, dense, softmax, adam, 如果忘了它们是什么意思,随时可以切换到上一个部分回忆一下。

 1def build_classifier():
 2
 3    classifier = Sequential()
 4
 5    # 第一层 Conv2D,激活函数 Relu
 6    classifier.add(Conv2D(filters = 2, kernel_size = 3, strides = 1, padding = "SAME", activation = "relu", input_shape = (28, 28, 1)))
 7
 8    # 第二层 Maxpooling, 使用保持图像大小的 padding
 9    classifier.add(MaxPooling2D(pool_size=(2, 2),  padding='SAME'))
10
11    # 第三层 Dropout
12    classifier.add(Dropout(0.5))
13
14    # 第四层 Conv2D,激活函数 Relu
15    classifier.add(Conv2D(filters = 2, kernel_size = 3, strides = 1, padding = "SAME", activation = "relu"))
16
17    # 第五层 Maxpoling,使用保持图像大小的 padding
18    classifier.add(MaxPooling2D(pool_size=(2, 2),  padding='SAME'))
19
20    # 第六层 Dropout
21    classifier.add(Dropout(0.5))
22
23    # 第七层 Flatten
24    classifier.add(Flatten())
25
26    # 第八层 Dense
27    classifier.add(Dense(kernel_initializer="uniform", units = 4))
28
29    # 第九层 softmax 输出
30    classifier.add(Dense(kernel_initializer="uniform", units = 10, activation="softmax"))
31
32    #  使用 adam 训练
33    classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics=['accuracy'])
34
35    return classifier

这样模型就建完了。

代码真的就是一层只要一行,但是一定要知道自己的模型为什么要这么建,比如为什么 maxpooling 要放在 con2d 之后,为什么要加 dropout,最后的 softmax 到底是在干什么,可不可以不要?

我们可以看看自己建立的模型长什么样:

1classifier = build_classifier()
2classifier.summary()

可以看到确实是和上一部分的理论是一一对应的。

2.3.5 训练模型

接下来我们就可以开始训练模型了:

1from keras.callbacks import ModelCheckpoint
2checkpointer = ModelCheckpoint(filepath='minions.hdf5', verbose=1, save_best_only=True, monitor='val_loss',mode='min')
3
4history = classifier.fit(X_train, y_train, epochs = 50, batch_size = 50, validation_data=(X_test, y_test), callbacks=[checkpointer])

这个模型非常小,不过我用 CPU 训练才迭代 50 步,也差不多花了 10 分钟,所以能用 GPU 我们是坚决不用 CPU 的。

我们可以看看刚刚的训练过程:

 1def plot_history(history) :
 2    SMALL_SIZE = 20
 3    MEDIUM_SIZE = 22
 4    BIGGER_SIZE = 24
 5
 6    plt.rc('font', size=SMALL_SIZE)          # controls default text sizes
 7    plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
 8    plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
 9    plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
10    plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
11    plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
12    plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title
13
14    fig = plt.figure()
15    fig.set_size_inches(15,10)
16    plt.plot(history['loss'])
17    plt.plot(history['val_loss'])
18    plt.title('Model Loss')
19    plt.xlabel('epoch')
20    plt.ylabel('loss')
21    plt.legend(['train', 'test'],loc='upper left')
22    plt.show()

用图片显示一下训练过程:

1plot_history(history.history)

可以看到,模型在训练集和测试集的 cost function 计算出来的 loss 都在减小,很神奇的是模型在测试集上的表现竟然比训练集还要好,不过模型精度不算太高才 60% 多一点的准确率,大家可以试着优化一下,在尝试改进模型的过程中,就会加深对模型的理解,如果我在这里直接就给出一个表现非常好的模型,可能对大家帮助反而不是那么大。

2.4 保存模型为 onnx

我们可以把模型保存为原生的 Keras 模型:

1classifier.save("mnist.h5")

当然,为了在 stm32 上面加载,我们更想保存为通用机器学习模型 onnx 的格式:

1import onnx
2import keras2onnx
3
4onnx_model = keras2onnx.convert_keras(classifier, 'mnist')
5onnx.save_model(onnx_model, 'mnist.onnx')

这样在 Anaconda Prompt 默认目录下 C:/Users/你的用户名 可以看到 mnist.h5 和 mnist.onnx 两个文件,这就是训练好的模型。

这样我们模型也训练好了,也保存好了,下一步就是怎么使用训练好的模型了。

(大家可以试试把 Dropout 的概率从 0.5 改为 0.3,训练集准确度就会从 60% 提升到 80%,测试集则有 90% 以上,为什么呢?????)

2.5 参考文献(以下链接请复制至外部浏览器打开)

  • MNIST 训练集:

    http://yann.lecun.com/exdb/mnist/

  • Anaconda GPU 环境:

    https://www.anaconda.com/tensorflow-in-anaconda/

END

RT-Thread线上活动

1、【RT-Thread能力认证考试12月——RCEA】经过第一次考试的验证,RT-Thread能力认证得到了更多社区开发者和产业界的大力支持!(点此查看)如果您有晋升、求职、寻找更好机会的需要,有深入学习和掌握RT-Thread的需求,欢迎垂询/报考!

能力认证官网链接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)

立即报名

#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的STAR哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread

你可以添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群

RT-Thread


让物联网终端的开发变得简单、快速,芯片的价值得到最大化发挥。Apache2.0协议,可免费在商业产品中使用,不需要公布源码,无潜在商业风险。

长按二维码,关注我们

看这里,求赞!求转发!

点击阅读原文进入Github

使用RT-Thread Studio 和ART-Pi 实现嵌入式数字识别(mnist) 一、环境: windows 10 rt-thread studio 2.1.0 :https://pan.baidu.com/share/init?surl=jG2APe8lFpia3_fP5JKjcQ 提取码:ctkm (官网上有提供其他下载方式) 二、目录 三、第一个工程的创建 阅读详情

相关推荐

AI Agent评估:指标、策略与最佳实践

AI智能体正逐渐融入到各个领域,从日常的对话助手到复杂的工作流程自动化,其应用范围不断拓展。然而,确保这些智能体能够可靠、高效地完成任务至关重要,这就使得AI智能体评估成为了人工智能发展过程中不可或缺的一环。本文将深入探讨AI智能体评估的指标、策略以及最佳实践,为读者全面解读这一关键领域。

llm_way的博客 3498

RT-Thread智能车目标识别系统连载教程——手写体识别模型 (1)

前言这篇文档非常长所以我们会分成5篇来连载,因为机器学习并不是纯软件开发,简单地调用库函数 API,需要有一定的理论支撑,如果完全不介绍理论部分,可能就不知道为什么模型要...

FILLMOREad的博客 518

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro...

m0_46523403的博客 6416

RT-Thread智能车目标识别系统连载教程——运行卷积神经网络模型(3)

上期回顾:这一部分会介绍模型训练好之后要如何使用,也就是模型的推断过程 (Inference)3.1 Python 导入模型并运行我们先用 python 加载模型,看看用...

FILLMOREad的博客 1094

Qwen3.6-27B本地部署实战:LM Studio配置、硬件门槛与避坑指南

大语言模型本地部署是当前AI工程落地的核心能力之一,其本质是将高参数量模型(如27B级)在受限硬件环境下实现低延迟、高稳定推理。关键技术原理涵盖量化压缩(如GGUF格式与q4_k_m精度权衡)、GPU显存分配策略(KV Cache管理与Offloading机制)、以及运行时环境兼容性(CUDA驱动、llama.cpp后端版本)。该能力直接决定私有化AI应用的技术可行性与成本边界,广泛应用于企业知识库构建、代码辅助、长文档分析等对数据主权和响应确定性要求高的场景。本文聚焦Qwen3.6-27B这一典型27B模

weixin_33272631的博客 467

【附源码】Node.js毕业设计高校院级校友信息管理系统(Express)

首先,该系统可以提高高校对校友信息管理的效率和准确性。通过系统提供的查询功能,高校可以方便地获取校友的最新联系方式和动态,及时了解校友的发展情况,为校友提供更好的服务和支持。总之,开发高校院级校友信息管理系统将为高校提供一个高效、便捷的工具,有助于提升校友管理水平和服务质量,促进高校与校友之间的良好互动关系。通过使用前端技术HTML、CSS、JavaScript和Vue框架,结合后端技术Node.js和Express框架,以及MySQL数据库,可以实现对校友信息的快速录入、查询、修改和删除等操作。

佳愉毕设源码 892

2022 RT-thread培训学习和心得(一)

RTT-Thread暑期学校痛苦四日游

qq_35452794的博客 1348

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值)【含Matlab源码 4887期】

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值) 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 810

RT-Thread智能车目标识别系统连载教程——连接 ROS 小车控制(5)

上期回顾:RT-Thread智能车目标识别系统连载教程——手写体识别模型 (1)RT-Thread智能车目标识别系统连载教程——训练卷积神经网络模型(2)RT-Thread智能车目标识别...

rtthreadiotos的博客 754

教你如何阅读Autosar代码(6):常量变量定义

编译器抽象应该为常量的声明和定义定义CONST宏。编译器抽象应该定义VAR宏来声明和定义变量。memclass:常量本身的分类;memclass:变量本身的分类;vartype:变量的类型;type:常量的类型;

wdconan001的博客 958

matlab之作图设置游标的精度

matlab画出的figure游标的精度往往是固定的,这就对我们的调试和查看数据造成了不便。 那么怎么修改游标的精度呢? 首先,获取游标dcm_obj = datacursormode(gcf);然后对游标的精度进行设置:set(dcm_obj,'UpdateFcn',@NewCallback)这个NewCallback是什么东西呢?这是一个可以返回游标精度的函数,具体内容如下:function

落日之城 8957

开源|智能车目标识别系统连载教程—RT-Thread连接ROS摄像头小车控制(6)

上期回顾:RT-Thread智能车目标识别系统连载教程——手写体识别模型 (1)RT-Thread智能车目标识别系统连载教程——训练卷积神经网络模型(2)RT-Thread智能车目标识别...

rtthreadiotos的博客 1000

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

包括YOLOv5、YOLOv7、YOLOv8等模型改进 410

RT-Thread智能车目标识别系统连载教程——Darknet 训练目标检测模型(4)

上期回顾:前言这篇文档会介绍如何用 darknet 训练一个 YOLOv2 目标检测模型,看完这篇文档会发现:模型训练和预测都非常简单,最花时间的精力的往往是训练集的数据...

FILLMOREad的博客 1234

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

开源|RT-Thread 搭配 ROS 实现目标检测小车完结篇

往期回顾:引言这应当是 RT-Thread 搭配 ROS 做摄像头小车的最后一篇文档了,这篇文档会把之前的内容汇聚起来,实现一个能目标检测的小车。先总结一下之前几篇文档的...

FILLMOREad的博客 2633

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【文章回看】公众号系列文章合辑

感谢大家的关注,在这里提前祝您五一劳动节快乐~本期我们特别筛选了公众号历史推送中部分的精彩内容,欢迎大家回看!目前公众号内容包括但不限于(由于内容太多只能筛选部分系列内容,有其他需要的小...

FILLMOREad的博客 817

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

开源项目|从0到1教你搭建一个适配于智能车的目标检测系统

引言本教程连载一辆能够用 ROS 控制的带摄像头的小车,用 ROS 发布图像数据,对获取到的图像进行处理,例如目标检测。这里主要介绍如何把本教程后面的的内容汇聚起来,实现一个能目标检测的...

张巧龙的博客 552

嵌入式使用RTOS到底是不是大势所趋?

嵌入式设备网络化、功能复杂化的趋势,使越来越多的、过去可以用裸奔实现的嵌入式产品,产生了应用操作系统的需求。芯片成本的连续下降,以及cpu性能和内存资源...

Peter的专栏 1005

paddle lite 嵌入式linux_【嵌入式AI入门日记】将 AI 模型移植到 RTThread 上

本期我们分享的主题是如何将 AI 模型部署到嵌入式系统中。 嵌入式关联 AIAI落地一直是一个很红火的前景和朝阳行业。我的好奇心也比较旺盛,所以关于任何嵌入式和 AI 相关的都是想尝一尝。本系列文章将带你一步一步把 AI 模型部署在嵌入式平台,移植到 RT-Thread 操作系统上,实现你从菜鸟到起飞的第一步甚至第 n 步!开发环境:后续开发过程将基于 STM32H743ZI-Nucl...

weixin_39605296的博客 648

用树莓派3b搭建rt-thread开发环境,玩一下吧!

前言由于电子设备的普及,越来越多人拥有树莓派,不管是作为电子极客,还是作为普通普通人,很多人都会玩一下树莓派,可以学习一些c语言,也可以...

2105

rtthread-ipc之completion

这是一个较为简单的线程同步通信机制,当然截至写稿之前我也不懂,但是从代码来看,还是比较简单。 一 首先查看completion.h文件 #ifndef COMPLETION_H_ #define COMPLETION_H_ #include /** * Completion */ struct rt_completion { rt_uint32_t flag; /* suspended lis...

Kk_01110001B的博客 1582

RT-Thread之入门跑代码

本文将讲述如何在window10中跑tensorflow代码,并且编译成bin文件

如月之恒,如日之升 3798

RT-Thread 笔记整理

1.AI:从前例中学习;传统:基于经验 2.IOT(internet of things)设备(传感器将原始数据上传)->Gateway网关->cloud(运行在云上的AI引擎) 3.st.com搜AI,找工具 4. 高性能MCUs:F2/F4/H7/F7 主流MCUs:F0/G0/F1/F3/G4 超低功耗MCUs:L0/L1/L5/L4/L4+ 无线MCUs:WL/WB 5. MPU(Micro Processor Unit)微处理器 MCU(Micro

weixin_45263278的博客 3123
上一篇: RT-Thread智能车目标识别系统连载教程——手写体识别模型 (1)
下一篇: 物联网操作系统RT-Thread免费12城巡回培训开始啦
RT-Thread物联网操作系统
博客等级 码龄6年 2万+粉丝 392原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值