pytorch读取数据集(LiTS-肝肿瘤分割挑战数据集)pytorch 读取数据集
我的数据集长这样:
xx.png和xx_mask.png是对应的待分割图像和ground truth
读取数据集
数据集对象被抽象为Datat类,实现⾃定义的数据集需要继承Datat
getitem:返回⼀条数据,或⼀个样本。obj[index]等价于obj.__ getitem __(index)
len:返回样本的数量。len(obj)等价于obj.__ len__()
files = os.listdir(dirpath)打开⽂件夹
img.append([imgPath,maskPath])⽣成⼀个list包含img和label的路径
img_x = Image.open(xPath,‘r’)读取图⽚
img_x = lf.transforms(img_x)做数据集变形操作
class MyDatat(Datat):最荒凉的地方打一成语
def__init__(lf,dirpath,transforms =None,target_transforms =None):
files = os.listdir(dirpath)
len_files =len(files)//2
img =[]
for i in range(len_files):
imgPath = os.path.join(dirpath,"%03d.png"%i)
maskPath = os.path.join(dirpath,"%03d_mask.png"%i)
img.append([imgPath,maskPath])
lf.imgs = img
#lf.imgs 是⼀个list,lf.imgs的⼀个元素是⼀个元组,包含图⽚路径,图⽚标签路径
lf.tatget_transforms = target_transforms
#这个transform⾥边可以实现减均值,除标准差,随机裁剪,旋转,翻转,放射变换,等等操作def__getitem__(lf, index):
xPath,yPath = lf.imgs[index]
img_x = Image.open(xPath,'r')
img_y = Image.open(yPath,'r')
#Image.open读取图⽚信息
ansforms is not None:
img_x = lf.transforms(img_x)
if lf.tatget_transforms is not None:
img_y = lf.tatget_transforms(img_y)
return img_x,img_y
def__len__(lf):
return len(lf.imgs)
a = MyDatat(".\\data\\train")
n = np.array(a[1][0])
print(n.shape)
结果如下所⽰:
计算数据集的均值和⽅差
(图⽚均为512*512)
class MyDatat(Datat):
def__init__(lf,dirpath,transforms =None,target_transforms =None):
files = os.listdir(dirpath)
len_files =len(files)//2
img =[]
for i in range(len_files):
imgPath = os.path.join(dirpath,"%03d.png"%i)
maskPath = os.path.join(dirpath,"%03d_mask.png"%i)
img.append([imgPath,maskPath])
lf.imgs = img
#lf.imgs 是⼀个list,lf.imgs的⼀个元素是⼀个元组,包含图⽚路径,图⽚标签路径
你在做什么英语怎么说lf.tatget_transforms = target_transforms
#这个transform⾥边可以实现减均值,除标准差,随机裁剪,旋转,翻转,放射变换,等等操作
def__getitem__(lf, index):
xPath,yPath = lf.imgs[index]
img_x = Image.open(xPath,'r')
img_y = Image.open(yPath,'r')
#Image.open读取图⽚信息
ansforms is not None:
img_x = lf.transforms(img_x)
if lf.tatget_transforms is not None:
img_y = lf.tatget_transforms(img_y)
return img_x,img_y
def__len__(lf):
return len(lf.imgs)
a = MyDatat(".\\data\\train")
def meanX(a):
R_channel_mean =0
G_channel_mean =0
B_channel_mean =0
R_channel_var =0
G_channel_var =0
B_channel_var =0
虾皮煎蛋
for i in range(len(a)):
n = np.array(a[i][0])
R_channel_mean = R_channel_mean + np.sum(n[:,:,0])
G_channel_mean = G_channel_mean + np.sum(n[:,:,1])
B_channel_mean = B_channel_mean + np.sum(n[:,:,2])
for i in range(len(a)):
n = np.array(a[i][0])
R_channel_var += np.sum((n[:,:,0]- R_channel_mean)**2)
G_channel_var += np.sum((n[:,:,0]- G_channel_mean)**2)
B_channel_var += np.sum((n[:,:,0]- B_channel_mean)**2)
R_channel_mean = R_channel_mean /512/512/len(a)
G_channel_mean = G_channel_mean /512/512/len(a)
B_channel_mean = B_channel_mean /512/512/len(a)
R_channel_var = np.sqrt(R_channel_var)/512/512/len(a)
G_channel_var = np.sqrt(G_channel_var)/512/512/len(a)
B_channel_var = np.sqrt(B_channel_var)/512/512/len(a)
#图⽚是512*512的
return R_channel_mean,G_channel_mean,B_channel_mean,R_channel_var,G_channel_var,B_channel_var
R,G,B,RV,GV,BV = meanX(a)
print(R,G,B,RV,GV,BV)
中途岛战役结果如下所⽰:
灰度图三通道均⼀致
训练数据集
import os
as nn
from PIL import Image
import torch
ansforms as transforms
from torch.utils.data import DataLoader
import argpar
from torch.utils.data import Datat
import numpy as np
class MyDatat(Datat):
def__init__(lf, root ,transform , target_transform): dir= os.listdir(root)
lendir =len(dir)//2
imgpath =[]
for i in range(lendir):
imgs = os.path.join(root,"%03d.png"%i)
mask = os.path.join(root,"%03d_mask.png"%i) imgpath.append([imgs,mask])
lf.imgpath = imgpath
lf.target_transform = target_transform
def__getitem__(lf, item):
imgs,masks = lf.imgpath[item]
肌酐偏高的原因img = Image.open(imgs,'r')
mask = Image.open(masks,'r')
img = lf.transform(img)
mask = lf.target_transform(mask)
return img,mask
def__len__(lf):
return len(lf.imgpath)
class DoubleConv(nn.Module):
def__init__(lf,num_in,num_out):
super(DoubleConv,lf).__init__()
nn.Conv2d(num_in,num_out,3,1,1),
nn.BatchNorm2d(num_out),
nn.ReLU(inplace=True),
nn.Conv2d(num_out,num_out,3,1,1),
nn.BatchNorm2d(num_out),
艾菊nn.ReLU(inplace=True),
)
def forward(lf,x):
v(x)
class Unet(nn.Module):
class Unet(nn.Module):
def__init__(lf,num_in,num_out):
super(Unet,lf).__init__()
lf.pool1 = nn.MaxPool2d(2,2)
lf.pool2 = nn.MaxPool2d(2,2)
lf.pool3 = nn.MaxPool2d(2,2)
lf.pool4 = nn.MaxPool2d(2,2)
lf.up6 = nn.ConvTranspo2d(1024,512,2,2)
lf.up7 = nn.ConvTranspo2d(512,256,2,2)
lf.up8 = nn.ConvTranspo2d(256,128,2,2)
lf.up9 = nn.ConvTranspo2d(128,64,2,2)
lf.sigmoid = nn.Sigmoid()
def forward(lf,x):
c1 = lf.conv1(x)
p1 = lf.pool1(c1)
c2 = lf.conv2(p1)
p2 = lf.pool2(c2)
c3 = lf.conv3(p2)
p3 = lf.pool3(c3)
c4 = lf.conv4(p3)
p4 = lf.pool4(c4)
学习委员c5 = lf.conv5(p4)
u6 = lf.up6(c5)
merge6 = torch.cat([c4, u6], dim=1)
c6 = lf.conv6(merge6)
u7 = lf.up7(c6)
merge7 = torch.cat([u7, c3], dim=1)
c7 = lf.conv7(merge7)
u8 = lf.up8(c7)
merge8 = torch.cat([u8, c2], dim=1)
c8 = lf.conv8(merge8)
u9 = lf.up9(c8)
merge9 = torch.cat([u9, c1], dim=1)
c9 = lf.conv9(merge9)
c10 = lf.conv10(c9)
out = lf.sigmoid(c10)
return out
path ="/content/drive/My Drive/Pytorch_try/unet/train"
path_test ="/content/drive/My Drive/Pytorch_try/unet/val"
x_transform = transforms.Compo([
transforms.ToTensor(),
transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])
]
)
y_transform = transforms.ToTensor()
#y_transform = transforms.ToTensor
device = torch.device("cuda"if torch.cuda.is_available()el"cpu")
孜然寸骨def train():
model = Unet(3,1).to(device)
optimizer = torch.optim.Adam(model.parameters(),lr=args.learning_rate) datat = MyDatat(path,x_transform,y_transform)
cretersion = nn.BCELoss()