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

news2024/10/7 12:24:42

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仿真......希望能帮到你!

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

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

相关文章

【全开源】餐饮点餐小程序源码(ThinkPHP+FastAdmin+Uniapp)

🍽️餐饮点餐小程序:让美食触手可及 一款基于ThinkPHPFastAdminUniapp开发的点餐小程序,支持单人点餐,还满足多人协同点餐(高级授权),支持多门店管理,并提供先吃后付和先付后吃两种支付方式。​ &#x1…

桌面应用开发框架比较:Electron、Flutter、Tauri、React Native 与 Qt

在当今快速发展的技术环境中,对跨平台桌面应用程序的需求正在不断激增。 开发人员面临着选择正确框架之挑战,以便可以高效构建可在 Windows、macOS 和 Linux 上无缝运行的应用程序。 在本文中,我们将比较五种流行的桌面应用程序开发框架&…

C#开源项目推荐:Watt Toolkit跨平台游戏工具箱支持github网络加速

Watt Toolkit是一个开源跨平台的多功能游戏工具箱,主要专注于增强玩家在Steam平台上的游戏体验及国外网站平台加速。 主要功能 兼容性 用户数据 团队背景 github加速功能 使用方法:用户只需在Watt Toolkit中启用网络加速功能,并选择对Gi…

揭秘Netflix背后的魔法:如何用三层架构打造个性化推荐帝国

推荐系统就像一家餐厅的菜单推荐 想象一下,你走进一家餐厅,面对琳琅满目的菜单,不知道点什么好。这时候,服务员给你推荐了几道菜,这些推荐是基于你以往的口味偏好和其他顾客的选择。Netflix的推荐系统也是类似的&…

Matlab图像处理——细胞图像的分割和计数显示

一. 项目介绍 使用MATLAB编写的细胞图像分割及计数系统,实现了对图像内细胞的计数,以及对每个细胞周长和面积的测量,并分别展示了分割后的每个细胞的图像。实验步骤共分为图像预处理、图像预分割、空洞填充、黏连细胞分割、细胞个数统计、细胞…

计算机毕业设计师hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

流程: 1.Python爬虫采集中华健康网约10万医生数据,最终存入mysql数据库; 2.使用pandasnumpy/hadoopmapreduce对mysql中的医生数据进行数据分析,使用高德地图解析地理位置,并将结果转入.csv文件同时上传到hdfs文件系统&…

易天全面搭建ERP和MES系统:推进数字化转型的战略布局

在数字化浪潮的推动下,企业对于提高生产效率、优化资源配置、降低运营成本的需求日益迫切。ERP管理软件像一条纽带,将采购、生产、成本、库存、分销、运输、财务、人力资源进行规划,从而达到最佳资源组合,取得最佳效益。早在2019年…

MyBatis进行模糊查询时SQL语句拼接引起的异常问题

项目场景: CRM项目,本文遇到的问题是在实现根据页面表单中输入条件,在数据库中分页模糊查询数据,并在页面分页显示的功能时,出现的“诡异”bug。 开发环境如下: 操作系统:Windows11 Java&#…

vite构建的ts项目配置src别名@

一、安装types/node npm install types/node 二、vite.config.ts 文件中配置以下内容 resolve: {alias: {: path.resolve(__dirname, ./src),},}, 三、 tsconfig.json 文件中compilerOptions下配置以下内容 /* 配置 */"baseUrl": ".","paths":…

创新共享经济:探索Web3对新商业模式的启迪

随着Web3时代的到来,我们正在见证着一场数字经济的革命。在这个革命中,区块链技术作为一种基础设施,正为创新的共享经济模式提供新的契机。本文将深入探讨Web3对新商业模式的启迪,以及如何借助区块链技术构建更加开放、公平、高效…

8.使用包、crate和模块

目录 一、简单概念二、crate和包2.1 crate规则2.2 包规则2.3 Cargo的遵循的一些约定2.4 控制模块的作用域和私有性1) 模块2)引用模块树中的项3)使用 super 起始的相对路径4) 公有结构体和枚举 三、use关键字的使用四、分割模块进入不同的文件 一、简单概…

Vue27-内置指令04:v-once指令

一、需求 二、v-once指令 获取初始值: 三、小结

HCIA6以太网基础基于MAC划分VLAN

(简写的命令可以敲Tab按键补全剩余) 1.组网需求 场景:公司的网络中,管理者将同一部门的员工划分到VLAN10。要求只有本部门员工的PC接入才能互访,其他PC接入交换机属于其他VLAN(666)。可以配置…

STM32自己从零开始实操05:接口电路原理图

一、TTL 转 USB 驱动电路设计 1.1指路 延续使用芯片 CH340E 。 实物图 原理图与封装图 1.2数据手册重要信息提炼 1.2.1概述 CH340 是一个 USB 总线的转接芯片,实现 USB 与串口之间的相互转化。 1.2.2特点 支持常用的 MODEM 联络信号 RTS(请求发送&…

python实战根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现

今天客户需要 根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现 数据样例:记录.xlsx 解决代码: 1、安装必要的库: pip install pandas openpyxl2、编写Python脚本: im…

基于springboot实现高校专业实习管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现高校专业实习管理系统的设计演示 摘要 随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开始的群众不信任,到现在的离不开,中间经历了很多挫折。本次开发的高校专业实…

RabbitMQ配置与交换机学习

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

OpenCV学习(4.11) OpenCV中的图像转换

1. 目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换利用Numpy中可用的FFT功能傅立叶变换的一些应用我们将看到以下函数:**cv.dft()** ,**cv.idft()** 等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用…

elementPlus 图标不显示 属性模式不显示

问题&#xff1a; elementPlus 属性模式图标不显示 <el-input placeholder"请输入用户名" :suffix-icon"Avatar"> //这个图标不显示 之前在main.ts里全局引入了icons-vue。这里的script里也没引入。 解决&#xff1a; 在当前的script中重新引入a…

MS721仪表总线(M-Bus)从站收发电路

MS721 是为 M-Bus 标准 (EN1434-3) 的应用而开发的单片收发 电路。 MS721 接口电路可以适应从站与主站之间的电压差&#xff0c;总 线的连接没有极性要求&#xff0c;电路由主站通过总线供电&#xff0c;这样从站 电池就不会增加额外的负载&#xff0c;同时还集成电源失效功…