idekazuki / diary

記録
0 stars 1 forks source link

9/12 epicの gulpIO を使用したdataloader作成 #54

Open idekazuki opened 5 years ago

idekazuki commented 5 years ago

今日の進捗 1.gulp/rgbtrain/data*.gulpのdatafileを読み込ませるときに同じディレクトリにクラスのラベル情報を含んだlabel2idx.jsonが必要であるというエラーが出た。

idekazuki commented 5 years ago

2.これを自作するために以下のmake_label.pyを作成。(今回は動詞だけ)

import csv
import json
import collections as cl

with open('../../epic/data/raw/EPIC_verb_classes.csv', 'r') as f:#この階層にラベル情報のcsvがあった。
    reader = csv.reader(f)
    verb_list = [v for v in reader]

verb_json = cl.OrderedDict()
for verb in verb_list[1:]:
    verb_json[verb[0]] = verb[1]

with open('./verb_class.json', 'w') as f:
    json.dump(verb_json, f)

0:"take" 1:"put" 2:"open" 3:"close" 4:"wash" 5:"cut" 6:"mix" 7:"pour" 8:"throw" 9:"move" 10:"remove" 11:"dry" ........ 出力ファイルはこんな感じになる。

idekazuki commented 5 years ago

3.作成したラベルデータのjsonfileをディレクトリに格納しようとしたが、研究室内のSSDには変更権限を持っていないので、ライブラリのラベル参照パスを変更することにした。ラベルデータを読み込んでいるのはgulpIO/dataset.pyだった。現在gitに落ちているのと研究室でpipで落として使用しているものは仕様が異なっていた。 pip show gulpio で直接参照ライブラリのパスを調べて中身を確認。from gulpio.dataset import GulpImageDataset のラベル参照パスのみを変更した。

# define dataset wrapper and pick this up by the data loader interface.
class GulpIOEmptyFolder(Exception):  # pragma: no cover dataset.pyにこれが見つからないというエラーが出たので(記述してあるのに)ここで再定義
    pass
class GulpImageDataset_epic(GulpImageDataset):
    def __init__(self, data_path, is_val=False, transform=None,
                 target_transform=None):
        r"""Simple image data loader for GulpIO format.

            Args:
                data_path (str): path to GulpIO dataset folder
                label_path (str): path to GulpIO label dictionary matching
            label ids to label names
                is_va (bool): sets the necessary augmention procedure.
                transform (object): set of augmentation steps defined by
            Compose(). Default is None.
                target_transform (func): performs preprocessing on labels if
            defined. Default is None.
        """

        self.gd = GulpDirectory(data_path)
        self.items = list(self.gd.merged_meta_dict.items())
        self.label2idx = json.load(open('verb_class.json'))
        self.num_chunks = self.gd.num_chunks

        if self.num_chunks == 0:
            raise(GulpIOEmptyFolder("Found 0 data binaries in subfolders " +
                                    "of: ".format(data_path)))

        print(" > Found {} chunks".format(self.num_chunks))
        self.data_path = data_path
        self.classes = self.label2idx.keys()
        self.transform = transform
        self.target_transform = target_transform
        self.is_val = is_val

    def __getitem__(self, index):
        """
        With the given video index, it fetches frames. This functions is called
        by Pytorch DataLoader threads. Each Dataloader thread loads a single
        batch by calling this function per instance.
        """
        item_id, item_info = self.items[index]

        target_name = item_info['meta_data'][0]['verb_class']#keyが違うとエラー出たのでepic用にkey変更
        target_idx = self.label2idx[str(target_name)]#keyが見つからずstrに変更したら治った。
        img_rec = item_info['frame_info']
        #assert len(img_rec) == 1#よくわからなかったから無視
        # set number of necessary frames
        img, meta = self.gd[item_id]
        img = img[0]
        # augmentation
        if self.transform:
            img = self.transform(img)
        return (img, target_idx)

細かいエラーが出たのでその都度修正。

idekazuki commented 5 years ago

4.修正したライブラリで以下のようにdataloader作成

dataset = GulpImageDataset_epic('../../epic/data/processed/gulp/rgb_train/', transform=transforms)
loader = DataLoader(dataset, batch_size=256, shuffle=True, num_workers=0, drop_last=True)

Found 285 chunks 出力としてchunk数が表示される

idekazuki commented 5 years ago

5.読み込んで使ってみるがエラー

for data, label in loader:
    pass
    # train your model here
    # ...

RecursionError: maximum recursion depth exceeded in comparison

再帰の上限を超えてしまったらしい。

import sys
sys.setrecursionlimit(10000)

上限を研究室設定default3000から10000に変更したがだめだった。 明日はdataloaderの並列化に挑戦する