Pytorch dataset自定义【直播】2019 年县域农业大脑AI挑战赛---数据准备(二),Dataset定义
在我的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定义的更多相关文章
- Pytorch 分割模型构建和训练【直播】2019 年县域农业大脑AI挑战赛---(四)模型构建和网络训练
对于分割网络,如果当成一个黑箱就是:输入一个3x1024x1024 输出4x1024x1024. 我没有使用二分类,直接使用了四分类. 分类网络使用了SegNet,没有加载预训练模型,参数也是默认初始 ...
- Pytorch 加载保存模型【直播】2019 年县域农业大脑AI挑战赛---(三)保存结果
在模型训练结束,结束后,通常是一个分割模型,输入 1024x1024 输出 4x1024x1024. 一种方法就是将整个图切块,然后每张预测,但是有个不好处就是可能在边界处断续. 由于这种切块再预测很 ...
- Pytorch【直播】2019 年县域农业大脑AI挑战赛---初级准备(一)切图
比赛地址:https://tianchi.aliyun.com/competition/entrance/231717/introduction 这次比赛给的图非常大5万x5万,在训练之前必须要进行数 ...
- XAF 框架中,自定义参数动作(Action),输入参数的控件可定义,用于选择组织及项目
XAF 框架中,如何生成一个自定义参数动作(Action),输入参数的控件可定义? 参考文档:https://documentation.devexpress.com/eXpressAppFramew ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 2019年全国高校计算机能力挑战赛 C语言程序设计决赛
2019年全国高校计算机能力挑战赛 C语言程序设计决赛 毕竟这个比赛是第一次举办,能理解.. 希望未来再举办时,能够再完善一下题面表述.数据范围. 话说区域赛获奖名额有点少吧.舍友花60块想混个创新创 ...
- 2019年全国高校计算机能力挑战赛初赛C语言解答
http://www.ncccu.org.cn 2019年全国高校计算机能力挑战赛分设大数据算法赛,人工智能算法赛,Office高级应用赛,程序设计赛4大赛项 C语言初赛解答 1:编程1 16.现有一 ...
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...
- [Pytorch]PyTorch Dataloader自定义数据读取
整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...
随机推荐
- Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度
Fibonacci Sequence 维基百科 \(F(n) = F(n-1)+F(n-2)\),其中 \(F(0)=0, F(1)=1\),即该数列由 0 和 1 开始,之后的数字由相邻的前两项相加 ...
- nfs的原理 安装配置方法 centos6.5
NFS周边 Network File System 作用 像访问本地文件一样去访问NFS服务器上的文件,目录 引用场景: ..1 用户上传的静态文件---图片,视频,用户上传的视频,头像 ..2 中小 ...
- laravel 邮箱认证
修改 User 模型,将 Laravel 自带的邮箱认证功能集成到我们的程序中 <?php namespace App\Models; use Illuminate\Notifications\ ...
- POJ 1204 Word Puzzles(AC自动机)
这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...
- 杭电 2097 sky数
Sky数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题
1.版本,2019.2.2. 2.这个问题貌似是个bug,就是选中变色后会一直在,目前没有找到对应方法或者配置,如果你找到了,欢迎在评论中分享一下. 3.我这里只能先简单粗暴处理下,通过设置选中时不设 ...
- kubernetes从入门到放弃(二)
kubernetes对象之pod 1.pod的认识 Pod直译是豆荚,可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在Kubernetes中我们不会直接操作容 ...
- Selenium 页面加载慢
Selenium 页面加载慢 问题描述: 使用Selenium获取网页,发现webdriver.get方法会阻塞直到网页全部加载完成,官方提供的三种wait方法仅对网页的ajax有比较明显的效果.对于 ...
- (踩过的坑)使用Github Page搭建个人博客
最近需要搭建一个网站,作为导航网址,但是自己的域名备案还要等上几天,就想着有没有别的办法来搭建一个公网可以访问的网站. Github Page的话是一个github个人主页,完全适合用来搭建普通网站. ...
- day2-1流程控制语句及对象
流程控制语句: Switch (a){ Case x: ....; } 当a===x(全等)时执行该语句 对象: 使用构造函数创建,new Object() var person = new Obje ...