數據讀取與數據擴增


上一次內容是: 賽題的內容和三種不同的解決方案。選取第一個解題思路:【定長字符識別】思路來構建模型,並逐步講解賽題的解決方案和相應知識點。
本章主要內容爲數據讀取、數據擴增方法和Pytorch讀取賽題數據三個部分組成
學習目標:學習python和pytorch中圖像讀取 學會擴增方法和pytorch讀取賽題數據

1 名詞概念:iteration、epoch、batchsize

1.1 解釋

epoch:就是整個訓練集被訓練算法遍歷的次數。
iterations:進行訓練需要的總共的迭代次數。單次迭代次數=(全部訓練樣本/batchsize) / iteration =1
batchsize(批大小):進行一次iteration(迭代)所訓練數據的數量。
epoch:一次epoch是指將所有數據訓練一遍的次數,epoch所代表的數字是指所有數據被訓練的總輪數。
例如:有49000個數據,計劃進行十輪訓練,那麼epoch=10;一次訓練迭代訓練100個數據,batchsize=100,訓練一輪總共要迭代490次(49000/100=490)。總的iteration=490*10=4900次。

1.2 爲什麼使用

在數據很龐大的時候(在機器學習中,幾乎任何時候都是),我們才需要使用 epochs,batch size,iteration這些術語,在這種情況下,一次性將數據輸入計算機是不可能的。因此,爲了解決這個問題,我們需要把數據分成小塊,一塊一塊的傳遞給計算機,在每一步的末端更新神經網絡的權重,擬合給定的數據。

1.3 爲什麼epochs對於一次?

在神經網絡中傳遞完整的數據集一次是不夠的,而且我們需要將完整的數據集在同樣的神經網絡中傳遞多次。我們使用的是有限的數據集,並且我們使用一個迭代過程即梯度下降,優化學習過程和圖示。因此僅僅更新權重一次或者說使用一個 epoch 是不夠的。

隨着 epoch 數量增加,神經網絡中的權重的更新次數也增加,曲線從欠擬合變得過擬合。

1.4 bachsize的作用?

batch_size將影響到模型的優化程度和速度。batchsize 的正確選擇是爲了在內存效率和內存容量之間尋找最佳平衡。
適當的增加Batchsize 的優點:
1.通過並行化提高內存利用率。
2.單次epoch的迭代次數減少,提高運行速度。(單次epoch=(全部訓練樣本/batchsize) / iteration =1)
3.適當的增加Batch_Size,梯度下降方向準確度增加,訓練震動的幅度減小
訓練集有1000個樣本,batchsize=10,那麼:訓練完1次epoch整個樣本集需要:100次iteration,。

2 圖像讀取和處理

對於賽題數據時圖像數據,賽題任務是識別圖像中的字符。因此首先需要完成對數據的讀取操作,在python中有很多庫可以完成數據讀取的操作,比較常見的有Pillow和OpenCV。

2.1 學習Pillow

Pillow是Python圖像處理函式庫(PIL)的一個分支。Pillow提供了常見的圖像讀取和處理的操作,而且可以與ipython notebook無縫集成,是應用比較廣泛的庫。
學習pillow圖像處理庫:https://pillow.readthedocs.io/en/stable/

2.1.1 類–圖像

python圖像處理庫中定義的最重要的一個類class:Image。創建該類Image的實例方法:1、從文件中加載圖像 2、處理其他圖像 3、從頭開始創建圖像 ; 類創建的稱爲 實例instance/對象object
例如:從文件中加載圖像
使用 Image類中的open()函數:Image.open()

>>> from PIL import Image
>>> im = Image.open("hopper.ppm")
>>> print(im.format, im.size, im.mode)

該format屬性標識圖像的來源。如果未從文件讀取圖像,則將其設置爲“無”。size屬性是一個包含寬度和高度(以像素爲單位)的2 元組。該 mode屬性定義圖像中條帶的數量和名稱,以及像素類型和深度。常見模式是灰度圖像的“ L”(亮度),真彩色圖像的“ RGB”和印前圖像的“ CMYK”
一旦有了Image該類的實例,就可以使用該類定義的方法來處理和操作圖像

# 保存圖片 Image.save()
im.save('outfile','PNG')
# 顯示圖片
#im.show()
# 從圖像複製子矩形
box = (100, 100, 400, 400)
region = im.crop(box)
# 幾何變換
out = im.resize((256, 256))
out.show()
out = im.rotate(45) # degrees counter-clockwise
out.show()
# 過濾器
from PIL import ImageFilter
out = out.filter(ImageFilter.DETAIL)
out.show()

2.2 OpenCV-python庫

OpenCV是一個跨平臺的計算機視覺庫,最早由Intel開源得來。OpenCV發展的非常早,擁有衆多的計算機視覺、數字圖像處理和機器視覺等功能。OpenCV基本上就是兩種版本:OpenCV-python OpenCV-C++
示例:

# 導入cv庫
import cv2 as cv 
img=cv.imread('cat.jpg')
# Opencv默認顏色通道順序是BRG,轉換一下
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 轉換爲灰度圖
#img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 顯示圖像
cv.imshow('gray',img)
# Canny邊緣檢測
edges = cv2.Canny(img, 30, 70)
cv2.imwrite('canny.jpg', edges) # 另保存圖片

官方學習資料:https://opencv.org/ https://docs.opencv.org/master/d9/df8/tutorial_root.html
別人的博客或者網站資料:

3 數據擴增方法

在賽題中我們需要對的圖像進行字符識別,因此需要我們完成的數據的讀取操作,同時也需要完成數據擴增(Data Augmentation)操作。

3.1 數據擴增介紹

在深度學習中數據擴增方法非常重要,數據擴增可以增加訓練集的樣本,同時也可以有效緩解模型過擬合的情況,也可以給模型帶來的更強的泛化能力。
例如:其中一個數據擴增的例子

在深度學習模型的訓練過程中,數據擴增是必不可少的環節。現有深度學習的參數非常多,一般的模型可訓練的參數量基本上都是萬到百萬級別,而訓練集樣本的數量很難有這麼多。

3.2 數據擴增方法

數據擴增方法有很多:從顏色空間、尺度空間到樣本空間,同時根據不同任務數據擴增都有相應的區別。
對於圖像分類,數據擴增一般不會改變標籤;對於物體檢測,數據擴增會改變物體座標位置;對於圖像分割,數據擴增會改變像素標籤。

3.3 常用的數據擴增函數

對於圖像數據常用到的數據擴增方法:圖像顏色、尺寸、形態、空間和像素等角度進行變換。並且不同的數據擴增方法可以自由進行組合,得到更加豐富的數據擴增方法。

3.3.1 以torchvision爲例,常見的數據擴增方法包括:

transforms.CenterCrop 對圖片中心進行裁剪
transforms.ColorJitter 對圖像顏色的對比度、飽和度和零度進行變換
transforms.FiveCrop 對圖像四個角和中心進行裁剪得到五分圖像
transforms.Grayscale 對圖像進行灰度變換
transforms.Pad 使用固定值進行像素填充
transforms.RandomAffine 隨機仿射變換
transforms.RandomCrop 隨機區域裁剪
transforms.RandomHorizontalFlip 隨機水平翻轉
transforms.RandomRotation 隨機旋轉
transforms.RandomVerticalFlip 隨機垂直翻轉
** 但對於本次賽題中,賽題任務是需要對圖像中的字符進行識別,因此對於字符圖片並不能進行翻轉操作。比如字符6經過水平翻轉就變成了字符9,會改變字符原本的含義**

3.4 常用數據擴增庫

torchvision:https://github.com/pytorch/vision pytorch官方提供的數據擴增庫,提供了基本的數據數據擴增方法,可以無縫與torch進行集成;但數據擴增方法種類較少,且速度中等;
imgaug: https://github.com/aleju/imgaug imgaug是常用的第三方數據擴增庫,提供了多樣的數據擴增方法,且組合起來非常方便,速度較快;
albumentations: https://albumentations.readthedocs.io 是常用的第三方數據擴增庫,提供了多樣的數據擴增方法,對圖像分類、語義分割、物體檢測和關鍵點檢測都支持,速度較快。

4 使用pytorch讀取數據

主要是寫 數據批量讀取接口。代碼還是沒有擼懂

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