1 目的

  1. PIL读取数据
  2. PIL+Torch生成小批量图像数据样本
  3. 理解Baseline中torchvision.transforms进行图像增广的基本使用方法。

2 图像读取

Python中完成数据读取操作,比较常用的是Pillow和OpenCV、。注意:Image.open()读取的通道顺序是RGB,cv2.imread()读取的通道顺序为BGR。

单一图像读取:

2.1 Pillow

  1. Pillow的官方文档
  2. 读取及图像增强操作示例
  3. 图像格式转换.
    注:模式“RGB”转换为模式“L”以后,像素值为[0,255]之间的某个数值。而从模式“L”转换成“RGB”时,“RGB”的三个通道都是模式“L”的像素值的拷贝。
    这里有个问题:
  • 原始数据是L模式,CHANEL为1?PIL数据已经转成RGB,这时候数据是CHANEL为3吗?
from PIL import Image # 读取图片
im =Image.open('lena.jpg’)
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
#缩放原图
im.thumbnail((w//2, h//2))
im.save('thumbnail.jpg', 'jpeg')
  1. 增强过滤器
 from PIL.ImageFilter import BLUR,GaussianBlur #模糊滤波

这里提到模糊滤波是为后期的模型优化做准备,阿水的第一期分享中提到模糊优化,大概是因为OCR识别等图像识别中在图像特征提取之前经常通过smooth/blur来使图像噪声降低、在二值化之前通过smooth/blur把不必要的噪声去掉,以免影响对准确的对象的提取。

2.2 OpenCV

OpenCV在功能上比Pillow更加强大。

  1. Python - Opencv 之 基础操作与变化操作
  • 图像读入[cv2.imread()]、显示[cv2.imshow()]与保存[cv2.imwrite()]
  • 变换操作:翻转图片[cv2.flip()]、颜色空间转换[cv2.cvtColor()]
  1. Python - Opencv 之 Canny 边缘检测理论及具体实现
   import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread('lena.jpg',0)edges = cv2.Canny(img, 100, 200)plt.subplot(121),plt.imshow(img,cmap = 'gray')plt.title('Original Image'), plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(edges,cmap = 'gray')plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
  1. Python - Opencv 之平滑与模糊滤波

batch图像读取:

这个说法并不准确,batch样本是为了训练模型,实际还是基于单体图像读取(这里使用PIL),封装成一个torch.utils.data.dataset的子类,然后将其传入torch.utils.data.DataLoader来创建一个读取小批量数据样本的DataLoader实例,完成batch样本提取。

import torch,glob
from PIL import Image '''第一步 生成数据集'''
class SVHNDataset(torch.utils.data.dataset.Dataset):def __init__(self,img_path,img_label,transform=None):'''Args:img_path 单个图像路径img_label 单个图像标签transform 为图像增广做准备'''self.img_path = img_pathself.img_label = img_label if transform is not None:self.transform = transformelse:self.transform = Nonedef __getitem__(self, index):'''Args:index 图像序号output:img 单一图像特征序列torch.from_numpy(np.array(lbl[:5])) 单一图像的定长字符标签'''# 读取图片并转换为RGB格式img = Image.open(self.img_path[index]).convert('RGB')if self.transform is not None:img = self.transform(img)# 将不定长的变迁转换成设置长度为5的定长字符串lbl = 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')  #提取所有训练集png文件路径
train_path.sort() #路径排序
train_json = json.load(open('../input/train.json')) #读取训练集标签及边界框信息
train_label = [train_json[x]['label'] for x in train_json]  #生成训练集标签
print(len(train_path), len(train_label))
dataset = SVHNDataset(train_path, train_label,transform=None) #定义训练数据集。
'''!!!这里transform=None应该会出错【待确认】,至少需要指定参数 transform = transforms.ToTensor() 使所有数据转换为 Tensor ,如果不进行转换则返回的是PIL图片。 transforms.ToTensor() 将尺寸为 (H x W x C) 且数据位于[0, 255]的PIL 图片或者数据类型为 np.uint8 的 NumPy 数组转换为尺寸为 (C x H x W) 且数据类型为 torch.float32 且位于[0.0, 1.0]的 Tensor 。''''''第二步 读取小批量'''
batch_size=40 #小批量样本量
shuffle=True #样本的读取顺序是随机的
train_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=shuffle, num_workers=0)
for i, (inputs, targets) in enumerate(train_loader):print(inputs,targets) #inputs是随机读取的长度为batch_size的Tensor,其中每一个分别为各个图像的尺寸为 (C x H x W) 且数据类型为 torch.float32 且位于[0.0, 1.0]的 Tensor。#targetss是对应的40个标签。break

3 图像增广

3.1 基础知识

数据扩增(Data Augmentation)操作的目的是为了增加训练集的数量缓解过拟合

大规模数据集是成功应用深度神经网络的前提。图像增 广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。例如,我们可以对图像进行不同方式的裁剪,使感兴趣的物体出现在不同位置,从而减轻模型对物体出现位置的依赖性。我们也可以调整亮度、色彩等因素来降低模型对色彩的敏感度。可以说,在当年AlexNet的成功中,图像增⼴技术功不可没。
——《动手学深度学习》李沐

  1. 阿水——Kaggle知识点:数据扩增方法
  2. PyTorch源码解读之torchvision.transforms

目前Baseline里用到transfrom的顺序依次是Resize、RandomCrop、ColorJitter、RandomRotation、ToTensor、Normalize。

  • Resize(size=(h, w)):resize输出尺寸为(h, w).
  • RandomCrop(size=(h, w)):crop时的中心点坐标是随机的,每次crop生成的图像都是有差异的,输出尺寸为(h, w)。
  • ColorJitter(brightness,contrast,saturation):修改输入图像的3大参数值:brightness, contrast and saturation,也就是亮度,对比度,饱和度。
  • RandomRotation(degrees):随机旋转输入图像。
  • ToTensor():Convert a PIL Image((H x W x C),[0, 255]) or numpy.ndarray to tensor 的过程, 输出尺寸为 (C x H x W) 且数据类型为 torch.float32 且位于 [0.0, 1.0] 的 Tensor 。在PyTorch中常用PIL库来读取图像数据,因此这个方法相当于搭建了PIL Image和Tensor的桥梁。 另外要强调的是在做数据归一化之前必须要把PIL Image转成Tensor,而其他resize或crop操作则不需要。
  • Normalize(mean,std):数据标准化【(X-mean)/std】,主要是取消梯度量级的差异,使得剃度始终朝着最小值的方向前进,加速收敛。在调用Normalize的时候,输入得是Tensor。

3.2 torchvision.transforms进行图像增广

这里存在一些问题,比如

  • Resize的Size(64,128)有没有什么依据?PIL转成RGB后数据CHANEL影响这个数字吗?验证集(60,120)是搞混了吧?是否需要训练集、验证集、测试集数据都一样?
  • RandomCrop不应该对测试集进行处理吧?改成对训练集处理?
  • RandomRotation里旋转5度会不会影响6和9的分类?
transform类型 训练集 验证集 测试集
Resize(size=(h, w)) (64, 128) (60, 120) (64, 128)
RandomCrop(size=(h, w)) × × (60, 120)
ColorJitter(brightness,contrast,saturation) (0.3, 0.3, 0.2) × ×
RandomRotation(degrees) 5 × ×
ToTensor()
Normalize(mean,std) [0.485, 0.456, 0.406], [0.229, 0.224, 0.225] [0.485, 0.456, 0.406], [0.229, 0.224, 0.225] [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]
import torchvision.transforms as transforms
train_trans = 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])])
val_trans = transforms.Compose([transforms.Resize((60, 120)),# 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])])
test_trans = transforms.Compose([transforms.Resize((64, 128)),transforms.RandomCrop((60, 120)),# 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])])

4 小结

学到知识心里高兴。

5 参考

动手学深度学习 PYTORCH 版(DEMO)
链接已各处贴上。

Have fun~
2020.5.23

街景字符识别2-图像读取及图像增广相关推荐

  1. 图像预处理之数据增广

    图像的数据增广 文章目录 图像的数据增广 数据增广的几种方式 相关工具包 相关代码 Url 数据增广的几种方式 翻转变换 flip 随机修剪 random crop 色彩抖动 color jitter ...

  2. 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])

    随着深度学习的进步和硬件的更新迭代,计算机视觉技术也得到了更大的提升,在计算机视觉领域,经常要训练深度学习的模型,而训练模型的最终目的是为了更好的应用到实际当中去,那就要解决一个精度问题和泛化能力,对 ...

  3. opencv实现多图像读取并显示,sprintf_s函数,static_cast

    基于opencv和C++实现多幅图像的加载,程序中需要将文件统一命名,而且文件名最后一定是数字,还未实现对字符文件名图像的加载. 首先介绍一个函数sprintf_s,sprintf_s是sprintf ...

  4. 青出于蓝而胜于蓝,超越MixUp、CutMix的样本混合数据增广新算法FMix

    点击我爱计算机视觉标星,更快获取CVML新技术 深度学习实践中,数据的增广有很多种方法,比如在计算机视觉任务中除了常规的对单样本进行缩放.颜色扰动.旋转.镜像等外,也可以通过对两个样本进行混合,生成新 ...

  5. PaddleClas-图像分类中的8种数据增广方法(cutmix, autoaugment,..)

    本文主要来源于PaddleClas这个代码仓库中的数据增广文档:https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/ad ...

  6. 计算机视觉:数据预处理-图像增广方法

    计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...

  7. [pytorch、学习] - 9.1 图像增广

    参考 9.1 图像增广 在5.6节(深度卷积神经网络)里我们提过,大规模数据集是成功应用神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但 ...

  8. 深度学习-计算机视觉--图像增广

    图像增广 大规模数据集是成功应用深度神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模. 图像增 ...

  9. CV街景门牌号码识别02_数据读取与增广

    使用[定长字符识别]思路来构建模型,逐步讲解赛题的解决方案和相应知识点. 2 数据读取与数据扩增 本章主要内容为数据读取.数据扩增方法和Pytorch读取赛题数据三个部分组成. 2.1 学习目标 学习 ...

最新文章

  1. 20条编程经验(转)
  2. 通俗地解释脏读、不可重复读、幻读
  3. 【工作总结】银行应用系统架构(二)
  4. 【英语学习】【Level 07】U01 Making friends L5 A friend for a day
  5. python将字典写入csv_Python如何把字典写入到CSV文件的方法示例
  6. 06Matplotlib数据可视化--6.3折线图和柱状图
  7. 农村新农保加钱可不可以转城市社保?
  8. 挑战 TensorFlow、PyTorch,“后浪”OneFlow 有没有机会?
  9. COMSOL光纤建模、光子带隙分析等
  10. kali安装QQ音乐
  11. linux 硬件raid 坏道,Linux服务器磁盘坏道的修复过程
  12. 一文搞懂tf.function
  13. 随便写的:新戏剧之王,一部广义上的烂片观后感
  14. wangEditor - 支持word上传的富文本编辑器
  15. Java线上诊断工具:Arthas简单快速学习
  16. 数据简报:上证综合指数历史走势图(1991年以来)
  17. Hive数据仓库数据分析
  18. 小程序利用canvas实现波浪动态图,原生canvas的部分限制
  19. 计算机科学报数学竞赛,(word)首届全校数学竞赛.doc
  20. 【文献翻译】综述:机器学习可解释性

热门文章

  1. Unity jobsystem 和 burst编译器代码演示及效率测试
  2. mac装机系列:每次打开iTerm都需要source bash_profile问题
  3. java获取当前日期 前后 几个月的 日期期间 往前 2个月 往后 2个月
  4. Pots 用bfs模拟2杯子体积分别为A,B通过一系列操作把其中一杯子变为C升水
  5. 微信小程热映电影导演等数据获取
  6. 如何计算马来西亚的每月PCB所得税
  7. Vue项目启动出现的问题及解决方法
  8. 造梦无双服务器维护12月17日,造梦无双Online官网版
  9. php中平方代码_php 做出平方代码,用类来实现的接口,初学者请大侠们出手啊。...
  10. React之antd按需加载