街景字符识别2-图像读取及图像增广
1 目的
- PIL读取数据
- PIL+Torch生成小批量图像数据样本
- 理解Baseline中torchvision.transforms进行图像增广的基本使用方法。
2 图像读取
Python中完成数据读取操作,比较常用的是Pillow和OpenCV、。注意:Image.open()读取的通道顺序是RGB,cv2.imread()读取的通道顺序为BGR。
单一图像读取:
2.1 Pillow
- Pillow的官方文档
- 读取及图像增强操作示例
- 图像格式转换.
注:模式“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')
- 增强过滤器
from PIL.ImageFilter import BLUR,GaussianBlur #模糊滤波
这里提到模糊滤波是为后期的模型优化做准备,阿水的第一期分享中提到模糊优化,大概是因为OCR识别等图像识别中在图像特征提取之前经常通过smooth/blur来使图像噪声降低、在二值化之前通过smooth/blur把不必要的噪声去掉,以免影响对准确的对象的提取。
2.2 OpenCV
OpenCV在功能上比Pillow更加强大。
- Python - Opencv 之 基础操作与变化操作
- 图像读入[cv2.imread()]、显示[cv2.imshow()]与保存[cv2.imwrite()]
- 变换操作:翻转图片[cv2.flip()]、颜色空间转换[cv2.cvtColor()]
- 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([])
- 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的成功中,图像增⼴技术功不可没。
——《动手学深度学习》李沐
- 阿水——Kaggle知识点:数据扩增方法
- 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-图像读取及图像增广相关推荐
- 图像预处理之数据增广
图像的数据增广 文章目录 图像的数据增广 数据增广的几种方式 相关工具包 相关代码 Url 数据增广的几种方式 翻转变换 flip 随机修剪 random crop 色彩抖动 color jitter ...
- 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])
随着深度学习的进步和硬件的更新迭代,计算机视觉技术也得到了更大的提升,在计算机视觉领域,经常要训练深度学习的模型,而训练模型的最终目的是为了更好的应用到实际当中去,那就要解决一个精度问题和泛化能力,对 ...
- opencv实现多图像读取并显示,sprintf_s函数,static_cast
基于opencv和C++实现多幅图像的加载,程序中需要将文件统一命名,而且文件名最后一定是数字,还未实现对字符文件名图像的加载. 首先介绍一个函数sprintf_s,sprintf_s是sprintf ...
- 青出于蓝而胜于蓝,超越MixUp、CutMix的样本混合数据增广新算法FMix
点击我爱计算机视觉标星,更快获取CVML新技术 深度学习实践中,数据的增广有很多种方法,比如在计算机视觉任务中除了常规的对单样本进行缩放.颜色扰动.旋转.镜像等外,也可以通过对两个样本进行混合,生成新 ...
- PaddleClas-图像分类中的8种数据增广方法(cutmix, autoaugment,..)
本文主要来源于PaddleClas这个代码仓库中的数据增广文档:https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/ad ...
- 计算机视觉:数据预处理-图像增广方法
计算机视觉:数据预处理-图像增广方法 数据预处理 随机改变亮暗.对比度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 图像增广方法汇总 批量数据读取与加速 数据预处理 在计算 ...
- [pytorch、学习] - 9.1 图像增广
参考 9.1 图像增广 在5.6节(深度卷积神经网络)里我们提过,大规模数据集是成功应用神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但 ...
- 深度学习-计算机视觉--图像增广
图像增广 大规模数据集是成功应用深度神经网络的前提.图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模. 图像增 ...
- CV街景门牌号码识别02_数据读取与增广
使用[定长字符识别]思路来构建模型,逐步讲解赛题的解决方案和相应知识点. 2 数据读取与数据扩增 本章主要内容为数据读取.数据扩增方法和Pytorch读取赛题数据三个部分组成. 2.1 学习目标 学习 ...
最新文章
- 20条编程经验(转)
- 通俗地解释脏读、不可重复读、幻读
- 【工作总结】银行应用系统架构(二)
- 【英语学习】【Level 07】U01 Making friends L5 A friend for a day
- python将字典写入csv_Python如何把字典写入到CSV文件的方法示例
- 06Matplotlib数据可视化--6.3折线图和柱状图
- 农村新农保加钱可不可以转城市社保?
- 挑战 TensorFlow、PyTorch,“后浪”OneFlow 有没有机会?
- COMSOL光纤建模、光子带隙分析等
- kali安装QQ音乐
- linux 硬件raid 坏道,Linux服务器磁盘坏道的修复过程
- 一文搞懂tf.function
- 随便写的:新戏剧之王,一部广义上的烂片观后感
- wangEditor - 支持word上传的富文本编辑器
- Java线上诊断工具:Arthas简单快速学习
- 数据简报:上证综合指数历史走势图(1991年以来)
- Hive数据仓库数据分析
- 小程序利用canvas实现波浪动态图,原生canvas的部分限制
- 计算机科学报数学竞赛,(word)首届全校数学竞赛.doc
- 【文献翻译】综述:机器学习可解释性
热门文章
- Unity jobsystem 和 burst编译器代码演示及效率测试
- mac装机系列:每次打开iTerm都需要source bash_profile问题
- java获取当前日期 前后 几个月的 日期期间 往前 2个月 往后 2个月
- Pots 用bfs模拟2杯子体积分别为A,B通过一系列操作把其中一杯子变为C升水
- 微信小程热映电影导演等数据获取
- 如何计算马来西亚的每月PCB所得税
- Vue项目启动出现的问题及解决方法
- 造梦无双服务器维护12月17日,造梦无双Online官网版
- php中平方代码_php 做出平方代码,用类来实现的接口,初学者请大侠们出手啊。...
- React之antd按需加载