Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

1. 数据集介绍

MNIST手写数字数据集:

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

MNIST 数据集一共有 7 万张图片,其中 6 万张是训练集, 1 万张是测试集。每张图片是 28× 28 的 0−9 的手写数字图片组成。每个图片是黑底白字的形式,黑底用 0 表示,白字用 0-1 之间的浮点数表示,越接近 1 ,颜色越白。

2. 数据处理

下载后解压,会生成一系列的idx1-ubyte文件,需要先进行解析转换。

训练集解析代码:

import numpy as np
import struct
from PIL import Image
import os
# 定义MNIST数据文件的路径
data_file = r'MNIST_data/train-images.idx3-ubyte'
# 定义MNIST标签文件的路径
label_file = r'MNIST_data/train-labels.idx1-ubyte'
# 定义存储图像数据的根目录
datas_root = 'data/train'
# 设置数据文件的大小为47040016字节,但实际读取时应去掉16字节的头部信息
data_file_size = 47040016
data_file_size = str(data_file_size - 16) + 'B'
# 读取数据文件的全部内容
data_buf = open(data_file, 'rb').read()
# 解析数据文件头部的magic number, 图像数量, 图像行数和列数
magic, numImages, numRows, numColumns = struct.unpack_from('>IIII', data_buf, 0)
# 解析数据文件中所有图像的数据,去掉头部信息后为47040000字节
datas = struct.unpack_from('>' + data_file_size, data_buf, struct.calcsize('>IIII'))
# 将解析后的数据转换为NumPy数组,并调整形状为(numImages, 1, numRows, numColumns)
datas = np.array(datas).astype(np.uint8).reshape(numImages, 1, numRows, numColumns)
# 设置标签文件的大小为60008字节,但实际读取时应去掉8字节的头部信息
label_file_size = 60008
label_file_size = str(label_file_size - 8) + 'B'
# 读取标签文件的全部内容
label_buf = open(label_file, 'rb').read()
# 解析标签文件头部的magic number和标签数量
magic, numLabels = struct.unpack_from('>II', label_buf, 0)
# 解析标签文件中的所有标签数据,去掉头部信息后为60000字节
labels = struct.unpack_from('>' + label_file_size, label_buf, struct.calcsize('>II'))
# 将解析后的标签数据转换为NumPy数组
labels = np.array(labels).astype(np.int64)
# 如果根目录不存在,则创建该目录
if not os.path.exists(datas_root):
    os.mkdir(datas_root)
# 为每个标签创建一个子目录
for i in range(10):
    file_name = datas_root + os.sep + str(i)
    if not os.path.exists(file_name):
        os.mkdir(file_name)
# 将每张图像保存到对应标签的子目录下,并命名为mnist_train_索引.png
for ii in range(numLabels):
    img = Image.fromarray(datas[ii, 0, 0:28, 0:28])
    label = labels[ii]
    file_name = datas_root + os.sep + str(label) + os.sep + 'mnist_train_' + str(ii) + '.png'
    img.save(file_name)

测试集解析代码:

import numpy as np
import struct
from PIL import Image
import os
# 定义MNIST数据文件的路径
data_file = r'MNIST_data/t10k-images.idx3-ubyte'
# 定义MNIST标签文件的路径
label_file = r'MNIST_data/t10k-labels.idx1-ubyte'
# 定义存储图像数据的根目录
datas_root = 'data/test'
# 设置数据文件的大小为7840016字节,但实际读取时应去掉16字节的头部信息
data_file_size = 7840016
data_file_size = str(data_file_size - 16) + 'B'
# 读取数据文件的全部内容
data_buf = open(data_file, 'rb').read()
# 解析数据文件头部的magic number, 图像数量, 图像行数和列数
magic, numImages, numRows, numColumns = struct.unpack_from(
    '>IIII', data_buf, 0)
# 解析数据文件中所有图像的数据,去掉头部信息后为7840000字节
datas = struct.unpack_from(
    '>' + data_file_size, data_buf, struct.calcsize('>IIII'))
# 将解析后的数据转换为NumPy数组,并调整形状为(numImages, 1, numRows, numColumns)
datas = np.array(datas).astype(np.uint8).reshape(
    numImages, 1, numRows, numColumns)
# 设置标签文件的大小为10008字节,但实际读取时应去掉8字节的头部信息
label_file_size = 10008
label_file_size = str(label_file_size - 8) + 'B'
# 读取标签文件的全部内容
label_buf = open(label_file, 'rb').read()
# 解析标签文件头部的magic number和标签数量
magic, numLabels = struct.unpack_from('>II', label_buf, 0)
# 解析标签文件中的所有标签数据,去掉头部信息后为10000字节
labels = struct.unpack_from(
    '>' + label_file_size, label_buf, struct.calcsize('>II'))
# 将解析后的标签数据转换为NumPy数组
labels = np.array(labels).astype(np.int64)
# 如果根目录不存在,则创建该目录
if not os.path.exists(datas_root):
    os.mkdir(datas_root)
# 为每个标签创建一个子目录
for i in range(10):
    file_name = datas_root + os.sep + str(i)
    if not os.path.exists(file_name):
        os.mkdir(file_name)
# 将每张图像保存到对应标签的子目录下,并命名为mnist_test_索引.png
for ii in range(numLabels):
    img = Image.fromarray(datas[ii, 0, 0:28, 0:28])
    label = labels[ii]
    file_name = datas_root + os.sep + str(label) + os.sep + \
                'mnist_test_' + str(ii) + '.png'
    img.save(file_name)

运行上述代码后,会在项目的data下分别生成train和test两个文件夹,每个文件下保存对应的图片:

3.构建Pytorch下的resnet152

部分示例

import torch
import torchvision.transforms as transforms
import torchvision.datasets as datasets
from torch.utils.data import DataLoader
from torchvision.models import resnet152
import torch.nn as nn
import torch.optim as optim
from tqdm import tqdm
import argparse
import warnings
warnings.filterwarnings("ignore")
​
def init_argparse():
    parser = argparse.ArgumentParser(description="手写体数字识别")
    parser.add_argument("--train_path", type=str, default='data/test', help="训练集数据路径")
    parser.add_argument("--test_path", type=str, default='data/test', help="测试集数据路径")
    parser.add_argument("--epochs", type=int, default=5, help="训练轮数")
    parser.add_argument("--batch_size", type=int, default=512, help="GPU批大小")
    parser.add_argument("--num_workers", type=int, default=4, help="CPU进程")
    parser.add_argument("--lr", type=float, default=0.001, help="学习率")
    parser.add_argument("--momentum", type=float, default=0.9, help="动量")
    parser.add_argument("--save", type=str, default='best.pt', help="权重保存名字")
    return parser

4. 结果展示

测试集混淆矩阵

5. 单张图像数字识别

完整代码及数据集获取

Python图像处理——基于Pytorch框架ResNet152特征提取的MNIST手写数字识别

最后:

小编会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端技术回顾系列 10|TS 泛型在类和接口中的应用

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供动力。 上文回顾:约束泛型(Generic Constraints) 上一篇文章我们回顾了 泛型 在 TypeScript 中的高级用法 —— 泛型…

uniapp开发微信小程序预加载分包

微信小程序分包是一种优化小程序项目结构和性能的方式。它允许开发者将小程序代码包拆分成多个子包,在用户需要时动态加载这些子包,从而减少小程序的首次加载时间和主包的体积。(总体积不得大于20M,主包(共同文件静态资…

nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。

完整报错: nest : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\nest.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkI D135170 中的 about_Execution_Policies。 问题原因: …

Ubuntu基础-vim编辑器

目录 前言: 一. 安装 二. 配置 三. 基本使用 1.使用 Vim 编辑文本文件 2.代码编辑 3.多窗口编辑 四. 总结 前言: Vim 是从 VI 发展出来的一个文本编辑器,具有代码补充、错误跳转等功能,在程序员中被广泛使用。它的设计理念是命令的组合&#xff…

Django后台忘记管理员的账号

使用命令启动项目: python manage.py runserver输入后缀/admin,进入后台管理员,如果此时忘记你先前设置的用户名与密码怎么办? 终端输入: python manage.py shell 输入以下内容,并查看返回结果&#xff…

ASM字节码插桩实现点击防抖

思路:在点击事件onclick的时候,将view的onclick在给定的时间给拦截掉。以前我们可能都是用一个util来拦截,这样在每个点击事件都得去判断,那么这里就用字节码插桩的形式来实现一下。 ASM的引入 dependencies {implementation gr…

【因果推断python】31_合成控制1

目录 一个了解无从知晓事情的超酷数学技巧 我们有时间 一个了解无从知晓事情的超酷数学技巧 当我们审视双重差分法时,我们有来自 2 个不同城市的多个客户的数据:阿雷格里港和弗洛里亚诺波利斯。数据跨越 2 个不同的时间段:在阿雷格里港进行…

关于头条项目经验面试题的总结

文章目录 前言一、论坛项目经典话术二、请你介绍一下你最近的项目吧2.1 话术1 三、你的公司的开发环境是怎么搭建的?四、登录你们是怎么做的?4.1 账号密码登录4.2 手机验证码发送4.2.1 手机验证码发送4.2.2 手机验证码登录 五、用户行为限流是怎么做的&a…

oracle 删除当前用户下所有表

荆轲刺秦王 通常呢 我们将正式环境的 oracle 数据库 导出成 dmp 文件,然后导入到测试环境或者本地环境,期间可能会出现各种问题。那么如何使错误的导入数据全部删除呢。可以这样做: 1. 本地虚拟机启动 oracle 服务 2. sqldeveloper 连接 o…

数据桥梁:无缝连接信息孤岛与分析前沿

在数字化浪潮席卷全球的今天,数据已成为推动社会进步和经济发展的重要力量。然而,在实际应用中,我们常常遇到的一个挑战是如何将分散、孤立的数据资源进行有效整合,打破“信息孤岛”,实现数据的无缝连接和高效利用。本…

【智能算法应用】基于粒子群算法的多尺度Retinex图像去雾方法

目录 1.算法原理2.粒子群算法的多尺度Retinex图像去雾方法3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法(PSO)原理及实现 多尺度Retinex算法 在Retinex算法中,雾化图像的形成可以总结为入射光和反射光的乘积: I ( x…

开源可二次开发的商城小程序源码系统源码 前后端分离 附带完整的安装包以及搭建部署教程

系统概述 本开源商城小程序源码系统是基于现代Web开发技术栈打造的一套高性能、易扩展的电商解决方案。它采用了前后端分离的设计模式,前端使用Vue.js或React等主流框架构建用户界面,后端则采用Node.js/Express、Spring Boot等技术栈处理业务逻辑与数据…

QT调用vs2019生成的c++动态库

QT调用vs2019生成的c动态库 dll库的创建方法: VS2019创建c动态链接库dll与调用方法-CSDN博客 加减法示范: 头文件 // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号编…

Linux Debian12使用podman安装xss-labs靶场环境

一、xss-labs简介 xss-labs靶场是一个专门用于学习和练习跨站脚本攻击(XSS)技术的在线平台。它提供了一系列的实验场景和演示,帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 二、安装podman环境 Linux Debian…

LVS/NAT负载均衡实操

添加规则,并做持久操作 1 添加规则 [rootlvs ~]# ipvsadm -A -t 10.36.178.183:80 -s wrr [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.201:80 -m -w 3 [rootlvs ~]# ipvsadm -a -t 10.36.178.183:80 -r 192.168.65.202:80 -m -w 1[rootlvs ~]# ipvsadm -Ln …

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

【JVM】JVisualVM的介绍、使用和GC过程

VisualVM介绍 VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几…

30 岁的程序员,要有 “归零“ 心态

大家好,我是码农先森。 古话说的 “三十而立”,正是担重之时,却大部分人在职场中都处于不上不下的尴尬境地。已经没有刚毕业时那股子冲劲,被生活和工作磨平了棱角。 在技术思想方面,似乎已经触及到了天花板&#xff…

阻容感的串联和并联

文章目录 电阻的串联电容的串联 电阻的串联 电容的串联 CC1C2/(C1C2) 串联后电容反而变小了,所以实际应用中,电容不串联(我没见过电容串联使用的) 类似于电导的分压, 电容一般是并联使用 电感一般串联使用

鸿蒙轻内核调测-内存调测-内存泄漏检测

1、基础概念 内存泄漏检测机制作为内核的可选功能,用于辅助定位动态内存泄漏问题。开启该功能,动态内存机制会自动记录申请内存时的函数调用关系(下文简称LR)。如果出现泄漏,就可以利用这些记录的信息,找到…