在我的torchvision库里介绍的博文(https://www.cnblogs.com/yjphhw/p/9773333.html)里说了对pytorch的dataset的定义方式。

本文相当于实现一个自定义的数据集,而这正是我们在做自己工程所需要的,我们总是用自己的数据嘛。

继承 from torch.utils.data import Dataset 类

然后实现 __len__(self) ,和 __getitem__(self,idx) 两个方法。以及数据增强也可以写入,数据增强想了想还是放到了Dataset里,

习惯上可能与常用的不同,但是觉得由于每种数据都有自己的增强方法所以,增强方法可以和数据集绑定到一起的。

接上一节我们通过切割,获取了2217个图像切片。

这就是我的FarmDataset

from torch.utils.data import Dataset, DataLoader
from PIL import Image,ImageEnhance
from osgeo import gdal
from torchvision import transforms
import glob
import torch as tc
import numpy as np class FarmDataset(Dataset):
def __init__(self,istrain=True,isaug=True):
self.istrain=istrain
self.trainxformat='./data/train/data1500/*.bmp'
self.trainyformat='./data/train/label1500/*.bmp'
self.testxformat='./data/test/*.png'
self.fns=glob.glob(self.trainxformat) if istrain else glob.glob(self.testxformat)
self.length=len(self.fns)
self.transforms=transforms
self.isaug=isaug def __len__(self):
#total length is 2217
return self.length
def __getitem__(self,idx):
if self.istrain: imgxname=self.fns[idx]
sampleimg = Image.open(imgxname)
imgyname=imgxname.replace('data1500','label1500')
targetimg = Image.open(imgyname).convert('L')
#sampleimg.save('original.bmp') #data augmentation
if self.isaug:
sampleimg,targetimg=self.imgtrans(sampleimg,targetimg) #check the result of dataautmentation
#sampleimg.save('sampletmp.bmp')
#targetimg.save('targettmp.bmp') sampleimg=transforms.ToTensor()(sampleimg)
#targetimg=transforms.ToTensor()(targetimg).squeeze(0).long()
targetimg=np.array(targetimg)
targetimg=tc.from_numpy(targetimg).long() #to tensor
#print(sampleimg.shape,targetimg.shape)
return sampleimg,targetimg
else:
return gdal.Open(self.fns[idx])
def imgtrans(self,x,y,outsize=1024):
'''input is a PIL image
image dataaugumentation
return also aPIL image。
'''
#rotate should consider y
degree=np.random.randint(360)
x=x.rotate(degree,resample=Image.NEAREST,fillcolor=0)
y=y.rotate(degree,resample=Image.NEAREST,fillcolor=0) #here should be carefull, in case of label damage #random do the input image augmentation
if np.random.random()>0.5:
#sharpness
factor=0.5+np.random.random()
enhancer=ImageEnhance.Sharpness(x)
x=enhancer.enhance(factor)
if np.random.random()>0.5:
#color augument
factor=0.5+np.random.random()
enhancer=ImageEnhance.Color(x)
x=enhancer.enhance(factor)
if np.random.random()>0.5:
#contrast augument
factor=0.5+np.random.random()
enhancer=ImageEnhance.Contrast(x)
x=enhancer.enhance(factor)
if np.random.random()>0.5:
#brightness
factor=0.5+np.random.random()
enhancer=ImageEnhance.Brightness(x)
x=enhancer.enhance(factor) #img flip
transtypes=[Image.FLIP_LEFT_RIGHT,Image.FLIP_TOP_BOTTOM,
Image.ROTATE_90,Image.ROTATE_180,Image.ROTATE_270]
transtype=transtypes[np.random.randint(len(transtypes))]
x = x.transpose(transtype)
y = y.transpose(transtype) #img resize between 0.8-1.2
w,h=x.size
factor=1+np.random.normal()/5
if factor>1.2: factor=1.2
if factor<0.8: factor=0.8
#print(factor,x.size)
x=x.resize((int(w*factor),int(h*factor)),Image.NEAREST)
y=y.resize((int(w*factor),int(h*factor)),Image.NEAREST) #random crop
w,h=x.size
stx=np.random.randint(w-outsize)
sty=np.random.randint(h-outsize)
#print((stx,sty,outsize,outsize))
x=x.crop((stx,sty,stx+outsize,sty+outsize)) #stx,sty,width,height
y=y.crop((stx,sty,stx+outsize,sty+outsize))
#print(x.size,y.size)
return x,y #return outsized pil image if __name__=='__main__':
d=FarmDataset(istrain=True)
x,y=d[2216]
print(x.shape)
print(y.shape)

  

  输入的是个1500x1500的图像,输出的是增强后的1024x1024后的图像。

  其实对于分割问题来看,以后这个就可以作为一个模板,修改修改就可以换到另一个数据集中。

放几张图片:

原始图像:

进行数据增强后可以得到的一系列:

经过check 发现没有的问题通过测试。

Pytorch dataset自定义【直播】2019 年县域农业大脑AI挑战赛---数据准备(二),Dataset定义的更多相关文章

  1. Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练

    对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...

  2. Pytorch 加载保存模型【直播】2019 年县域农业大脑AI挑战赛---(三)保存结果

    在模型训练结束,结束后,通常是一个分割模型,输入 1024x1024 输出 4x1024x1024. 一种方法就是将整个图切块,然后每张预测,但是有个不好处就是可能在边界处断续. 由于这种切块再预测很 ...

  3. Pytorch【直播】2019 年县域农业大脑AI挑战赛---初级准备(一)切图

    比赛地址:https://tianchi.aliyun.com/competition/entrance/231717/introduction 这次比赛给的图非常大5万x5万,在训练之前必须要进行数 ...

  4. XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目

    XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramew ...

  5. “全栈2019”Java第八十九章:接口中能定义内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. 2019年全国高校计算机能力挑战赛 C语言程序设计决赛

    2019年全国高校计算机能力挑战赛 C语言程序设计决赛 毕竟这个比赛是第一次举办,能理解.. 希望未来再举办时,能够再完善一下题面表述.数据范围. 话说区域赛获奖名额有点少吧.舍友花60块想混个创新创 ...

  7. 2019年全国高校计算机能力挑战赛初赛C语言解答

    http://www.ncccu.org.cn 2019年全国高校计算机能力挑战赛分设大数据算法赛,人工智能算法赛,Office高级应用赛,程序设计赛4大赛项 C语言初赛解答 1:编程1 16.现有一 ...

  8. C# 将Excel里面的数据填充到DataSet中

    /// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...

  9. [Pytorch]PyTorch Dataloader自定义数据读取

    整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...

随机推荐

  1. Spring Boot中Restful Api的异常统一处理

    我们在用Spring Boot去向前端提供Restful Api接口时,经常会遇到接口处理异常的情况,产生异常的可能原因是参数错误,空指针异常,SQL执行错误等等. 当发生这些异常时,Spring B ...

  2. ES5-bind用法及与以前的apply和call

    当我们调用一个函数的时候,函数中的this一般是指向调用者的.但是我们其实可以在调用函数的时候,传入一个对象,让函数中的this指向我们传入的对象,而不是调用者本身. apply,call,bind都 ...

  3. jQuery结合CSS实现手风琴组件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Laravel 6.X 数据库迁移 创建表 与 修改表

    数据库迁移创建表 本篇文章中使用的是mysql数据库,其他数据库需要修改env文件和app配置,请其他地方搜索一下就会找到. 创建示例 1.创建users表: 命令行键入 php artisan ma ...

  5. 201771010131-王之泰 实验一 软件工程准备—<通读《现代软件工程—构建之法》后所思所想>周学习总结

    项目 内容 作业所属课程 https://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/12369881. ...

  6. encypt dataset

    import getoptimport sysimport uuidimport hashlibimport csvdef getIds(totals,encrypt): seed=set() for ...

  7. Mybatis学习day2

    Mybatis初探 之前已经用利用mybatis实现链接数据库查询所有用户的信息(用的是在resources下建立和Dao层一样目录的xml实现的).这次再来看一下增删改查等其它的操作. 利用Myba ...

  8. vs下载为0的问题

    问题描述:win10 下无法安装VS2017,visual studio installer下载进度始终为0,点击取消按钮后,也没有反应,visual studio installer也关闭不掉: 具 ...

  9. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  10. vue学习笔记:Hello Vue

    编写简单例子,了解下基本语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8 "&g ...