栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pytorch(一)10.28

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Pytorch(一)10.28

1. Dataset类代码实践

加载数据集的类代码Dataset,获取所有根路径、标签路径,获取所有数据集图片,两个数据集连接

os.path.join()路径拼接

Image.open()打开图片PIL格式

from torch.utils.data import Dataset
from PIL import Image
import os


'''
获取数据集所有路径
import os
dir_path = "dataset/train/ants"
dir_path = "demo01/dataset/train/ants"
img_path_lists = os.listdir(dir_path) 通过os获取所有列表
img_path_list[1] 打印第1个图片
 
根目录和标签目录拼接起来

root_dir = "demo01/dataset/train"
label_dir = "ants"
path = os.path.join(root_dir, label_dir)
'''
class MyData(Dataset):
    def __init__(self, root_dir, label_dir):# 获取所有标签目录 根目录和标签目录拼接起来
        self.root_dir = root_dir
        self.label_dir = label_dir
        self.path = os.path.join(self.root_dir, self.label_dir)
        self.img_path = os.listdir(self.path)

    def __getitem__(self, idx): #按索引获取所有标签文件
        img_name = self.img_path[idx]
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        img = Image.open(img_item_path) #此图片
        label = self.label_dir #标签路径
        return img, label


    # 返回数据集的长度
    def __len__(self):
        return len(self.img_path)

root_dir = "demo01/dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

'''
展示其中一个数据集
ants_dataset[0]
Out[4]: 
(,
 'ants')
img,label = ants_dataset[0]
img.show()
'''

# 两个数据集相加
# 将两个数据集进行拼接,可以解决数据集不足

train_dataset = ants_dataset + bees_dataset
'''
train_dataset = ants_dataset + bees_dataset
len(ants_dataset)
Out[23]: 124
len(bees_dataset)
Out[24]: 121
len(train_dataset)
Out[25]: 245
'''


2. Tensorboard的使用
Tensorboard的工作流程简单来说是
 1.将代码运行过程中的,某些你关心的数据保存在一个文件夹中:这一步由代码中的writer完成
 2.再读取这个文件夹中的数据,用浏览器显示出来:这一步通过在命令行运行tensorboard完成。
SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中
这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下的"log"文件中。

====================================

因为add_image只能接收tensor和numpy.array类型的数据所以,要将PIL类型的数据转换为这tensor和numpy.array类型的

用PIL Image开打图片的类型是JpegImageFile 不能用于add_image中
img =Image.open(img_path)
print(type(img))

print(img)

2.1 PILImage转 array

用numpy转为数组类型
img_array = np.array(img)
print(type(img_array))

numpy.array 转换之后是(C,H, W)类型,但是add_image默认的输入的是(C, H, W),如果是(H, W, C)这样的需要指定dataformats='HWC'

2.2 PILImage转tensor

转为tensor就是(C,H,W)不用添加dataformats

from torchvision import transforms
img_ToTensor = transforms.ToTensor()
img_tensor = img_ToTensor(img)
print(img_tensor)
print(img_tensor.shape) #torch.Size([3, 369, 500])

运行此文件后生成logs文件 打开此文件得时候由于没有安装markdown,导致运行tensorboard --logdir=事件文件所在得文件夹名,运行出错,安装markdown就可以了 tensorboard --logdir=demo01/logs

还可以设置端口号 tensorboard --logdir=demo01/logs --port 8787

打开地址就可以

====================================

from torch.utils.tensorboard import SummaryWriter
from PIL import Image
import numpy as np



'''
Tensorboard的工作流程简单来说是
 1.将代码运行过程中的,某些你关心的数据保存在一个文件夹中:这一步由代码中的writer完成
 2.再读取这个文件夹中的数据,用浏览器显示出来:这一步通过在命令行运行tensorboard完成。
 
SummaryWriter的作用就是,将数据以特定的格式存储到刚刚提到的那个文件夹中


这里传入的参数就是指向文件夹的路径,之后我们使用这个writer对象“拿出来”的任何数据都保存在这个路径之下。"log"


====================================
用PIL Image开打图片的类型是JpegImageFile
img =Image.open(img_path)
print(type(img))


用numpy转为数组类型
img_array = np.array(img)
print(type(img_array))


====================================


'''

writer = SummaryWriter("logs")
#获取图片
img_path = "dataset/train/ants_image/6240329_72c01e663e.jpg"
img = Image.open(img_path)
#将图片转为ndarray
img_array = np.array(img)

print(img_array.shape) #(512, 768, 3)
# 这样通道数排列会出错,需要加上一个dataformats='HWC'

#add_image这个函数需要一个tensor或者numpy类型数据
# 不同的图片设置不同的step就可以,如果不同图片分开显示,则给每张图片上设置不同的tag。
writer.add_image("test01",img_array, 2, dataformats='HWC')
for i in range(100):
    #writer.add_scalar(tag, scalar_value, global_step=None, walltime=None)
    writer.add_scalar("y = 3*x" , 3, i)

writer.close()



'''
运行此文件后生成logs文件
打开此文件得时候由于没有安装markdown,导致tensorboard --logdir=事件文件所在得文件夹名,运行出错,安装markdown就可以了
tensorboard --logdir=demo01/logs
还可以设置端口号
tensorboard --logdir=demo01/logs --port 8787

'''

3. Transforms的使用(一)


tranforms就是在一种设置图片的工具,将图片输入后通过tranforms工具进行设置,输出改变后的结果
========================================
PIL      Image.open()
tensor   ToTensor()
narrays  cv.imread()

from torchvision import transforms
from PIL import Image
from torch.utils.tensorboard import SummaryWriter

# python ---》tensor数据类型
# 通过totensor去看两个问题
# 1.tranforms该如何使用
# 2.为什么需要tensor的数据类型

img_path = "dataset/train/ants_image/0013035.jpg"
img = Image.open(img_path)
print(type(img))#


writer = SummaryWriter("logs")

# 1.如何使用transforms
tensor_trans = transforms.ToTensor()
img_tensor = tensor_trans(img)
print(type(img_tensor))#

writer.add_image("Tensor_Img" ,img_tensor)

writer.close()


 几种常见的transforms

ToTensor、Normalize、Resize、compose、RandomCrop

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms

'''
 关注输入和输出类型
 多看官方文档
 关注方法需要什么参数
 
 不知道返回值的时候打印即可 
'''


img_path = "../images/xw.jpg"
img = Image.open(img_path)

writer = SummaryWriter("../logs")


# 1. ToTensor
ToTensor_trans = transforms.ToTensor()
tensor_img = ToTensor_trans(img)

writer.add_image("image",tensor_img)



#2.  Normalize
# input[channel] = (input[channel] - mean[channel]) / std[channel]
print(tensor_img[0][0][0])
trans_norm = transforms.Normalize([2, 3, 1], [0.1, 0.6, 0.8])#因为是RGB三通道所以有了三个值,三个均值和三个标准差
img_norm = trans_norm(tensor_img)

writer.add_image("Normlize", img_norm, 2)
print(img_norm[0][0][0])



# 3. Resize
'''
Resize 只能传入PIL格式,返回的也是PIL格式的
    Args:
        img (PIL Image): Image to be scaled.

    Returns:
        PIL Image: Rescaled image.
        
'''


print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img) # 图片转变大小
img_resize_tensor = ToTensor_trans(img_resize)

writer.add_image("Resize",img_resize_tensor)
print(img_resize_tensor)


#4.  compose

trans_resize_2 = transforms.Resize(512)
 #compose 串联了多个图片的变换的操作
trans_compose = transforms.Compose([trans_resize, ToTensor_trans])
img_resize_2 = trans_compose(img)

writer.add_image("Resize", img_resize_2, 1)


# 5. RandomCrop
trans_random = transforms.RandomCrop(52)#这里是要随机切割的图片的尺寸,也可以指定切割的高宽(52,52),按着指定的高宽进行裁剪
trans_compose_2 = transforms.Compose([trans_random, ToTensor_trans])

for i in range(10):
    img_crop = trans_compose_2(img)
    writer.add_image("RandomCrop", img_crop, i)


writer.close()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357051.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号