Task2主要内容为数据读取、数据扩增方法和Pytorch读取赛题数据三个部分组成。
数据读取
- PIL
用PIL里面的Image方法读取图片比较简单,直接
im =Image.open(图片名.jpg')
即可。
而其中包含了一些别的读取方式,如应用模糊滤镜:
im =Image.open('test1.png')
im.filter(ImageFilter.BLUR)
上面是模糊之后的图,下面是原图
而OpenCV在功能上比Pillow更加强大很多。
- OpenCV
OpenCV是一个跨平台的计算机视觉库,最早由Intel开源得来。OpenCV发展的非常早,拥有众多的计算机视觉、数字图像处理和机器视觉等功能。
- OpenCV读取原图:
img = cv2.imread('test1.png')
可以看到,OpenCV读取图片后,是以图像矩阵的方式存储的。
opencv读取图像后,输出的shape为(HW3),如下:H:行数,W:列数,3:3通道,在opencv中默认的颜色空间是BGR,同时像素值为0-255。而PIL则是以RGB三通道存储。
- OpenCV读灰度图:
img = cv2.imread('test1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- opencv边缘检测
用的是Canny算子实现的边缘检测
img = cv2.imread('test1.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img, 30, 70)
cv2.imshow('edges',edges)
cv2.waitKey(0)
数据扩增
- 数据扩增为什么有用?
在深度学习模型的训练过程中,数据扩增是必不可少的环节。现有深度学习的参数非常多,一般的模型可训练的参数量基本上都是万到百万级别,而训练集样本的数量很难有这么多。
其次数据扩增可以扩展样本空间,假设现在的分类模型需要对汽车进行分类,左边的是汽车A,右边为汽车B。如果不使用任何数据扩增方法,深度学习模型会从汽车车头的角度来进行判别,而不是汽车具体的区别。
- 有哪些数据扩增方法?
数据扩增方法有很多:从颜色空间、尺度空间到样本空间,同时根据不同任务数据扩增都有相应的区别。
对于图像分类,数据扩增一般不会改变标签;对于物体检测,数据扩增会改变物体坐标位置;对于图像分割,数据扩增会改变像素标签。
- 常见的数据扩增方法
在常见的数据扩增方法中,一般会从图像颜色、尺寸、形态、空间和像素等角度进行变换。当然不同的数据扩增方法可以自由进行组合,得到更加丰富的数据扩增方法。
以torchvision为例,常见的数据扩增方法包括:
- transforms.CenterCrop 对图片中心进行裁剪
- transforms.ColorJitter 对图像颜色的对比度、饱和度和零度进行变换
- transforms.FiveCrop 对图像四个角和中心进行裁剪得到五分图像
- transforms.Grayscale 对图像进行灰度变换
- transforms.Pad 使用固定值进行像素填充
- transforms.RandomAffine 随机仿射变换
- transforms.RandomCrop 随机区域裁剪
- transforms.RandomHorizontalFlip 随机水平翻转
- transforms.RandomRotation 随机旋转
- transforms.RandomVerticalFlip 随机垂直翻转
注意:在本次赛题中,赛题任务是需要对图像中的字符进行识别,因此对于字符图片并不能进行翻转操作。比如字符6经过水平翻转就变成了字符9,会改变字符原本的含义。
下图是几个图像变换操作:
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])
]))
而使用compose可以将多个图像变换操作一起执行
p = 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])
])
im =Image.open('test1.png')
im = p(im)
im