CNN(Pytorch版)實現GTA5的自動駕駛——第三節(數據集的及dataloader的實現)


第三方庫安裝

如果是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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM