這裏,繼上篇對題目理解之後,又一篇,對數據的讀取。這裏寫的內容更多的是圖片數據,當然也包括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中,重要的而且需要注意的店在於對於擴列數據的處理,這個,我後面需要加強學習鞏固。通過這次學習,對這塊有了更深的認知。知而知不足,不足而習知,知之也。