1、图像读取

Python中有很多库可以完成数据读取的操作,比较常见的有Pillow和OpenCV。
1.1 Pillow
Pillow是Python图像处理函式库(PIL)的一个分支。Pillow提供了常见的图像读取和处理的操作,而且可以与ipython notebook无缝集成,是应用比较广泛的库。


注:
Pillow的官方文档:https://pillow.readthedocs.io/en/stable/
1.2 OpenCV
OpenCV是一个跨平台的计算机视觉库,最早由Intel开源得来。OpenCV发展的非常早,拥有众多的计算机视觉、数字图像处理和机器视觉等功能。OpenCV在功能上比Pillow更加强大很多,学习成本也高很多。

OpenCV包含了众多的图像处理的功能。OpenCV还内置了很多的图像特征处理算法,如关键点检测、边缘检测和直线检测等。
注:
OpenCV官网:https://opencv.org/
OpenCV Github:https://github.com/opencv/opencv
OpenCV 扩展算法库:https://github.com/opencv/opencv_contrib

2、数据扩增方法

2.1 数据扩增介绍
数据扩增可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力。

数据扩增用处:
在深度学习模型的训练过程中,数据扩增是必不可少的环节。现有深度学习的参数非常多,一般的模型可训练的参数量基本上都是万到百万级别,而训练集样本的数量很难有这么多。其次数据扩增可以扩展样本空间,假设现在的分类模型需要对汽车进行分类,左边的是汽车A,右边为汽车B。如果不使用任何数据扩增方法,深度学习模型会从汽车车头的角度来进行判别,而不是汽车具体的区别。

数据扩增方法:
数据扩增方法有很多:从颜色空间、尺度空间到样本空间,同时根据不同任务数据扩增都有相应的区别。
对于图像分类,数据扩增一般不会改变标签;对于物体检测,数据扩增会改变物体坐标位置;对于图像分割,数据扩增会改变像素标签。
2.2 常见的数据扩增方法
在常见的数据扩增方法中,一般会从图像颜色、尺寸、形态、空间和像素等角度进行变换。当然不同的数据扩增方法可以自由进行组合,得到更加丰富的数据扩增方法。
以torchvision为例,常见的数据扩增方法包括:
1、transforms.CenterCrop 对图片中心进行裁剪
2、transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行变换
3、transforms.FiveCrop 对图像四个角和中心进行裁剪得到五分图像
4、transforms.Grayscale 对图像进行灰度变换
5、transforms.Pad 使用固定值进行像素填充
6、transforms.RandomAffine 随机仿射变换
7、transforms.RandomCrop 随机区域裁剪
8、transforms.RandomHorizontalFlip 随机水平翻转
9、transforms.RandomRotation 随机旋转
10、transforms.RandomVerticalFlip 随机垂直翻转

在本次赛题中,任务是需要对图像中的字符进行识别,因此对于字符图片并不能进行翻转操作。比如字符6经过水平翻转就变成了字符9,会改变字符原本的含义。
2.3 常用的数据扩增库
torchvision
https://github.com/pytorch/vision
pytorch官方提供的数据扩增库,提供了基本的数据数据扩增方法,可以无缝与torch进行集成;但数据扩增方法种类较少,且速度中等;

imgaug
https://github.com/aleju/imgaug
imgaug是常用的第三方数据扩增库,提供了多样的数据扩增方法,且组合起来非常方便,速度较快;

albumentations
https://albumentations.readthedocs.io
是常用的第三方数据扩增库,提供了多样的数据扩增方法,对图像分类、语义分割、物体检测和关键点检测都支持,速度较快。

3、Pytorch读取数据

在Pytorch中数据是通过Dataset进行封装,并通过DataLoder进行并行读取。所以我们只需要重载一下数据读取的逻辑就可以完成数据的读取。

import os, sys, glob, shutil, json
import cv2from PIL import Image
import numpy as npimport torch
from torch.utils.data.dataset import Dataset
import torchvision.transforms as transformsclass SVHNDataset(Dataset):def __init__(self, img_path, img_label, transform=None):self.img_path = img_pathself.img_label = img_label if transform is not None:self.transform = transformelse:self.transform = Nonedef __getitem__(self, index):img = Image.open(self.img_path[index]).convert('RGB')if self.transform is not None:img = self.transform(img)# 原始SVHN中类别10为数字0lbl = np.array(self.img_label[index], dtype=np.int)lbl = list(lbl)  + (5 - len(lbl)) * [10]return img, torch.from_numpy(np.array(lbl[:5]))def __len__(self):return len(self.img_path)train_path = glob.glob('../input/train/*.png')
train_path.sort()
train_json = json.load(open('../input/train.json'))
train_label = [train_json[x]['label'] for x in train_json]data = SVHNDataset(train_path, train_label,transforms.Compose([# 缩放到固定尺寸transforms.Resize((64, 128)),# 随机颜色变换transforms.ColorJitter(0.2, 0.2, 0.2),# 加入随机旋转transforms.RandomRotation(5),# 将图片转换为pytorch 的tesntor# transforms.ToTensor(),# 对图像像素进行归一化# transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]))

上述代码可以将赛题的图像数据和对应标签进行读取,在读取过程中的进行数据扩增,效果如下:

接下来我们将在定义好的Dataset基础上构建DataLoder,Dataset:对数据集的封装,提供索引方式的对数据样本进行读取;
DataLoder:对Dataset进行封装,提供批量读取的迭代读取。
加入DataLoder后,数据读取代码改为如下:

import os, sys, glob, shutil, json
import cv2from PIL import Image
import numpy as npimport torch
from torch.utils.data.dataset import Dataset
import torchvision.transforms as transformsclass SVHNDataset(Dataset):def __init__(self, img_path, img_label, transform=None):self.img_path = img_pathself.img_label = img_label if transform is not None:self.transform = transformelse:self.transform = Nonedef __getitem__(self, index):img = Image.open(self.img_path[index]).convert('RGB')if self.transform is not None:img = self.transform(img)# 原始SVHN中类别10为数字0lbl = np.array(self.img_label[index], dtype=np.int)lbl = list(lbl)  + (5 - len(lbl)) * [10]return img, torch.from_numpy(np.array(lbl[:5]))def __len__(self):return len(self.img_path)train_path = glob.glob('../input/train/*.png')
train_path.sort()
train_json = json.load(open('../input/train.json'))
train_label = [train_json[x]['label'] for x in train_json]train_loader = torch.utils.data.DataLoader(SVHNDataset(train_path, train_label,transforms.Compose([transforms.Resize((64, 128)),transforms.ColorJitter(0.3, 0.3, 0.2),transforms.RandomRotation(5),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])), batch_size=10, # 每批样本个数shuffle=False, # 是否打乱顺序num_workers=10, # 读取的线程个数
)for data in train_loader:break

在加入DataLoder后,数据按照批次获取,每批次调用Dataset读取单个样本进行拼接。此时data的格式为:

torch.Size([10, 3, 64, 128]), torch.Size([10, 6])

前者为图像文件,为batchsize * chanel * height * width次序;后者为字符标签。

4、总结

此处进行了数据读取相关操作的总结,以及数据扩增方法和使用,并使用Pytorch框架对本次赛题的数据进行读取。

数据读取与数据扩增理解相关推荐

  1. 天池大赛:街景字符编码识别——Part2:数据读取与数据扩增

    街景字符编码识别 更新流程↓ Task01:赛题理解 Task02:数据读取与数据扩增 Task03:字符识别模型 Task04:模型训练与验证 Task05:模型集成 底到镜一 比赛链接 Part2 ...

  2. 图像数据读取及数据扩增方法

    Datawhale干货 作者:王程伟,Datawhale成员 本文为干货知识+竞赛实践系列分享,旨在理论与实践结合,从学习到项目实践.(零基础入门系列:数据挖掘/cv/nlp/金融风控/推荐系统等,持 ...

  3. 计算机视觉实践(街景字符编码识别)-Task2 数据读取与数据扩增

    计算机视觉实践(街景字符编码识别)-Task2 数据读取与数据扩增 2.1.数据读取与数据扩增 本章主要内容为数据读取.数据扩增方法和Pytorch读取赛题数据三个部分组成. 2.1 学习目标 学习P ...

  4. 数据读取与数据扩增方法

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:樊亮.黄星源.Datawhale优秀学习者 本文对图像数据读取及图 ...

  5. Datawhale 零基础入门CV赛事-Task2 数据读取与数据扩增

    文章目录 数据读取 图像读取 1.pillow 2.opencv 数据读取 数据扩增 数据读取 导入需要的包以及文件路径 import json, glob import numpy as np fr ...

  6. 【深度学习】数据读取与数据扩增方法

    转载自:Datawhale,作者:樊亮.黄星源.Datawhale优秀学习者 本文对图像数据读取及图像数据扩增方法进行了总结,并以阿里天池零基础入门CV赛事为实践,利用Pytorch对数据进行了读取和 ...

  7. 【阿里云天池】实战:街景符号识别(数据读取与数据扩增)

    一.数据扩增 在深度学习中数据扩增方法非常重要,数据扩增可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力. (1)数据扩增的作用 在深度学习模型的训练过程中, ...

  8. PyTorch系列 (二): pytorch数据读取自制数据集并

    PyTorch系列 (二): pytorch数据读取 PyTorch 1: How to use data in pytorch Posted by WangW on February 1, 2019 ...

  9. R语言数据读取以及数据保存

    一.R语言读取文本文件: 1.文件目录操作: getwd() : 返回当前工作目录 setwd("d:/data")  更改工作目录 2.常用的读取指令read read.tabl ...

最新文章

  1. 【资源推荐】知识图谱顶会论文集锦
  2. erp框架 saas_【观察】一周之后,浪潮云ERP将直面数字化转型2.0四大攻坚战
  3. 一些开源搜索引擎实现——倒排使用原始文件,列存储Hbase,KV store如levelDB、mongoDB、redis,以及SQL的,如sqlite或者xxSQL...
  4. 自由自在意式手工冰淇淋 果香浪漫的甜蜜
  5. python打开csv文件、计算总成绩_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...
  6. C++ 堆、栈、自由存储区、全局静态存储区和常量存储区
  7. 达摩院送你100万,请坚持“看月亮”
  8. 资源放送丨《容灾体系建设之“独孤九式”》PPT视频
  9. python实现IIR高通低通,带通,带阻滤波器详解及应用案例
  10. 机器学习在企业管理中如何落地?25个行业近500名CIO这样说
  11. C语言课程设计 简单的单词学习系统
  12. HCIA---华为认证初级网络工程师
  13. 抖音seo,抖音优化系统,抖音seo矩阵系统源码技术搭建
  14. 基于Python的随机森林(RF)回归与变量重要性影响程度分析
  15. 【CVPR 2021】Refine Myself by Teaching Myself : Feature Refinement via Self-Knowledge Distillation
  16. 公司企业邮箱怎么开通注册?仅需2步,教大家公司企业邮箱怎么弄
  17. 理解shell命名空间扩展
  18. 内容非常全面,细节爆炸
  19. Java通过二维码下载Apk====安卓手机
  20. php吓人,网友分享最细思极恐的真实经历,截图太可怕…

热门文章

  1. mac装机系列:每次打开iTerm都需要source bash_profile问题
  2. (python代码)BP神经网络模型
  3. NG-ZORRO(0.6.x)的Pagination分页功能
  4. GMT以及时间的格式
  5. opencv 之人眼人脸检测
  6. 一个mysql安装问题的解决
  7. 010201信息收集
  8. 专家看台:柯莱特CTO谈企业选择CRM的六大目标
  9. 渲染服务器自动渲染软件有哪些,BIM渲染软件有哪些?Keyshot渲染软件及功能简介...
  10. [附源码]java毕业设计房屋租赁系统