零基础入门CV赛事- 街景字符编码识别Task2

这里,继上篇对题目理解之后,又一篇,对数据的读取。这里写的内容更多的是图片数据,当然也包括json数据。不再赘述题目中图片怎样读取图片,与之相关的内容会在后面使用这块中写出。跟上篇一样,先简要介绍一下涉及的库与模块,主要的他对于机器学习的作用与意义。

1.数据读取的相关模块的简介

  • Pillow

PIL库可以完成图像归档和图像处理两方面功能需求。图像归档:对图像进行批处理、生成图像预览、图像格式转换等;图像处理:图像基本处理、像素处理、颜色处理等。

  • OpenCV

一款强大的跨平台的计算机视觉库,使用它能完成我们对于图像和视频处理的很多功能。它以电信号的方式加以捕捉、记录、处理、储存、传送与重现的各种技术。这里主要是用来对图片的处理。

  • torchvision

torchvision独立于torch。torchvision包由流行的数据集(torchvision.datasets)、模型架构(torchvision.models)和用于计算机视觉的常见图像转换组成t(torchvision.transforms)

  • imgaug

机器学习实验中图像增强的python库,支持python2.7和3.4以上的版本。 它支持多种增强技术,允许轻松组合这些技术,具有简单但功能强大的随机界面,可以在这些界面上增加图像和关键点/界标,并在后台进程中提供增强功能以提高性能。

  • albumentations

可用于深度学习中网络训练时的图片数据增强。基于高度优化的 OpenCV 库实现图像快速数据增强。针对不同图像任务,如分割,检测等,超级简单的 API 接口。易于个性化定制。易于添加到其它框架,比如 PyTorch.

  • Pytorch

PyTorch是美国互联网巨头Facebook在深度学习框架Torch的基础上使用Python重写的一个全新的深度学习框架,它更像NumPy的替代产物,不仅继承了NumPy的众多优点,还支持GPUs计算,在计算效率上要比NumPy有更明显的优势;不仅如此,PyTorch还有许多高级功能,比如拥有丰富的API,可以快速完成深度神经网络模型的搭建和训练。

2.数据读取实现

pillow模块对图片的基本处理方法

from PIL import Image
im = Image.open("cv/mchar_train/mchar_train/000001.png")
im.show()

# 高斯模糊 
im.filter(ImageFilter.GaussianBlur) 
# 普通模糊 
im.filter(ImageFilter.BLUR) 
# 边缘增强 
im.filter(ImageFilter.EDGE_ENHANCE) 
# 找到边缘 
im.filter(ImageFilter.FIND_EDGES) 
# 浮雕 
im.filter(ImageFilter.EMBOSS) 
# 轮廓 
im.filter(ImageFilter.CONTOUR) 
# 锐化 
im.filter(ImageFilter.SHARPEN) 
# 平滑 
im.filter(ImageFilter.SMOOTH) 
# 细节 
im.filter(ImageFilter.DETAIL)

im = ImageGrab.grab((0,0,800,200)) #截取屏幕指定区域的图像 
im = ImageGrab.grab() #不带参数表示全屏幕截图

opencv对图片数据的细节处理

import cv2
import numpy as np

# 生成图片
img = cv2.imread("cv/mchar_train/mchar_train/000001.jpg")


imgZero = np.zeros(img.shape, np.uint8)

imgFix = np.zeros((300, 500, 3), np.uint8)
# imgFix = np.zeros((300,500),np.uint8)

cv2.imshow("img", img)
cv2.imshow("imgZero", imgZero)
cv2.imshow("imgFix", imgFix)
cv2.waitKey()


这里,重点介绍一下数据扩增,因为对于机器学习,数据扩增对于机器学习,尤其是机器视觉很关键。用个成语,管中窥豹。数据扩增就是窥所有,而不是窥一角。数据扩列主要用的模块是torchvision,前面说torch是图片数据的numpy,那么torchvision就是机器学习的手术刀,深入具体的解刨图片数据。

import os, sys, glob, shutil, json
import cv2

from PIL import Image
import numpy as np

import torch
from torch.utils.data.dataset import Dataset
import torchvision.transforms as transforms


class SVHNDataset(Dataset):
    def __init__(self, img_path, img_label, transform=None):
        self.img_path = img_path
        self.img_label = img_label
        if transform is not None:
            self.transform = transform
        else:
            self.transform = None

    def __getitem__(self, index):
        img = Image.open(self.img_path[index]).convert('RGB')

        if self.transform is not None:
            img = self.transform(img)

        # 原始SVHN中类别10为数字0
        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('cv/mchar_train/mchar_train/*.png')
train_path.sort()
train_json = json.load(open('cv/mchar_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,  # 读取的线程个数
)

if __name__ == 'main':
    for dat in train_loader:
        break

总结:

其实,数据读取不是很难,但是对于机器学习来说,这个学习的难点在于,对于扩列数据的读取,机器学习task2中,重要的而且需要注意的店在于对于扩列数据的处理,这个,我后面需要加强学习巩固。通过这次学习,对这块有了更深的认知。知而知不足,不足而习知,知之也。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章