Open idekazuki opened 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" ........ 出力ファイルはこんな感じになる。
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)
細かいエラーが出たのでその都度修正。
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数が表示される
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の並列化に挑戦する
今日の進捗 1.gulp/rgbtrain/data*.gulpのdatafileを読み込ませるときに同じディレクトリにクラスのラベル情報を含んだlabel2idx.jsonが必要であるというエラーが出た。