【GD32F427开发板试用】基于移植BP神经网络辨认花的种类

news2024/12/25 9:39:05

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:卢瑟

前言

很荣幸参与这次GD32的开发板试用活动(白嫖活动),由于在家条件比较有限,就移植了之前做过的项目。利用神经网络去分辨花的种类,当然啊,这是非视觉信号,而是纯数据信号,简单点就是可以通过ADC采集多个数据,丢入模型进行预测/分类。

最终效果演示

串口软件用的是VOFA+ (真的超级好用!)

用于分类的数据测试集,第三个输出为1,说明类别为3

训练步骤

第一步 准备训练集

本文使用的数据集为花的一些属性已经类别,利用excel表格简单处理一下

第一个表格页是未处理的数据,并利用excel的一些语句对花的种类进行量化,比如山鸢尾定义为种类1 变色鸢尾定义为种类2 维吉尼亚鸢尾 定义为种类3

第二个表格页是用于测试模型的测试集

第三个表格页则是用于训练的集合,最后一列是

第二步 生成输入

显然,excel表格是无法丢入我移植的神经网络模型中的,我自己写了一个转换脚本,分析excel数据并生成c语言的头文件作为训练的输入

转换python脚本

#-*- coding:utf-8 -*-

import xlwt
import xlrd
import os
from time import sleep
import copy

program_file_head = "#ifndef INPUT_H\n#define INPUT_H\n"
program_file_end = "\n#endif"
program_str = "\nint input_neu = {0}; \nint example_num = {1};\nfloat date[{1}][{0}] = "
write_program_str = copy.deepcopy(program_file_head)

date_dilm = 0
example_num = 0
train_date_book_index = 2
test_date_book_index = 1

output_input_file = "input.h"   #输出输入神经网络的变量文件
output_test_file = "input_cls_date.h" #输出测试数据的文件

def date_handle_from_excel():
    wb = xlrd.open_workbook(filename='date.xlsx')
    sheet_date = wb.sheet_by_index(train_date_book_index)

    rows = sheet_date.row_values(0)     #获取数据维度
    cols = sheet_date.col_values(0)     #获取样本数量

    date_dilm = len(rows)     #最后一个是样本空间
    example_num = len(cols)     #训练样本数

    write_program_str = '#ifndef __INPUT_H\n#define __INPUT_H'
    write_program_str += program_str.format(date_dilm-1,example_num)
    write_program_str += '{'

    temp_pie = 1

    for i in range(example_num):
        rows = sheet_date.row_values(i)
        for date in range(date_dilm-1):
            if temp_pie:
                write_program_str += str(rows[date])
                temp_pie = 0
            else:
                write_program_str += ',' + str(rows[date])
        write_program_str += '\n'

    write_program_str += '};\n'

    write_program_str += 'float label[%d] = {'%example_num

    for i in range(example_num):
        rows = sheet_date.row_values(i)
        if not (i % 5):
            write_program_str += "\n"

        if not i:
            write_program_str += str(rows[date_dilm-1])
        else:
            write_program_str += "," + str(rows[date_dilm-1])

    write_program_str += "};\n"

    write_program_str += program_file_end

    print('Now writing output file...')

    with open(output_input_file, 'w') as f:
        f.write(write_program_str)
        f.close()

    print('Write finish...')

    print('Now load input cls date')
    temp_pie = 1

    del sheet_date
    sheet_date = wb.sheet_by_index(test_date_book_index)
    write_program_str = "#ifndef INPUT_CLS_DATE_H\n#define INPUT_CLS_DATE_H\n"

    test_date = sheet_date.row_values(0)
    test_date_example = sheet_date.col_values(0)

    test_date_dim = len(test_date)
    test_date_example_num = len(test_date_example)

    if not (test_date_dim == (date_dilm-1)):
        print('Dims of test date do not equal dims of train date')
        return -1

    write_program_str += 'int date_num = %d; \n'%(test_date_example_num)
    write_program_str += 'float cls_input_date[%d][%d] = {\n'%(test_date_example_num,test_date_dim)

    for i in range(test_date_example_num):
        for j in sheet_date.row_values(i):
            if temp_pie:
                write_program_str += str(j)
                temp_pie = 0
            else:
                write_program_str += ',' + str(j)
        write_program_str += '\n'

    temp_pie = 1

    write_program_str += '};\n'
    write_program_str += program_file_end


    with open(output_test_file, 'w') as f:
        f.write(write_program_str)

        f.close()



if __name__ == '__main__':
    print('Date loading...')
    date_handle_from_excel()
    print('Date load successfully!')

运行成功后会提示

并生成两个头文件

将这两个头文件复制到模型训练代码项目中

复制完后利用gcc运行命令
gcc main.c neuron.c layer.c input.h input_cls_date.h backprop.h -o main.exe
生成.exe文件,Linux可直接生成main运行

运行main文件,然后会提示你输入要有多少层神经网络,并提示输入每一层的神经元数

这里我输入的是3层神经网络,第一层会程序自动输入为数据的维度,第二层则是7个神经元,最后一层输出是3个神经元
训练结束后,会提示输入一些数据集用于分类/预测

第三步 移植模型

训练完后会输出文件MODEL.h

MODEL.h是有点小bug的,需要改成图下这个样子

然后将MODEL.h、input.h和input_cls_date.h(单词小错误,不要在意这些细节…)移植到文件夹nn_model里

(如果你想测试一下模型是不是能用的,也可以在这里运行命令,然后运行nn-mcu.exe,测试的数据集在input_cls_date.h里面)
gcc .\backprop.h .\input.h .\input_cls_date.h .\layer.c .\MODEL.h .\nn_model_run.c .\neuron.c .\nn-mcu.c -o .\nn-mcu.exe

再将名字为nn_model文件夹里面的除了nn-mcu.c(nn-mcu.c文件里是如何跑模型的示例代码)文件全部移植到项目工程里,我在项目工程里创建了一个nn文件夹

项目工作区展示

GD32的代码main.c

#include "gd32f4xx.h"
#include "gd32f427r_start.h"
#include "systick.h"
#include "usart.h"
#include <stdio.h>
#include "nn_model_run.h"


void run_nn();
void load_model(void);
void forward_prop(void);


/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* configure systick */
    systick_config();
    
        usart_gpio_init();
        usart_init();
        load_model();
        run_nn();

    while(1) {
        

        delay_1ms(1000);
    }
}

usart.h

#ifndef __USART_H
#define __USART_H

#include "gd32f4xx.h"
#include "gd32f427r_start.h"
#include "systick.h"
#include <stdio.h>

void usart_gpio_init(void);
void usart_init(void);
void UARTx_SendChr(uint32_t usart_periph,int *pSda);

#endif

usart.c文件代码

#include "usart.h"



void usart_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    
    gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_2);
    gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_2);
    gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);
    
}
void usart_init(void)
{
    rcu_periph_clock_enable(RCU_USART1);
    
    usart_deinit(USART1);
    usart_baudrate_set(USART1, 115200);
    usart_word_length_set(USART1, USART_WL_8BIT);
    usart_stop_bit_set(USART1, USART_STB_1BIT);
    usart_parity_config(USART1, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
    usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
    usart_interrupt_enable(USART1, USART_INT_RBNE);
    usart_interrupt_enable(USART1, USART_INT_ERR);
    usart_enable(USART1);
}

int fputc(int ch, FILE *f){      
        UARTx_SendChr(USART1,&ch);
    return ch;
}



void UARTx_SendChr(uint32_t usart_periph,int *pSda)
{
     while(RESET == usart_flag_get(usart_periph, USART_FLAG_TBE));
      usart_data_transmit(usart_periph, *pSda);        
     while(RESET == usart_flag_get(usart_periph, USART_FLAG_TC));
}

我在usart里面重定向了fputc,使得printf可以工作
然后编译,利用串口转USB模块就可以看到输出了

注意事项

1.神经元个数不宜太多,太多GD32存储就炸了!程序就会出bug
2.本项目的神经网络本人是从github找的一个,并自己进行改造了一下

本文的实验文件

链接:https://pan.baidu.com/s/1jFk61ioLtviSOSrdJy6Org
提取码:93sf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/185576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java开发常用软件整理】

该博客整理了一些JAVA程序员常用的软件开发类软件、系统类软件&#xff0c;可以作为JAVA程序员配置Java开发基础环境的参考手册。 目录开发类软件Java8 安装IntelliJ IDEA 安装Maven 安装Git 安装MYSQL 安装系统类软件开发类软件 开发软件安装包下载地址&#xff1a;开发软件安…

ASP.NET Core Web应用程序项目部署流程

目录 一、准备ASP.NET Core应用程序部署文件 二、环境配置 三、测试 ASP.NET Core Web 应用程序 四、部署后访问失败问题 以下部署流程都是基于Windows服务器环境下进行的。 一、准备ASP.NET Core应用程序部署文件 使用 Visual Studio 开发工具创建 ASP.NET Core 的Web应…

盘点最近线程池的几个面试重要考点

有点惊叹最近的面试题&#xff0c;因为从之前的基础的面试题&#xff0c;到之后的一些涉及到分布式和微服务的面试题&#xff0c;再到现在的线程池的一些面试题&#xff0c;反正不同的面试官&#xff0c;就有不同的针对方向&#xff0c;可能现在的面试官比较想考验你的多方面的…

Hive(2):Apache Hive 安装部署

1 元数据相关名词 1.1 Metadata Metadata即元数据。元数据包含用Hive创建的database、table、表的位置、类型、属性&#xff0c;字段顺序类型等元信息。元数据存储在关系型数据库中。如hive内置的Derby、或者第三方如MySQL等。 1.2 Metastore Metastore即元数据服务。Metast…

Python中tqdm进度条的详细介绍(安装程序与耗时的迭代)

平时在做一些测试时候&#xff0c;是没有进度条出现的&#xff0c;这跟大家pip安装程序不一样(有安装进度条)&#xff0c;比如做遍历的时候&#xff1a;for i in range(10):time.sleep(0.5)print(i)只是每过0.5秒就进行打印输出&#xff0c;在这个等待过程是没有任何提示的&…

SAP ADM100-2.1 SAP系统启停过程

一、SAP系统开启过程 在SAP系统使用过程中维护硬件和修改SAP系统配置文件后重启SAP系统是有必要的。开启SAP系统是每个SAP系统管理员应该熟悉的初始过程。 每个SAP系统包含一个数据库和至少一个实例,JAVA栈SAP系统还有一个CS中央服务实例,ABAP栈SAP系统含有一个ABAP CS中央服…

springboot2.5集成log4j2报错

报错信息&#xff1a; SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 修改依赖 把依…

【01Studio MaixPy AI K210】22.ESP8266与服务器连接的问题及处理

目录 前提 问题 处理 前提 WiFi的账号密码输入正确 ESP8266的主题与服务器的主题一致 代码的服务器网址正确 ESP8266正确连接核心板的引脚 ESP8266返回“OK” simple.py文件以发送到开发板 WiFi已打开 问题 1.连接上WiFi&#xff0c;已输出IP信息&#xff0c;但是仍然…

48.Isaac教程--GMapping应用程序

GMapping应用程序 GMapping 是一个使用 OpenSlam 软件库的地图生成工具。 该应用程序允许您创建地图以在其他应用程序中使用。 GMapping 应用程序使用 Carter 参考机器人的 LIDAR 功能。 注意 建图是一项计算密集型和存储密集型活动&#xff0c;可能需要微调才能生成合适的…

Hive(1):Apache Hive入门

1 Apache Hive概述 1.1 什么是Hive Apache Hive是一款建立在Hadoop之上的开源数据仓库系统&#xff0c;可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为Hive查询语言&#xff08;HQL&a…

记OPNsense防火墙的安装过程 - 安全

前些天在网上看到防火墙软件OPNsense&#xff0c;对其有了兴趣&#xff0c;以前写过一个其前面的一个软件M0n0wall( 关于m0n0wall的安装及配置 )&#xff0c;当时也是非常有名的防火墙&#xff0c;现在有了OPNsense&#xff0c;这个老防火墙已经停止更新了。 下面对OPNsense防火…

MFC如何实现屏幕截图

目录一 程序实现效果二 程序实现思路三 具体实现一 程序实现效果 本文描述了MFC中实现屏幕截图的一种方式&#xff0c;程序界面如下&#xff1a; 单击【开始截屏】&#xff0c;按住鼠标左键&#xff0c;一直拖动到需要截屏的矩形的右下角&#xff0c;松开鼠标左键&#xff0c…

工业设备数据采集调研要点

一、概述 当一家客户提出需要采集设备的数据&#xff0c;通常需要对设备、通讯、采集方案进行确认。此时我们需要做两件事&#xff1a; 1、向客户要设备清单&#xff0c;便于确认设备的数量。&#xff08;客户提供&#xff09; 2、确认设备信息、通讯接口信息、采集方案。&a…

图文详解 Java 泛型,写得太好了!

一、泛型的引入我们都知道&#xff0c;继承是面向对象的三大特性之一&#xff0c;比如在我们向集合中添加元素的过程中add()方法里填入的是Object类&#xff0c;而Object又是所有类的父类&#xff0c;这就产生了一个问题——添加的类型无法做到统一 由此就可能产生在遍历集合取…

OpenShift 4 - 在单节点 OpenShift 上部署 ODF 存储软件

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift Local 环境中验证 文章目录什么是 ODF LVM &#xff1f;为 OpenShift Local 增加额外存储设备安装并配置 ODF LVM Operator使用 ODF 创建 PVC/PV 验证什么是 ODF LVM &…

Mock的接口自动化测试如何测?

1.Mock实现原理和实现机制 在某些时候&#xff0c;后端在开发接口的时候&#xff0c;处理逻辑非常复杂&#xff0c;在测试的时候&#xff0c;后端在未完成接口的情况下该如何去测试呢&#xff1f; 我们需要测试&#xff0c;但是有些请求又需要修改一下参数&#xff0c;或者改…

寻找适合程序员的笔记软件

做为一个程序员,有两个东西是我们必需的.一个是搜索,另一个则是记录. 当我们遇到不会或解决不了的困难点时,我们会第一时间使用搜索(如Google)来寻找解决方案,而当我们积累与在技术上有任何心得时,我们会记录它. 因而,寻找一个合适的笔记软件,对程序员非常重要. 一) 程序员…

Apache Spark 机器学习 特征转换 1

分词器&#xff08;Tokenizer&#xff09; 分词是一个处理过程&#xff0c;其将文本句子分割成一系列独立的单词词汇集合&#xff0c;Spark提供Tokenizer分词器类&#xff0c;其提供的功能是使用分隔符的方式处理文本句子的特征转换&#xff0c;Spark提供RegexTokenizer分词器…

在PC上安装OpenSSL,生成证书

文章目录一.在编程 PC 上安装 OpenSSL1. 下载安装 OpenSSL2.生成CA认证3. 生成 Broker 证书4. 生成各个 Client 的证书一.在编程 PC 上安装 OpenSSL 为了使用带 TLS 安全证书的 ADS Over MQTT&#xff0c;在 MQTT 的 Server 和 Client 侧都需要证书以进行安全通信&#xff0c;…

安装vue-cli2和3以及创建vue2和vue3项目的步骤及区别

文章目录安装vue-cli2版本步骤1.下载vue-cli2问题1&#xff1a;安装Vue Cli出现EEXIST: file already exists, cmd shim ‘C:\Users\2.vue-cli2构建vue项目问题2&#xff1a;报错&#xff1a; vue-cli Failed to download repo vuejs-templates/webpack: connect ETIMEDOUT 19…