目錄
第三方庫安裝
- albumentations 用於數據增強的庫 官方文檔地址
安裝:
如果是conda
conda install -c conda-forge imgaug
conda install -c conda-forge albumentations
如果是pip
pip install -U albumentations
數據集下載
因為跑模型需要的數據量很大,自己去做數據集比較費時。我在Kaggle里看到了有人把數據集進行共享,大概有20G的數據。Kaggle鏈接
但是下載需要操作一番,我本來想下載然后上傳百度雲之類的,聯系了作者說明了意圖,他也沒回我,所以等他回我的時候我再補百度雲的鏈接吧,這之前還是需要去Kaggle官網下載
數據集的查看
文件下包含多個npy文件
對於每一個npy文件,我們可以用numpy進行加載查看. 以upgraded-balanced-data-v3-1.npy為例
import numpy as np
npy_path = "你的保存數據集的文件/upgraded-balanced-data-v3-1.npy"
nd_arrays = np.load(npy_path, allow_pickle=True)
print(nd_arrays.shape)
輸出如下:(135, 2) # 有135行,2列數據
以打開第一行為例
line = nd_arrays[0,:] # 讀取第一行的數據集
line_a, line_b = line[0], line[1] # 第一行的第一個數據,第一行的第二個數據
print(line_a.shape)
print(line_b)
輸出如下:(270, 480, 3) [1, 0, 0, 0, 0, 0, 0, 0, 0] #說明對於每一行數據,0號索引元素是rgb的圖片,1號索引是一個獨熱碼(可以暫時不管)
顯示圖片
#PIL
img = Image.fromarray(line_a)
#RGB
img.show()
結果如下:

至此,我們了解了數據形式,我以偽碼進行解釋
for npy 在所有的npy文件:
for line 在該npy的行:
x = line[0] #即上方的圖片
y = line[1] #即上方的獨熱碼
再單獨解釋下為什么有獨熱碼
-
以貓狗分類為例
1.我們有一張狗的圖片(稱為X),還有這張圖片對應的標簽:狗(稱為Y)
2.我們需要讓模型學習:見到一張狗的圖片——>反應出來這是狗 -
以該項目為列
1.我們有一張當前駕駛的圖片(稱為X),還有這張圖片對應的標簽:前進后退等等(稱為Y)
2.當然:現實世界的駕駛行為很復雜,在該項目中,我們只用9個駕駛行為(前進,后退,左轉,右轉等等),這里每一個駕駛行為對應一個獨熱碼
DataSet的編寫
# 解析獨熱碼
encode_dice = {"[0, 0, 0, 0, 0, 0, 0, 0, 1]": 0,
"[0, 0, 0, 0, 0, 0, 0, 1, 0]": 1,
"[0, 0, 0, 0, 0, 0, 1, 0, 0]": 2,
"[0, 0, 0, 0, 0, 1, 0, 0, 0]": 3,
"[0, 0, 0, 0, 1, 0, 0, 0, 0]": 4,
"[0, 0, 0, 1, 0, 0, 0, 0, 0]": 5,
"[0, 0, 1, 0, 0, 0, 0, 0, 0]": 6,
"[0, 1, 0, 0, 0, 0, 0, 0, 0]": 7,
"[1, 0, 0, 0, 0, 0, 0, 0, 0]": 8}
# 上一小節定義的conf類
cf = config()
# 實現效果,返回單個npy文件的數據
class MyDataSet(Dataset):
def __init__(self, npy_file, transform=None, base_path=cf.BASE_PATH, is_train=True):
# 如果transform為none
if transform is None:
transform = A.Compose([ToTensorV2()]) # 使用albumentations庫進行數據增強
self.Base_Path = base_path # 保存npy文件的根目錄
self.transform = transform
self.arrays = np.load(npy_file, allow_pickle=True) #進行加載數據
def __len__(self):
return self.arrays.shape[0]
def __getitem__(self, index):
# 要獲取index的圖像
need_image = self.arrays[index, 0]
# 要獲取index的y
need_target = self.arrays[index, 1]
# 用 albumentations 進行數據增強,會把通道放到前面
need_image = self.transform(image=need_image)['image']
# target變成tensor
need_target = encode_dice.get(str(need_target)) #根據獨熱碼對按鍵解析
need_target = torch.tensor(need_target)
datas = [need_image, need_target] # data的0號元素是駕駛圖片,1號元素是駕駛行為
return datas
loader的編寫
def Loaders(npy_file, is_train):
batch_size = 64 # 一次取多少數據集
# compose 指 對中括號中的進行pipeline處理
train_transforms = A.Compose(
[
A.Resize(height=cf.HEIGHT, width=cf.HEIGHT),
A.Normalize(),
ToTensorV2(),
],
)
test_transforms = train_transforms
if is_train:
train_dataset = MyDataSet(npy_file=npy_file, transform=train_transforms, base_path=cf.BASE_PATH, is_train=True)
loader = DataLoader(train_dataset,
shuffle=False,
batch_size=batch_size,
num_workers=1,
sampler=None
)
else:
test_dataset = MyDataSet(npy_file=npy_file, transform=test_transforms, base_path=cf.BASE_PATH, is_train=False)
loader = DataLoader(test_dataset,
shuffle=False,
batch_size=batch_size,
num_workers=1
)
return loader
測試dataset是否可用
mydata = MyDataSet(npy_file='../input/gta-v-self-driving-car/final/final/upgraded-balanced-data-v3-1.npy', is_train=False)
print(mydata)
one_data = mydata[0]
x = one_data[0]
y = one_data[1]
print(x.shape)
print(y)
基於所有npy文件進行划分數據集
from sklearn.model_selection import train_test_split
import random
def split_train_and_test_npy():
npy_list = os.listdir(cf.BASE_PATH+'data/')
random.shuffle(npy_list)
X_train, X_test= train_test_split(npy_list, test_size=cf.train_test_rate,
random_state=int(time.time()))
X_train = [os.path.join(cf.BASE_PATH, 'data', i) for i in X_train]
X_test = [os.path.join(cf.BASE_PATH, 'data', i) for i in X_test]
print("train size:", len(X_train))
print("test size:", len(X_test))
return X_train, X_test
