pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法

<>

 扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务

小白学PyTorch | 14 tensorboardX可视化教程

小白学PyTorch | 13 EfficientNet详解及PyTorch实现

小白学PyTorch | 12 SENet详解及PyTorch实现

小白学PyTorch | 11 MobileNet详解及PyTorch实现

小白学PyTorch | 10 pytorch常见运算详解

小白学PyTorch | 9 tensor数据结构与存储结构

小白学PyTorch | 8 实战之MNIST小试牛刀

小白学PyTorch | 7 最新版本torchvision.transforms常用API翻译与讲解

小白学PyTorch | 6 模型的构建访问遍历存储(附代码)

小白学PyTorch | 5 torchvision预训练模型与数据集全览

小白学PyTorch | 4 构建模型三要素与权重初始化

小白学PyTorch | 3 浅谈Dataset和Dataloader

小白学PyTorch | 2 浅谈训练集验证集和测试集

小白学PyTorch | 1 搭建一个超简单的网络

小白学PyTorch | 动态图与静态图的浅显理解

参考目录:

  • 1 PIL读取图片

  • 2 TF读取图片

  • 3 TF构建数据集

本文的代码已经上传,在作者公众号后台回复【PyTorch】获取。

1 PIL读取图片

想要把一个图片,转换成RGB3通道的一个张量,我们怎么做呢?大家第一反应应该是PIL这个库

from PIL import Image
import numpy as np
image = Image.open('./bug1.jpg')
image.show()

展示的图片:05c7d7b86180bcbb5c7450dc8b3b6da8.png

然后我们这个image现在是PIL格式的,我们使用numpy.array()来将其转换成numpy的张量的形式:

image = np.array(image)
print(image.shape)
>>>(326, 312, 3)

可以看到,这个第三维度是3。对于pytorch而言,数据的第一维度应该是样本数量,第二维度是通道数,第三四是图像的宽高,因此PIL读入的图片,往往需要把通道数的这个维度移动到第二维度上才能对接上pytorch的形式。(transpose方法来实现这个功能,这里不细说)

2 TF读取图片

下面是重点啦,对于tensorflow,tf中自己带了一个解码函数,先看一下我的文件目录:34cba0e08077aa0d1ed31fbdee619cb6.png

import tensorflow as tf
images = tf.io.gfile.glob('./*.jpeg')
print(images,type(images))
> ['.\\bug1.jpeg', '.\\bug2.jpeg'] <class 'list'>

可以看出来:

  • 这个tensorflow.io.gfile.glob()是读取路径下的所有符合条件的文件,并且把路径做成一个list返回;
  • 这个功能也可以用glob库函数实现,我记得是glob.glob()方法;
  • 这里的bug1和bug2其实是同一张图片,都是上面的那个小兔子。
image = tf.io.read_file('./bug1.jpeg')
image = tf.image.decode_jpeg(image,channels=3)
print(image.shape,type(image))
> (326, 312, 3) <class 'tensorflow.python.framework.ops.EagerTensor'>

需要注意的是:

  • tf.io.read_file()这个得到的返回值是二进制格式,所以需要下面的tf.image.decode_jpeg进行一个解码;
  • decode_jpeg的第一个参数就是读取的二进制文件,然后channels是输出的图片的通道数,3就是RPB三个通道,如果是1的话,就是灰度图片,ratio是图片大小的一个缩小比例,默认是1,可以是2和4,一会看一下ratio=2的情况;
  • 这个image的type是一个tensorflow特别的Tensor的形式,而不是pytorch的那种tensor的形式了。
image = tf.io.read_file('./bug1.jpeg')
image = tf.image.decode_jpeg(image,channels=1,ratio=2)
print(image.shape,type(image))
> (163, 156, 1) <class 'tensorflow.python.framework.ops.EagerTensor'>

宽高都变成了原来的一半,然后通道数是1,都和预想的一样。使用decode_jpeg等解码函数得到的结果,是uint8的类型的,简单地说就是整数,0到255范围的。在对图片进行操作的时候,我们需要将其标准化到0到1区间的,因此需要将其转换成float32类型的。所以对上述代码进行补充:

image = tf.io.read_file('./bug1.jpeg')
image = tf.image.decode_jpeg(image,channels=1,ratio=2)
print(image.shape,type(image))
image = tf.image.resize(image,[256,256]) # 统一图片大小
image = tf.cast(image,tf.float32) # 转换类型
image = image/255 # 归一化
print(image)

从结果来看,数据类型已经改变:68acfdfad56f7f95e5482e400cd8b7b1.png

3 TF构建数据集

下面是dataset更正式的写法,关于TF2的问题,不要百度!百度到的都是TF1的解答,看的我晕死了,TF的API的结构真是不太友好。。。

def read_image(path):
    image = tf.io.read_file(path)
    image = tf.image.decode_jpeg(image, channels=3, ratio=1)
    image = tf.image.resize(image, [256, 256])  # 统一图片大小
    image = tf.cast(image, tf.float32)  # 转换类型
    image = image / 255  # 归一化
    return image
images = tf.io.gfile.glob('./*.jpeg')
dataset = tf.data.Dataset.from_tensor_slices(images)
AUTOTUNE = tf.data.experimental.AUTOTUNE
dataset = dataset.map(read_image,num_parallel_calls=AUTOTUNE)
dataset = dataset.shuffle(1).batch(1)
for a in dataset.take(2):
    print(a.shape)

代码中需要注意的是:

  • glob获取一个文件的list,本次就两个文件名字,一个bug1.jpeg,一个bug2.jpeg;
  • tf.data.Dataset.from_tensor_slices()返回的就是一个tensorflow的dataset类型,可以简单理解为一个可迭代的list,并且有很多其他方法;
  • dataset.map就是用实现定义好的函数,对处理dataset中每一个元素,在上面代码中是把路径的字符串变成该路径读取的图片张量,对图片的预处理应该也在这部分进行吧;
  • dataset.shuffle就是乱序,.batch()就是把dataset中的元素组装batch;
  • 在获取dataset中的元素的时候,TF1中有什么迭代器的定义啊,什么iter,但是TF2不用这些,直接.take(num)就行了,这个num就是从dataset中取出来的batch的数量,也就是循环的次数吧。
  • AUTOTUNE = tf.data.experimental.AUTOTUNE 就是根据你的cpu的情况,自动判断多线程的数量。上面代码的输出结果为:74f5d4ab210385bd2b291a443e4a13e8.png
- END -01aebb8bde0c4ef14f51eb4a9c48d8d9.png

往期精彩回顾

适合初学者入门人工智能的路线及资料下载

机器学习及深度学习笔记等资料打印

机器学习在线手册

深度学习笔记专辑

《统计学习方法》的代码复现专辑

AI基础下载

机器学习的数学基础专辑

获取一折本站知识星球优惠券,复制链接直接打开:

https://t.zsxq.com/662nyZF

本站qq群704220115。

加入微信群请扫码进群(如果是博士或者准备读博士请说明):

e85f5bda503f303b4e5a2c949723a44f.png

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

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

相关文章

【WebRTC---入门篇】(十七)实现1V1音视频实时互动直播系统

STUN/TURN服务器搭建 详细搭建过程 RTCPeerConnection

junit5和junit4_JUnit 5 –架构

junit5和junit4现在我们知道如何设置JUnit 5并使用它编写一些测试 &#xff0c;下面让我们看一下。 在本文中&#xff0c;我们将讨论JUnit 5架构以及采用这种方式的原因。 总览 这篇文章是有关JUnit 5的系列文章的一部分&#xff1a; 建立 基本 建筑 条件 注射 … JUni…

华为配备鸿蒙系统的手机,华为P50/新平板双双来袭!全球首发鸿蒙系统:配置都非常强悍...

【12月12日讯】相信大家都知道&#xff0c;华为方面已经正式官宣&#xff0c;将会在12月16日正式推出鸿蒙系统首个手机Bate版本&#xff0c;但也有很多网友们担忧&#xff0c;华为手机在脱离了Android系统以后&#xff0c;鸿蒙OS系统是否真的可以击败Android系统&#xff0c;第…

【WebRTC---入门篇】(十八)WebRTC非音视频数据传输

WebRTC传输非音视频重要API createDataChannel options ordered 在传输非音视频的时候是否是按序到达的。 maxPacketLifeTime/maxRetransmits 最大包存活时间;最大传输次数。两者二选一 negotiated ID 唯一标识 DataChannel事件

datatable使用_使用Streamlit从简单的Python脚本创建交互式WebApp

如果有人告诉您可以使用150-200行代码创建交互式Web应用程序&#xff0c;该怎么办&#xff1f; 有趣的权利。 Streamlit为您提供了使用简单的python脚本和一些streamlit调用来创建漂亮的Web应用程序的相同机会。Streamlit是一个开放源代码框架&#xff0c;用于以最快的方式创建…

opengl如何画出一个球_OpenGL-Controlling and Monitoring the Pipeline

全球图形学领域教育的领先者、自研引擎的倡导者、底层技术研究领域的技术公开者&#xff0c;东汉书院在致力于使得更多人群具备内核级竞争力的道路上&#xff0c;将带给小伙伴们更多的公开技术教学和视频&#xff0c;感谢一路以来有你的支持。我们正在用实际行动来帮助小伙伴们…

【WebRTC---入门篇】(二十)WebRTC核心之SDP详解

SDK规范 会话层 媒体层 SDP规范相关参考 WebRTC中的SDP

junit5和junit4_JUnit 5 –条件

junit5和junit4最近&#xff0c;我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧&#xff01; 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列…

python opencv输出mp4_10分钟学会使用YOLO及Opencv实现目标检测

点击边框调出视频工具条 计算机视觉领域中&#xff0c;目标检测一直是工业应用上比较热门且成熟的应用领域&#xff0c;比如人脸识别、行人检测等&#xff0c;国内的旷视科技、商汤科技等公司在该领域占据行业领先地位。相对于图像分类任务而言&#xff0c;目标检测会更加复杂一…

捍卫者usb管理控制系统_捍卫Java

捍卫者usb管理控制系统因此&#xff0c;我们不时发布了一本电子书&#xff0c;名为“十大Java性能问题” 。 毫无例外&#xff0c;一些人回答了一些“问题是您正在使用Java”。 显然&#xff0c;Java一直在受到批评&#xff0c;人们已经预测了它的消亡已有一段时间了。 当然&a…

html怎么上传qq空间,qq空间怎么上传照片

当我们想要把照片上传到qq空间里&#xff0c;应该怎么办呢?下面就让学习啦小编告诉你空间上传照片的方法&#xff0c;希望对大家有所帮助。空间上传照片的方法打开QQ主界面&#xff0c;在主界面头像的右则有个小星星&#xff0c;那就是进入空间的快捷方式&#xff0c;点一下小…

android gridview控件使用详解_Android开发实现自定义日历、日期选择控件

点击上方蓝字关注 ??来源&#xff1a; wenzhihao123https://www.jianshu.com/p/a2f102c728ce前言最近项目需要日历效果&#xff0c;考虑用第三方的反而不太适合设计需求&#xff0c;修改复杂&#xff0c;与其这样不入自己重新写一个干净的控件。虽不是什么牛逼控件&#xff0…

HTML设置字体颜色1008无标题,如何在HTML中设置字体颜色,你知道这几种方式吗?...

color设置字体颜色在color设置字体颜色之前&#xff0c;我们首先了解color在css中有几种取值方式&#xff0c;一共有4种方式&#xff0c;若有不全还请在评论区告知谢谢&#xff0c;4种方式如下&#xff1a;十六进制、十进制、 英文单词、十六进制的缩写。现在让我们进入字体颜色…

gram矩阵_Skip-gram

Skip-gram标签(空格分隔)&#xff1a;NLP一. skip-gram和cbow的对比 skip-gram与cbow相比&#xff0c;好处在于对于不常用的词&#xff0c;skip-gram的效果要更好&#xff1b;举个简单的例子&#xff0c;一个句子w1w2w3w4&#xff0c;window_size1&#xff1b;对于cbow&#xf…

C++ 11 深度学习(十五)多线程

线程创建 方式一:调用函数 #include<thread>void CreateThread() {int a100;cout<<"This is Thread: "<<a<<endl; }int main() {thread Threadone(CreateThread);//join是一种阻塞的方式&#xff0c;需要子线程处理完毕之后&#xff0c;…

计算机的好处和坏处的英语作文,电脑的利弊英语作文

电脑的利弊英语作文在学习、工作或生活中&#xff0c;大家都写过作文吧&#xff0c;通过作文可以把我们那些零零散散的思想&#xff0c;聚集在一块。那么你有了解过作文吗&#xff1f;下面是小编为大家整理的电脑的利弊英语作文&#xff0c;希望能够帮助到大家。Computer is in…

servlet容器_SpringBoot是否内置了Servlet容器?

SpringBoot是否内置了Servlet容器&#xff1f;SpringBoot内置了Servlet容器&#xff0c;这样项目的发布、部署就不需要额外的Servlet容器&#xff0c;直接启动jar包即可。SpringBoot官方文档上有一个小章节内置servlet容器支持用于说明内置Servlet的相关问题。在SpringBoot源码…

计算机专业开学要带电脑吗,大学上课要带电脑吗

大学刚开学&#xff0c;上课的时候学生们要不要带电脑呢&#xff0c;想必这个问题一直对还没进入大学的准大学生来说很困扰&#xff0c;下面是小编整理的详细内容&#xff0c;一起来看看吧&#xff01;大学上课要带电脑吗大学上课能否带电脑需要看老师的要求。大学课程书本知识…

突然讨厌做前端,讨厌代码_不要讨厌HATEOAS

突然讨厌做前端,讨厌代码或我如何学会不再担心和爱HATEOAS REST已成为实现Web服务的事实上的解决方案&#xff0c;至少已成为一种流行的解决方案。 这是可以理解的&#xff0c;因为REST在使用HTTP规范时提供了一定程度的自我文档。 它经久耐用&#xff0c;可扩展&#xff0c;并…