ZYNQ图像处理项目——线性神经网络识别mnist

news2025/7/19 6:19:58

一、线性神经网络识别mnist

线性神经网络其实也可以叫做线性分类器,其实就是没有激活函数的神经网络来对目标进行识别,像支持向量机、多元回归等都是线性的。这边我采用了线性神经网络来识别mnist数字。
我这边是看了一本讲神经网络的书籍,然后打算从线性神经网络入手,实现手写数字的识别。这本书真的讲的很通俗易懂,大家可以去看看,书名如下:
在这里插入图片描述

二、matlab训练mnist数据集

matlab的主要代码如下图所示,实现了mnist数据的读取、训练、测试和权重保存。这边不展开讲代码,matlab相关的代码我上传到资源了,大家如果想要看的就可以直接下载。

https://download.csdn.net/download/qq_40995480/87098176

clc;
% clear all;

Images = loadMNISTImages('./MNIST/t10k-images.idx3-ubyte');
Images = reshape(Images, 28, 28, []);
for i=1:10000
    Images(:,:,i) = Images(:,:,i)';
end
Images = reshape(Images, 784, 1, []);
Labels = loadMNISTLabels('./MNIST/t10k-labels.idx1-ubyte');
Labels(Labels == 0) = 10;    % 0 --> 10

rng(1);

W=1e-2*(2*rand(10,784)-1);

X = Images(:, :, 1:8000);
D = Labels(1:8000);

for epoch = 1:50
  epoch;
  [W] = MnistSoftmax(W, X, D);
end

% Test
X = Images(:, :, 8001:10000);
D = Labels(8001:10000);

acc = 0;
N   = length(D);
for k = 1:N
  x = X(:, :, k);                   % Input,           784x1
  v=W*x;
  y=softmax(v);

  [~, i] = max(y);
  if i == D(k)
    acc = acc + 1;
  end
end

%real test
number = imread('./MNIST/number9.bmp');
number=double(number)/15;
number=reshape(number,28,28);
number=number';
number=reshape(number,784,1);

v=W*number;
y=Softmax(v);

acc = acc / N;
fprintf('Accuracy is %f\n', acc);

save the W
W=W/max(max(W))*8191;
W=round(W);
save('weight.mat','W');

三、matlab实现线性神经网络

用训练好的权重系数进行书写数字识别,下面是matlab实现的代码,主要干的事情就是对图像的预处理、提取28*28的图像矩阵,之后利用权重与数据乘积来判断最大可能的数字。这部分代码大家也可以到我的资源下载。

https://download.csdn.net/download/qq_40995480/87098187

tic
clc;
clear all;

%read picture
%height and width
img_rgb=imread('./pic/number0.bmp');
h=size(img_rgb,1);
w=size(img_rgb,2);
%get rgb picture
figure(1);
subplot(121);
imshow(img_rgb);
title('rgb picture');
%get gray picture
% Relized method:myself Algorithm realized
% Y = ( R*77 + G*150 + B*29) >>8
% Cb = (-R*44 - G*84 + B*128) >>8
% Cr = ( R*128 - G*108 - B*20) >>8
img_rgb=double(img_rgb);
img_y=zeros(h,w);
img_u=zeros(h,w);
img_v=zeros(h,w);
for i = 1 : h
    for j = 1 : w
        img_y(i,j) = bitshift(( img_rgb(i,j,1)*77 + img_rgb(i,j,2)*150 + img_rgb(i,j,3)*29),-8);
        img_u(i,j) = bitshift((-img_rgb(i,j,1)*44 - img_rgb(i,j,2)*84 + img_rgb(i,j,3)*128 + 32678),-8);
        img_v(i,j) = bitshift(( img_rgb(i,j,1)*128 - img_rgb(i,j,2)*108 - img_rgb(i,j,3)*20 + 32678),-8);
    end
end
img_y = uint8(img_y); 
img_u = uint8(img_u); 
img_v = uint8(img_v); 
img_rgb = uint8(img_rgb);
subplot(122);
imshow(img_y);
title('gray picture');

%get bin picture
img_y=double(img_y);
img_thresh=zeros(h,w);
img_thresh_inverse=zeros(h,w);
THRESH_HOLD=150;
for i=1:h
   for j=1:w
       if(i>=384-56 && i<=384+55 && j>=512-56 && j<=512+55)
           if(img_y(i,j)>THRESH_HOLD)
               img_thresh(i,j)=255;
               img_thresh_inverse(i,j)=0;
           else 
               img_thresh(i,j)=0;
               img_thresh_inverse(i,j)=255;
           end
       else 
           img_thresh(i,j)=img_y(i,j);
           img_thresh_inverse(i,j)=img_y(i,j);
       end
   end
end
img_y=uint8(img_y);
img_thresh=uint8(img_thresh);
img_thresh_inverse=uint8(img_thresh_inverse);
figure(2);
subplot(121);
imshow(img_thresh);
title('bin picture');
subplot(122);
imshow(img_thresh_inverse);
title('bin inverse picture');

%open operation:corrosion and expansion
img_corrosion=zeros(h,w);
for i=1:h
   for j=1:w
       if(i>=384-56 && i<=384+55 && j>=512-56 && j<=512+55)
           a=img_thresh_inverse(i-1,j-1)&img_thresh_inverse(i-1,j)&img_thresh_inverse(i-1,j+1);
           b=img_thresh_inverse(i,j-1)&img_thresh_inverse(i,j)&img_thresh_inverse(i,j+1);
           c=img_thresh_inverse(i+1,j-1)&img_thresh_inverse(i+1,j)&img_thresh_inverse(i+1,j+1);
           if((a&b&c)==1)
               img_corrosion(i,j)=255;
           else 
               img_corrosion(i,j)=0;
           end
       else
               img_corrosion(i,j)=img_thresh_inverse(i,j);
       end
   end
end
img_corrosion=uint8(img_corrosion);
figure(3);
subplot(121);
imshow(img_corrosion);
title('corrosion picture');
img_expansion=zeros(h,w);
for i=1:h
   for j=1:w
       if(i>=384-55 && i<=384+54 && j>=512-55 && j<=512+54)
           a=img_corrosion(i-1,j-1)|img_corrosion(i-1,j)|img_corrosion(i-1,j+1);
           b=img_corrosion(i,j-1)|img_corrosion(i,j)|img_corrosion(i,j+1);
           c=img_corrosion(i+1,j-1)|img_corrosion(i+1,j)|img_corrosion(i+1,j+1);
           if((a|b|c)==1)
               img_expansion(i,j)=255;
           else 
               img_expansion(i,j)=0;
           end
       else
               img_expansion(i,j)=img_corrosion(i,j);
       end
   end
end
img_expansion=uint8(img_expansion);
subplot(122);
imshow(img_expansion);
title('expansion picture');

%get number matrix
test=imread('./pic/output_file1.bmp');
number=zeros(28,28);
for i=1:28
    for j=1:28
        number(i,j)=sum(sum(test(384-56+4*(i-1):384-56+4*i-1 , 512-56+4*(j-1):512-56+4*j-1)))/16;
    end
end
number=floor(number);
number=uint8(number);
pic=load('./pic/pic_28x28.txt');
pic=reshape(pic,28,28);
pic=pic';
pic=uint8(pic);
figure(4);
subplot(121);
imshow(number)
title('matlab number');
subplot(122);
imshow(pic)
title('vivado number');


%use softmax to recog the number
load('weight');
number=double(number);
number=number';
number=reshape(number,784,1);
v=W*number;
v=v/max(v)*10;
y=softmax(v);
n=0;
for i=1:10
   if(y(i)>=n)
       n=y(i);
       number_recog=i;
   end
   if(number_recog==10)
      number_recog=0; 
   end
end
fprintf('the probability is %f\n',n*100);
fprintf('the number is %d\n',number_recog);
toc

下面两张图是我测试的原始图像和转灰度之后的图像。
在这里插入图片描述
下图是将灰度图像对想要处理的区域(数字区域)进行二值化,之后在翻转。
在这里插入图片描述
下面这两张图分别是我用matlab和vivado仿真提取得到的28*28的数据。
在这里插入图片描述

四、ZYNQ实现线性神经网络

关于ZYNQ实现神经网络的思路其实和matlab写的代码的思路是一样的,就是将其用verilog来实现而已,下图是我将线性神经网络部署到ZYNQ上实现的具体效果,有需要工程的也可以留言,大家相互学习。在测试中发现,线性神经网络其实性能相较于卷积神经网络要差不少,下面工作会将激活函数、卷积层、池化层这些内容加进去,用ZYNQ来实现CNN。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

分析高数值孔径物镜的聚焦特性

摘要 高数值孔径的物镜广泛用于光刻、显微等方面。 因此&#xff0c;在仿真聚焦时考虑光的矢量性质是至关重要的。VirtualLab可以支持此类透镜的光线和场追迹分析。通过场追迹分析&#xff0c;可以清楚地显示出由于矢量效应引起的非对称焦点。相机探测器和电磁场探测器可以方便…

【MySQL】Spring Boot项目基于Sharding-JDBC和MySQL主从复制实现读写分离(8千字详细教程)

目录前言一、 介绍二、 主从复制1. 原理2. 克隆从机3. 克隆从机大坑4. 远程登陆5. 主机配置6. 从机配置7. 主机&#xff1a;建立账户并授权8. 从机&#xff1a;配置需要复制的主机9. 测试10. 停止主从同步三、 读写分离1. Sharding-JDBC介绍2. 一主一从3. 一主一从读写分离3.1 …

安服-windowslinux日志分析

目录 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 windows日志分析 windows事件日志 日志分析工具 Linux日志分析 rsyrslog.conf中记录了&#xff0c;这些日志文件存储的位置以及存储的内容是关于什么的日志 其中lastlog比较重要&#xff0c;记录了用户登录…

FRP之入门篇

目录 一、前言 1、概述 2、原理 3、支持功能 4、适用场景 二、环境准备 三、使用 1、安装包下载 2、服务端部署 2.1、上传安装包 2.3、启动服务端 3、客户端部署 3.1、代理服务准备 3.2、上传安装包 3.3、客户端配置 3.4、启动客户端 4、功能验证 一、前言 1、…

Redis在Windows和Linux下的安装方法(超级详细)

Redis的两种不同系统安装1. redis在Windows下的安装2. redis在Linux下的安装1. redis在Windows下的安装 下载安装包(https://github.com/MicrosoftArchive/redis/releases) 下载完后得到安装包找一个自己熟悉的路径就可以进行解压了,我放的是D盘 解压后的文件: 进入到文件夹中…

Java集合(二):Map集合与Collections工具类

目录 Map接口 Map接口的常用方法 删除方法 判断方法 查找方法 增加方法 Map常用方法&遍历操作 HashTable 字典-Dictionary,v> HashMap、HashTable和LinkedHashMap TreeMap 【2】TreeMap-存储自定义数据类型-【内部比较器】 HashMap底层源码 jdk8-源码…

央视春晚临近,主持人李思思被爆离职,知情人火速做出回应

每年的这个时候&#xff0c;中央电视台的春晚&#xff0c;都成为人们热议的话题&#xff0c;不过今年的话题却比较火爆。大众们所关注的央视春晚&#xff0c;第一是参加春晚的明星嘉宾&#xff0c;其次就是参加春晚的节目主持人。 说起央视春晚的主持人&#xff0c;最早要追溯到…

【笔试题】【day26】

文章目录第一题&#xff08;就绪队列中的进程数&#xff09;第二题&#xff08;磁盘缓冲区存在的意义&#xff09;第三题&#xff08;进程从执行态变成就绪态的原因&#xff09;第四题&#xff08;管道&#xff09;第五题&#xff08;文件打开&#xff0c;操作系统会做什么&…

python 图像处理(一阶梯度图像和角度图像)

在整个图像处理的学习过程中可以看到&#xff0c;在很多应用中图像强度的变化情况是非常重要的信息。强度的变化可以用灰度图像I&#xff08;对于彩色图像&#xff0c;通常对每个颜色通道分别计算导数&#xff09;的x和y的方向导数和进行描述。 图像的梯度向量为&#xff1a; …

[datawhale202211]跨模态神经搜索实践:前端简介 Streamlit

结论速递 VCED项目使用一个十分简单好用的 Web 应用程序框架Streamlit。 本次任务简单学习Streamlit的基本使用。并逐行阅读学习VCED项目的前端代码&#xff0c;学习数据的传递&#xff0c;中间存储方式&#xff0c;以及功能的实现。 前情回顾 环境配置Jina生态跨模态模型 …

[python]basemap后安装后hello world代码

import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.basemap import Basemap m Basemap() # 实例化一个map m.drawcoastlines() # 画海岸线 m.drawmapboundary(fill_colorwhite) m.fillcontinents(colorwhite,lake_colorwhite) # 画大洲&#x…

点云配准(四) Sparse Point Registration 算法浅析

Sparse Point Registration (SPR)是一篇2017年的点云配准算法,该算法的主要目的是对稀疏点云进行配准,并且取得了不错的成果和突破。本文一方面是对SPR配准算法模型进行了简单的原理解析以及附加代码实现,另一方面是对之前工作的总结,也算水篇博文,接下来的工作主要就是…

正统类加载器Tomcat(tomcat二探)

主流的Java Web服务器&#xff0c;如Tomcat、Jetty、WebLogic、WebSphere或其他笔者没有列举的服务器&#xff0c; 都实现了自己定义的类加载器&#xff0c;而且一般还都不止一个。因为一个功能健全的Web服务器&#xff0c;都要解决 如下的这些问题&#xff1a; 部署在同一个服…

C++设计模式之桥模式

桥模式也是设计模式中单一组件模式的一种。什么是单一组件模式呢&#xff1f; 单一组件模式&#xff1a; 在软件组件设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化而变化&#xff0c;子类急剧膨胀&#xff0c;同时充斥着重复代…

SpringBoot-Dubbo中的Customer怎么获取了注册中心的服务呢?

1.Dubbo中的Customer怎么获取了注册中心的服务呢&#xff1f; &#xff08;1&#xff09;要在pom文件中导入接口依赖 &#xff08;2&#xff09;在配置文件中指定服务中心的ip地址 &#xff08;3&#xff09;使用的dubbo自己的注解向服务中心中获取服务&#xff0c;并且将获取…

史上最简单:SpringCloud 集成 mybatis-plus(以若依微服务版本为例)

编者按&#xff1a;若依微服务版是基于Spring Boot、Spring Cloud & Alibaba的微服务的权限管理系统&#xff0c;也是笔者比较推荐的个人学习和企业实践都比较优秀的开源项目。 笔者也以此项目为例&#xff0c;介绍一下我自己是如何操作 SpringCloud 集成 mybatis-plus 的。…

API网关之Nginx作为网关的优势及实战

基于Nginx的网关的优势&#xff1a; 1 .速度更快、并发更高 单次请求或者高并发请求的环境下&#xff0c;Nginx都会比其他Web服务器响应的速度更快。一方面在正常情况下&#xff0c;单次请求会得到更快的响应&#xff0c;另一方面&#xff0c;在高峰期(如有数以万计的并发请求…

【Pytorch with fastai】第 20 章 :结语与问题

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

开启linux的网络服务, FTP、SSH和NFS服务

在使用linux中开发的时候&#xff0c;我们可以选择启用一些网络服务方便我们进行开发&#xff0c;加快开发的进度。 现在很多用linux进行开发的工程师&#xff0c;他们大多都是在windows系统上安装虚拟机&#xff0c;然后在虚拟机中安装linux系统&#xff0c;然后在里面完成项目…

Java项目——表白墙(前后端连接+数据库存储)

前端的表白墙实现代码在之前的博客中有 Message类 表白墙中的每一个表白信息都由Message对象呈现&#xff0c;其包含form——表白者&#xff0c;to——被表白者&#xff0c;message——表白信息&#xff0c;以及一系列get和set方法 public class Message {private String fr…