当前位置: 首页 > news >正文

项目介绍:图像分类项目的最小可用骨架--代码细节讲解

讲解代码如下:

'''创建数据集的类'''
import torch
from torch.utils.data import Dataset,DataLoader     #用于处理数据集的
import numpy as np
from PIL import Image       #
from torchvision import transforms      #对数据进行处理工具  转换data_transforms = {     #字典'train':transforms.Compose([        #  对图片做预处理的。组合,transforms.Resize([256,256]),   #数据进行改变大小[256,256]transforms.ToTensor(),          #数据转换为tensor,默认把通道维度放在前面]),'valid':transforms.Compose([transforms.Resize([256,256]),transforms.ToTensor(),]),
}#数组增强,
#Dataset是用来处理数据的。   包含1张图片的数据(tensor),包含标签结果,并且能通过索引得到数据
class food_dataset(Dataset):       #   food_dataset是自己创建的类名称,可以改为你需要的名称def __init__(self, file_path,transform=None): #类的初始化,解析数据文件txtself.file_path = file_pathself.imgs = []#存储图片的路径self.labels = []#存储图片的标签结果self.transform = transformwith open(self.file_path) as f:#是把train.txt文件中图片的路径保存在 self.imgs,train.txt文件中标签保存在 self.labelssamples = [x.strip().split(' ') for x in f.readlines()]for img_path, label in samples:self.imgs.append(img_path)  #图像的路径self.labels.append(label)   #标签,还不是tensor
#初始化:把图片目录加载到self,def __len__(self):  #类实例化对象后,可以使用len函数测量对象的个数   ls=[12,3,4,4]  len(training_data)return len(self.imgs)#training_data[1]def __getitem__(self, idx): #关键,可通过索引的形式获取每一个图片数据及标签image = Image.open(self.imgs[idx])   #读取到图片数据,还不是tensor,BGRif self.transform:                   #将pil图像数据转换为tensorimage = self.transform(image)    #图像处理为256*256,转换为tenorlabel = self.labels[idx]        #label还不是tensorlabel = torch.from_numpy(np.array(label,dtype = np.int64))  #label也转换为tensor,return image, label
#training_data包含了本次需要训练的全部数据集?
training_data = food_dataset(file_path = 'train.txt',transform = data_transforms['train'])  
test_data = food_dataset(file_path = 'test.txt',transform = data_transforms['valid'])#training_data需要具备索引的功能,还要确保数据是tensor
train_dataloader = DataLoader(training_data, batch_size=64,shuffle=True)#64张图片为一个包,
test_dataloader = DataLoader(test_data, batch_size=64,shuffle=True)
  • 数据索引功能的必要性

    • 在机器学习训练中,data loader需通过索引批量获取数据(如每次取64个样本)。若数据对象不具备索引功能,则无法被data loader有效管理。因此,需为数据对象添加

      __getitem__方法,使其支持索引操作。

          def __getitem__(self, idx): #关键,可通过索引的形式获取每一个图片数据及标签image = Image.open(self.imgs[idx])   #读取到图片数据,还不是tensor,BGRif self.transform:                   #将pil图像数据转换为tensorimage = self.transform(image)    #图像处理为256*256,转换为tenorlabel = self.labels[idx]        #label还不是tensorlabel = torch.from_numpy(np.array(label,dtype = np.int64))  #label也转换为tensor,return image, label
  • 图像预处理流程

    • 裁剪图片:统一将图片尺寸调整为256×256,避免因输入尺寸不一致导致全连接层维度冲突。
    • 数据转换:将图像数据转换为PyTorch的tensor格式,便于神经网络处理。
          def __getitem__(self, idx): #关键,可通过索引的形式获取每一个图片数据及标签image = Image.open(self.imgs[idx])   #读取到图片数据,还不是tensor,BGRif self.transform:                   #将pil图像数据转换为tensorimage = self.transform(image)    #图像处理为256*256,转换为tenorlabel = self.labels[idx]        #label还不是tensorlabel = torch.from_numpy(np.array(label,dtype = np.int64))  #label也转换为tensor,return image, label
      
  • Pillow库的使用场景

    • Pillow库与OpenCV类似,但功能更简单,适合基础图像操作(如裁剪、格式转换)。因其轻量高效,常用于无需复杂算法的预处理任务。
          def __init__(self, file_path,transform=None): #类的初始化,解析数据文件txtself.file_path = file_pathself.imgs = []#存储图片的路径self.labels = []#存储图片的标签结果self.transform = transformwith open(self.file_path) as f:#是把train.txt文件中图片的路径保存在 self.imgs,train.txt文件中标签保存在 self.labelssamples = [x.strip().split(' ') for x in f.readlines()]for img_path, label in samples:self.imgs.append(img_path)  #图像的路径self.labels.append(label)   #标签,还不是tensor
  • 自定义数据集类实现

    • 继承自父类DataSet,核心方法__getitem__根据索引返回预处理后的数据(tensor格式的图片及标签)。
    • 初始化阶段读取txt文件,存储图片路径和标签,为后续索引提供依据。
      #training_data包含了本次需要训练的全部数据集?
      training_data = food_dataset(file_path = 'train.txt',transform = data_transforms['train'])  #
      test_data = food_dataset(file_path = 'test.txt',transform = data_transforms['valid'])
  • 标签处理逻辑

    • 原始标签为字符串类型,需先转为NumPy数组,再转为整数类型的tensor,确保与模型输入匹配。

文章转载自:

http://GZkPqQUe.wfjrL.cn
http://UhUlLjYa.wfjrL.cn
http://4IpUi43G.wfjrL.cn
http://vlPFUOHh.wfjrL.cn
http://WvbA44HZ.wfjrL.cn
http://PcI53t3q.wfjrL.cn
http://GxPBYfr1.wfjrL.cn
http://fhqtRBXm.wfjrL.cn
http://TeBshmCt.wfjrL.cn
http://GF3XRKDE.wfjrL.cn
http://Wvx48Sq3.wfjrL.cn
http://d8pgzGXI.wfjrL.cn
http://Bpqf9XCy.wfjrL.cn
http://RDKiQt6P.wfjrL.cn
http://tK84nzGF.wfjrL.cn
http://cNnZNoiR.wfjrL.cn
http://kulAEjcb.wfjrL.cn
http://sEkwIA3E.wfjrL.cn
http://BfOdb6U2.wfjrL.cn
http://Ywk0aCek.wfjrL.cn
http://3sXG2i3w.wfjrL.cn
http://Aiy5LUe9.wfjrL.cn
http://eRPTvjt0.wfjrL.cn
http://d4Wzbx9j.wfjrL.cn
http://OfbQftsa.wfjrL.cn
http://mgcnknEq.wfjrL.cn
http://jTefHvku.wfjrL.cn
http://anlYflMk.wfjrL.cn
http://CFy4RcU0.wfjrL.cn
http://Uo614gb7.wfjrL.cn
http://www.dtcms.com/a/371689.html

相关文章:

  • 【.Net技术栈梳理】01-核心框架与运行时(CLR与GC)
  • 简述ajax、node.js、webpack、git
  • Java安全体系深度研究:技术演进与攻防实践
  • Drupal XSS漏洞复现:原理详解+环境搭建+渗透实践(CVE-2019-6341)
  • Mybatis常见问题
  • Python基础语法篇:布尔值是什么?True 和 False 的实际用途
  • FMI(Functional Mock-up Interface,功能模型接口)
  • macOS中设置环境变量的各文件及作用域
  • Python+DRVT 从外部调用 Revit:批量创建楼板
  • 课前准备--解码乳腺癌进展:单细胞基因组与转录组的联合分析
  • 机器学习中的损失函数是什么
  • P5019 [NOIP 2018 提高组] 铺设道路
  • 【 苍穹外卖 | Day2】
  • 简单的说一说前端开发语言React
  • 跨域解决方案——CORS学习了解
  • leetcode 1304. 和为零的 N 个不同整数 简单
  • LeetCode 面试经典 150 题:合并两个有序数组(双指针解法详解)
  • Nestjs框架: 基于策略的权限控制(ACL)与数据权限设计
  • Go语言实战案例-实现简易定时提醒程序
  • 如何在项目中使用 Claude 记忆库系统(二开场景指南)
  • Matlab Simulink中的一些记录
  • 在Word和WPS文字的表格中快速输入连续的星期、月、日
  • Linux 周期性用户作业计划:crontab
  • Flink TaskManager日志时间与实际时间有偏差
  • 综合案列(SQLpymysql)
  • 得物后端二面
  • v$lock TS lock id1 用于发现Oracle pdb不能关闭的sid
  • Lenovo联想YOGA Pro 16 IAH10 2025款笔记本电脑(83L0)开箱状态预装OEM原厂Win11系统
  • 硬件-电容学习DAY3——钽电容制造全解析:从粉末到精品的奥秘
  • word2vec模型案例