经过前几天的pytorch安装、anaconda重装等一系列问题,cv小白终于把baseline跑通了!!但是,对于代码仍然有很多地方不理解,好在从TASK2开始,就是对问题的详细讲解了。
任务二的主要内容是数据读取、数据扩增方法和Pytorch读取赛题数据三个部分。
一、常用的图像读取方法
对于图像数据的处理,首先需要完成对图像数据的读取操作,在Pytorch中有很多库可以完成,比较常见的有Pillow和OpenCV。(之前只用过openCV做图像变换,没有了解过Pillow)
1、Pillow
首先放上Pillow的官方文档:https://pillow.readthedocs.io/en/stable/
读取操作可以查看文档中Image的详细用法
这里教程中指出Pillow可以与ipython notebook无缝集成,是应用比较广泛的库(不知道ipython notebook是啥),同时给出了常用的读取代码和效果。
效果 | 代码 |
---|---|
![]() |
from PIL import Image # 导入Pillow库 im = Image.open('cat,jpg') # 读取图片 |
![]() |
from PIL import Image, ImageFilter im = Image.open('cat.jpg') im2 = im.filter(ImageFilter.BLUR) im2.save('blur.jpg', 'jpeg') # 应用模糊滤镜 |
![]() |
from PIL import Image im = Image.open('cat.jpg') im.thumbnail((w//2,h//2)) # 改变图片大小 im.save('thumbnail.jpg', 'jpeg') |
2、OpenCV
仍然是先放上官网:https://opencv.org/
OpenCV扩展算法库:https://github.com/opencv/opencv_contrib
OpenCV发展的非常早,拥有众多的及算你视觉、数字图像处理和机器视觉等功能,在功能上比Pillow强大很多,学习成本也更高。
效果 | 代码 |
---|---|
![]() |
import cv2 #导入Opencv库 img = cv2.imread(‘cat.jpg’) #Opencv默认颜色通道顺序是BGR,转换一下顺序 img = cv2.cvtColor(img.cv2.COLOR_BGR2RGB) |
![]() |
import cv2 #导入Opencv库 img = cv2.imread(‘cat.jpg’) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转换为灰度图 |
![]() |
import cv2 #导入Opencv库 img = cv2.imread(‘cat.jpg’) img = cv2.cvtColor(img.cv2.COLOR_BGR2GRAY) edges = cv2.Canny(img, 30, 70) cv2.imwrite(‘canny.jpg’, edges) #Canny边缘检测 |
此外,Opencv还内置了很多图像特征处理算法,如关键点检测、边缘检测和直线检测等。
二、数据扩增方法
在本次赛题中,我们需要对图像进行字符识别,在读取数据后需要完成数据扩增(Data Augmentation)操作。
1、数据扩增为什么有用?
数据扩增可以增加训练集的样本,同时也可以有效缓解模型过拟合的情况,也可以给模型带来的更强的泛化能力。
在深度学习模型的训练中,数据扩增是必不可少的环节。现有深度学习的参数非常多,一般的模型可训练的参数量基本上都是万到百万级别,而训练集样本的数量很难有这么多。
其次数据扩增可以扩展样本空间,假设现在的分类模型需要对汽车进行分类,左边的是汽车A,右边为汽车B。如果不使用任何数据扩增方法,深度学习模型会从汽车车头的角度来进行判别,而不是汽车具体的区别。
2、有哪些数据扩增方法?
对于图像分类,数据扩增一般不会改变标签;对于物体检测、数据扩增会改变物体坐标位置;对于图像分割、数据扩增会改变像素标签。
在常见的数据扩增方法中,一般会从图像颜色、尺寸、形态、空间和像素等角度进行变换。以torchvision为例,常见的数据扩增方法包括:
扩增方法 | 功能 |
---|---|
transforms.CenterCrop | 对图片中心进行裁剪 |
transforms.ColorJitter | 对图像颜色的对比度、饱和度和零度进行变换 |
transforms.FiveCrop | 对图像四个角和中心进行裁剪得到五分图像 |
transforms.Grayscale | 对图像进行灰度变换 |
transforms.Pad | 使用固定值进行像素填充 |
transforms.RandomAffine | 随机仿射变换 |
transforms.RandomCrop | 随机区域裁剪 |
transforms.RandomHorizontalFlip | 随机水平翻转 |
transforms.RandomRotation | 随机旋转 |
transforms.RandomVeticalFlip | 随机垂直翻转 |
在本次赛题中,赛题任务是需要对图像中的字符进行识别,因此对于字符图片并不能进行翻转操作。比如“6”翻转之后就变成“9”.
3、常用的数据扩增库
torchvision:https://github.com/pytorch/vision
Pytorch官方提供的数据扩增库,提供了基本的数据扩增方法,可以无缝与torch进行集成;但数据扩增方法种类较少,且速度中等;
imgaug:https://github.com/aleju/imgaug
imgaug是常用的第三方数据扩增库,提供了多样的数据扩增方法,且组合起来非常方便,速度较快;
albumentations:https://albumentations.readthedocs.io