ImageClassifierData.from_csv(), ошибка: нет такого файла или каталога
Я пытаюсь использовать ImageClassifierData.from_csv()
на пользовательский набор данных.
Набор данных содержит фрейм данных (train.csv), который содержит столбец с именами файлов и zip-папку с изображениями. Изображения в группах по 4, каждое изображение в группе отображает одно и то же изображение 4 различными способами, которые создают изображение при объединении вместе. По какой-то причине имена файлов в df не были извлечены с полным именем файла из изображений.
Например,
df["col1"] = ["0Image1","1Image1","2Image1","3Image1"]
image_file_names = ["0Image1_type1.png","1Image1_type2.png","2Image1_type3.png","3Image1_type4.png"]
Это следующий код fast.ai для получения данных:
PATH = "../filepath/"
f_model = resnet34
label_csv = f'{PATH}train.csv'
n = len(list(open(label_csv)))-1
val_idxs = get_cv_idxs(n)
def get_data(sz):
tfms = tfms_from_model(f_model,sz,aug_tfms=transforms_top_down,max_zoom=1.05)
return ImageClassifierData.from_csv(PATH,'train.zip',label_csv,tfms=tfms,suffix='.png',val_idxs=val_idxs,test_name="test")
data = get_data(299)
x,y = next(iter(data.val_dl))
Как только я бегу next(iter(data.val_dl))
Я получаю следующую ошибку:
/opt/conda/lib/python3.6/site-packages/fastai/dataloader.py in __iter__(self)
86 # avoid py3.6 issue where queue is infinite and can result in memory exhaustion
87 for c in chunk_iter(iter(self.batch_sampler), self.num_workers*10):
---> 88 for batch in e.map(self.get_batch, c):
89 yield get_tensor(batch, self.pin_memory, self.half)
90
/opt/conda/lib/python3.6/concurrent/futures/_base.py in result_iterator()
584 # Careful not to keep a reference to the popped future
585 if timeout is None:
--> 586 yield fs.pop().result()
587 else:
588 yield fs.pop().result(end_time - time.time())
/opt/conda/lib/python3.6/concurrent/futures/_base.py in result(self, timeout)
423 raise CancelledError()
424 elif self._state == FINISHED:
--> 425 return self.__get_result()
426
427 self._condition.wait(timeout)
/opt/conda/lib/python3.6/concurrent/futures/_base.py in __get_result(self)
382 def __get_result(self):
383 if self._exception:
--> 384 raise self._exception
385 else:
386 return self._result
/opt/conda/lib/python3.6/concurrent/futures/thread.py in run(self)
54
55 try:
---> 56 result = self.fn(*self.args, **self.kwargs)
57 except BaseException as exc:
58 self.future.set_exception(exc)
/opt/conda/lib/python3.6/site-packages/fastai/dataloader.py in get_batch(self, indices)
73
74 def get_batch(self, indices):
---> 75 res = self.np_collate([self.dataset[i] for i in indices])
76 if self.transpose: res[0] = res[0].T
77 if self.transpose_y: res[1] = res[1].T
/opt/conda/lib/python3.6/site-packages/fastai/dataloader.py in <listcomp>(.0)
73
74 def get_batch(self, indices):
---> 75 res = self.np_collate([self.dataset[i] for i in indices])
76 if self.transpose: res[0] = res[0].T
77 if self.transpose_y: res[1] = res[1].T
/opt/conda/lib/python3.6/site-packages/fastai/dataset.py in __getitem__(self, idx)
165 xs,ys = zip(*[self.get1item(i) for i in range(*idx.indices(self.n))])
166 return np.stack(xs),ys
--> 167 return self.get1item(idx)
168
169 def __len__(self): return self.n
/opt/conda/lib/python3.6/site-packages/fastai/dataset.py in get1item(self, idx)
158
159 def get1item(self, idx):
--> 160 x,y = self.get_x(idx),self.get_y(idx)
161 return self.get(self.transform, x, y)
162
/opt/conda/lib/python3.6/site-packages/fastai/dataset.py in get_x(self, i)
237 super().__init__(transform)
238 def get_sz(self): return self.transform.sz
--> 239 def get_x(self, i): return open_image(os.path.join(self.path, self.fnames[i]))
240 def get_n(self): return len(self.fnames)
241
/opt/conda/lib/python3.6/site-packages/fastai/dataset.py in open_image(fn)
218 flags = cv2.IMREAD_UNCHANGED+cv2.IMREAD_ANYDEPTH+cv2.IMREAD_ANYCOLOR
219 if not os.path.exists(fn):
--> 220 raise OSError('No such file or directory: {}'.format(fn))
221 elif os.path.isdir(fn):
222 raise OSError('Is a directory: {}'.format(fn))
OSError: No such file or directory: ../filepath/train.zip/0Image1.png
Мне кажется, что ImageDataClassifier использует имена файлов из файла CSV, чтобы найти файл изображения, но имена не совпадают. Какой самый эффективный способ решения этой проблемы?
PS Мне нужно сохранить текущие имена файлов в столбце данных для последующей отправки.