d2l | 目标检测数据集:RuntimeError: No such operator image::read_file

news2024/12/24 8:16:10

目录

    • 1 存在的问题
    • 2 可能的解决方案
    • 3 最终的解决方案
      • 3.1 方案一(我已弃用)
      • 3.2 方案二(基于方案一)
      • 3.3 方案三(基于方案一)


1 存在的问题

李沐老师提供的读取香蕉数据集的函数如下:

def read_data_bananas(is_train=True):
    """读取香蕉检测数据集中的图像和标签"""
    data_dir = d2l.download_extract('banana-detection')
    csv_fname = os.path.join(data_dir,
                             'bananas_train' if is_train else 'bananas_val',
                             'label.csv')
    csv_data = pd.read_csv(csv_fname)
    csv_data = csv_data.set_index('img_name')
    images, targets = [], []
    for img_name, target in csv_data.iterrows():
        images.append(torchvision.io.read_image(
            os.path.join(data_dir, 'bananas_train' if is_train
                         else 'bananas_val', 'images', f'{img_name}'))
        targets.append(list(target))
    return images, torch.tensor(targets).unsqueeze(1) / 256

执行到如下代码时报错:

images.append(torchvision.io.read_image(
            os.path.join(data_dir, 'bananas_train' if is_train
                         else 'bananas_val', 'images', f'{img_name}'))

报错内容为:

RuntimeError: No such operator image::read_file


2 可能的解决方案

  • 博客一:报错 RuntimeError: No such operator image::read_file
  • 它认为是文件路径中 /\\ 的问题,可惜我全部改为反斜杠后并未解决问题
  • 博客二:解决 RuntimeError: No such operator image::read_file
  • 它认为是 torchvision 版本的问题,可是重装 torchvision 又会需要重装 torch 等包
  • 这是因为 torch 等包的版本要和 torchvision 的版本对应,我认为代价太大


3 最终的解决方案

3.1 方案一(我已弃用)

放弃使用 torchvision.io.read_image(),换成其他函数来做:

  • 采用 Image.open() 函数读取图片(之前看小土堆的视频用过)
  • 将读取到的图片转换为 tensor(这是 torchvision.io.read_image() 函数的作用之一)

简而言之,我们换成其他代码来实现 torchvision.io.read_image() 函数的作用。



① 增加需要使用到的包:

from PIL import Image


② 增加将图片转换为 tensor 的类:

🥲 让 AI 帮我写的,我是真的写不了一点

class ToTensorNoNorm(torchvision.transforms.ToTensor):
    def __call__(self, pic):
        return torch.tensor(super().__call__(pic) * 255, dtype=torch.uint8)

Q:为什么不直接使用 torchvision.transforms.ToTensor 类的实例?
A:因为它在将图片转换为 tensor 时会进行归一化,而 torchvision.io.read_image() 函数是没有这个作用的,所以我们定义一个继承自 torchvision.transforms.ToTensor 类但不做归一化的新类。



③ 修改原函数:

def read_data_bananas(is_train=True):
    """读取香蕉检测数据集中的图像和标签"""
    data_dir = d2l.download_extract('banana-detection')
    csv_fname = os.path.join(data_dir,
                             'bananas_train' if is_train else 'bananas_val',
                             'label.csv')
    csv_data = pd.read_csv(csv_fname)
    # 将 img_name 列设置为索引列
    csv_data = csv_data.set_index('img_name')
    images, targets = [], []
    for img_name, target in csv_data.iterrows():
   	    # 修改部分(三行代码)
        image = Image.open(os.path.join(data_dir, 'bananas_train' if is_train
                                        else 'bananas_val', 'images', f'{img_name}'))
        transform = ToTensorNoNorm()
        images.append(transform(image))
        targets.append(list(target))
    return images, torch.tensor(targets).unsqueeze(1) / 256


🥳 代码运行成功:

在这里插入图片描述



3.2 方案二(基于方案一)

方案二还是基于方案一的思路,但是不再需要自定义将图片转换为 tensor 的类了,因为我发现李沐老师在后面的代码中做了归一化:

imgs = (batch[0][0:10].permute(0, 2, 3, 1)) / 255

也就是说,torchvision.transforms.ToTensor 类的归一化不再变得鸡肋。



① 增加需要使用到的包:

from PIL import Image


② 修改原函数:

def read_data_bananas(is_train=True):
    """读取香蕉检测数据集中的图像和标签"""
    data_dir = d2l.download_extract('banana-detection')
    csv_fname = os.path.join(data_dir,
                             'bananas_train' if is_train else 'bananas_val',
                             'label.csv')
    csv_data = pd.read_csv(csv_fname)
    # 将 img_name 列设置为索引列
    csv_data = csv_data.set_index('img_name')
    images, targets = [], []
    for img_name, target in csv_data.iterrows():
   	    # 修改部分(三行代码)
        image = Image.open(os.path.join(data_dir, 'bananas_train' if is_train
                                        else 'bananas_val', 'images', f'{img_name}'))
        transform = torchvision.transforms.ToTensor()
        images.append(transform(image))
        targets.append(list(target))
    return images, torch.tensor(targets).unsqueeze(1) / 256


③ 去除后面代码中的归一化:

imgs = (batch[0][0:10].permute(0, 2, 3, 1))

简而言之,torchvision.transforms.ToTensor 类会对图片做归一化,后面就不需要再做了。



🥳 代码运行成功:

在这里插入图片描述



3.3 方案三(基于方案一)

第二天想到的方法

李沐老师的语义分割代码又使用到了 torchvision.io.read_image 函数,我不想每次都要定义一个将图片转换为 tensor 同时又不做归一化的类。

torchvision.io.read_image 函数其实可以被替换为如下代码,以实现相同的效果:

transform = torchvision.transforms.ToTensor()  # 实例化 ToTensor 类
image = Image.open(image_dir)  # 读取图片
image = (transform(image) * 255).to(torch.uint8)  # 转 tensor 但不归一化

注意:图片归一化后的数值是 float 型的小数,即使乘了 255 还是 float 型,需要转换为 integer 型。否则报错 “Clipping input data to the valid range for imshow with RGB data ([0…1] for floats or [0…255] for integers)”,也就是说,针对 RGB 数据,要么是 [0, 1] 之间的 float 型,要么是 [0, 255] 之间的 integer 型。

替换到语义分割一节的代码上:

transform = torchvision.transforms.ToTensor()
image = Image.open(os.path.join(voc_dir, 'JPEGImages', f'{fname}.jpg'))
label = Image.open(os.path.join(voc_dir, 'SegmentationClass' ,f'{fname}.png')).convert('RGB')
features.append((transform(image) * 255).to(torch.uint8))
labels.append((transform(label) * 255).to(torch.uint8))


🥳 代码运行成功:

在这里插入图片描述



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

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

相关文章

Ubuntu系统设置bond双网卡

这里我的服务器是Ubuntu 22.04.3 LTS,是高阶版本,设置网卡需要通过netplan 根据你的Ubuntu版本(如使用Netplan或/etc/network/interfaces),选择相应的配置方法。 我这边以root用户登录进服务器,就不需要普通用户每次在命令前添加sudo 1.通常/etc/netplan下配置文件名形…

IDEA开发SpringBoot项目基础入门教程。包括Spring Boot简介、IDEA创建相关工程及工程结构介绍、书写配置文件、Bean对象管理等内容

文章目录 0. 关于本文1. 概述1.1 Spring简介1.2 Spring Boot简介1.3 传统的开发方式1.3.1 简述1.3.2 缺点 1.4 Spring Boot的优点 2. 创建一个简单的Spring Boot应用程序2.1 在IDEA创建项目2.2 pom配置文件内容2.3 启动类2.4 创建Controller 3. 从Maven工程创建Spring Boot工程…

数据结构~二叉搜索树

文章目录 一、二叉搜索树的概念二、二叉搜索树的结构二叉搜索树的性能分析二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除 三、二叉搜索树key和key/value使用场景四、二叉搜索树的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

jmeter-请求参数加密-MD5加密

方法1 :使用jmeter自带的函数助手digest Tool(工具)---Function Helper Dialog(函数助手对话框) 第一个参数是要md5加密的值,第二个参数是保存加密后值的变量 ( 此处变量是从txt文件导入的,所以使用的是${wd} ) …

excel统计分析(1):列联表分析与卡方检验

列联表:用于展示两个或多个分类变量之间频数关系的表格。——常用于描述性分析卡方检验:通过实际频数和期望频数(零假设为真情况下的频数),反映了观察频数与期望频数之间的差异程度,来评估两个变量是否独立…

Metasploit渗透测试之服务端漏洞利用

简介 在之前的文章中,我们学习了目标的IP地址,端口,服务,操作系统等信息的收集。信息收集过程中最大的收获是服务器或系统的操作系统信息。这些信息对后续的渗透目标机器非常有用,因为我们可以快速查找系统上运行的服…

System Timer (STM)

文章目录 1. 介绍2. 功能特性3. 应用场景4. 功能介绍4.1 TIME0 ~TIME6计数器精度与定时范围4.2 比较器工作原理4.3 中断处理 5. Ifx Demo5.1 STM_Interrupt_1_KIT_TC277_TFT5.2 STM_System_Time_1_KIT_TC275_LK5.3 SMU_Reset_Alarm_1_KIT_TC275_LK 1. 介绍 Ifx TC37x拥有3个自…

前端大模型入门:使用Transformers.js实现纯网页版RAG(一)

我将使用两篇文章的篇幅,教大家如何实现一个在网页中运行的RAG系统。本文将其前一半功能:深度搜索。 通过这篇文章,你可以了解如何在网页中利用模型实现文本相似度计算、问答匹配功能,所有的推理都在浏览器端本地执行,…

C语言-IO

一,阻塞IO与非阻塞IO 简介: IO的本质是基于操作系统接口来控制底层的硬件之间数据传输,并且在操作系统中实现了多种不同的 IO 方式(模型),比较常见的有下列三种 阻塞型IO模型 非阻塞型IO模型 多路复用IO模型 在 C 语言中&#…

牛客SQL练习详解 02:条件查询

牛客SQL练习详解 02:条件查询 1、基础排序sql36 查找后排序sql37 查找后多列排序sql38 查找后降序排列 2、基础操作符sql6 查找学校时北大的学生信息sql7 查找年龄大于24岁的用户信息sql8 查找某个年龄段的用户信息sql9 查找chuchu 3、高级操作符sql11 高级操作符练…

认知杂谈91《菜鸟的自我修炼:减少过度干预》

内容摘要:          在投资和生活中,动作过多往往因情绪波动和缺乏计划而引发亏损。历史上的安史之乱和现代投资中的频繁交易都是例证。要管理情绪,首先要认识自己的情绪模式,然后改变消极的思考方式,并通过合…

『USB3.0Cypress』QT基于cyusb_linux_1.0.5开发上位机

文章目录 1.CyUSB Suite2.搭建开发环境3.Cyusb的应用4.疑问解决5.传送门1.CyUSB Suite CyUSB Suite for Linux是一个围绕现有开源用户空间USB库libusb的wrapper。CyUSB套件通过围绕libusb的简化包装器以及在下载固件后提供用于测试外围设备的基础设施,让您快速入门。换句话说…

1.6 物理层

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言1 物理层的基本概念1.1 定义1.2 作用1.3 物理层的主要任务 2 数据通信的基础知识2.1 常用术语2.2 信号2.3 码元2.4 信道2.5 数据通信系统模型 3 信道的极限容量3.1 基本术…

LabVIEW提高开发效率技巧----合理管理程序架构

在LabVIEW开发中,合理管理程序架构是保持项目可维护性和扩展性的关键。随着项目复杂度的增加,良好的架构设计可以避免代码混乱,并且便于后期的修改和扩展。以下是两种常见且有效的架构管理方式: 1. 面向对象编程(OOP&a…

Sony IMX334LQR-C 1/1.8寸 8.42 M像素

索尼IMX334LQR宽动态超星光级交通监测CMOS 封装:LGA 对⾓线:8.86 mm(类型1/1.8) 索尼IMX334LQR宽动态超星光级交通监测CMOS的参数及规格书资料: IMX334LQR-C是⼀个对⾓线8.86 mm(类型1/1.8)的…

安科瑞Acrel-1000DP分布式光伏监控系统在鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目中的应用

安科瑞 华楠 摘 要:分布式光伏发电就是将太阳能光伏板分散布置在各个区域,通过小规模、模块化的方式实现电能的并网或独立使用,这种发电方式具有就近发电、就近并网、就近转换、就近使用的特点。近年来,技术进步和政策支持推动了光…

8086介绍

内部结构 执行部件EU(Execution Unit) 包含运算器、通用寄存器组、EU控制单元。 只负责控制,不和外部总线打交道 总线接口部件BIU(Bus Interface Unit) 包含指令队列缓冲器、16位指令指针寄存器IP、16位段寄存器&am…

TypeScript入门 (五)异步编程与前后端交互

引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文旨在全面介绍 TypeScript 中的异步编程与网络请求,帮助读者深入理解 TypeScript 中的 asyn…

Colorful/七彩虹将星X17 XS 22 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能,自动重建COLORFUL RECOVERY功能,恢复到新机开箱状态。 【格式】:iso 【系统类型】:Windows11 原厂系统下载网址:http://www.bioxt.cn 注意:安装系统会…

Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)

Redis 数据类型及其应用场景 Redis 是什么? Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库,基于Key/Value结构存储数据,通常用来 缓解高并发场景下对某一资源的频繁请求 ,减轻数据库的压力。它支持多种数据类型,如字符串、…