街景字元編碼識別 task2 資料讀取與資料擴增

2021-10-06 10:13:42 字數 1593 閱讀 1526

關於資料讀取部分介紹了兩個python庫,pillow和opencv。和之前的matlab,c++裡的資料讀取方法類似,簡單略過了。

資料擴增是之前沒有接觸過的,其主要目的是增加訓練集樣本,可以使模型具有更強的泛化能力。

資料擴增方法有很多:從顏色空間、尺度空間到樣本空間,同時根據不同任務資料擴增都有相應的區別。應該根據具體的任務對資料擴增的方法進行選擇,不要選一些和當前任務不相關的擴增方法,或者不適合當前任務的方法,比如本次的字元識別任務如果進行翻轉擴增就會使字元的識別結果發生改變,顯然是不合理的。

對於影象分類,資料擴增一般不會改變標籤;對於物體檢測,資料擴增會改變物體座標位置;對於影象分割,資料擴增會改變畫素標籤。所以根據具體的任務,資料擴增之後也要對標籤進行相應的處理。

常用的資料擴增庫:

torchvision

pytorch官方提供的資料擴增庫,提供了基本的資料資料擴增方法,可以無縫與torch進行整合;但資料擴增方法種類較少,且速度中等;

imgaug

imgaug是常用的第三方資料擴增庫,提供了多樣的資料擴增方法,且組合起來非常方便,速度較快;

albumentations

是常用的第三方資料擴增庫,提供了多樣的資料擴增方法,對影象分類、語義分割、物體檢測和關鍵點檢測都支援,速度較快。

baseline的**裡有乙個svhndataset類,它通過繼承torch.utils.data.dataset 來對資料進行封裝。**與說明如下:

class svhndataset(dataset):

# __init__函式類似c++中的建構函式,當例項化類物件的時候,自動呼叫該函式。不過用法比c++簡單多了。

def __init__(self, img_path, img_label, transform=none):

self.img_path = img_path

self.img_label = img_label

# 這裡用self.transform = transform是不就可以了,不過沒有進行實際驗證。

if transform is not none:

self.transform = transform

else:

self.transform = none

def __getitem__(self, index):

# pil讀取資料數rgb形式,這裡為什麼還要convert?

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)

街景字元識別 Task2 資料讀取與資料擴增(2)

資料擴增再增加了訓練集樣本的同時,也可以有效地緩解過擬合的情況,使模型具有更強的泛化能力。資料擴增的方法有很多,從顏色空間 尺度空間到樣本空間,根據不同任務,資料擴增都有區別。對於影象分類,資料擴增一般不會改變標籤 對於物體檢測,資料擴增會改變物體座標位置 對於影象分割,資料擴增會改變畫素標籤。方法...

街景字元編碼識別 Task05 模型整合

學習目標 模型整合 整合學習 ensemble learning 通過構建並結合多個弱學習器來綜合得到乙個強學習器的方法。機器學習領域的整合方法有bagging boosting stacking。bagging bootstrap aggregating,裝袋 bagging使用裝袋取樣來獲取資料...

街景字元編碼識別 Task5 模型整合

在機器學習中的整合學習可以在一定程度上提高 精度,常見的整合學習方法有stacking bagging和boosting,同時這些整合學習方法與具體驗證集劃分聯絡緊密。由於深度學習模型一般需要較長的訓練週期,如果硬體裝置不允許建議選取留出法,如果需要追求精度可以使用交叉驗證的方法。下面假設構建了10...