零基礎入門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中,重要的而且需要注意的店在於對於擴列數據的處理,這個,我後面需要加強學習鞏固。通過這次學習,對這塊有了更深的認知。知而知不足,不足而習知,知之也。

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