自己创建一个数据集时报错
【操作步骤&问题现象】
我想要创建一个做超分辨率的数据集,这个数据集有两列,data和target,data为低分辨率图像,target为高分辨率图像。我的想法是先创建一个data和target图像一样的数据集,然后再对data中的图像进行缩小,但在创建数据集过程中报错
我的代码
from os import listdir
from os.path import join
import os
from PIL import Image
import random
import numpy as np
import mindspore.dataset as ds
import mindspore.dataset.vision.py_transforms as py_vision
import mindspore.dataset.transforms.py_transforms as py_transforms
def is_image_file(filename):
return any(filename.endswith(extension) for extension in ['.png', '.jpg', '.jpeg', '.PNG', '.JPG', '.JPEG'])
def make_dataset(dir_path, max_dataset_size=float("inf")):
"""Return image list in dir."""
images = []
assert os.path.isdir(dir_path), '%s is not a valid directory' % dir_path
for root, _, fnames in sorted(os.walk(dir_path)):
for fname in fnames:
if is_image_file(fname):
path = os.path.join(root, fname)
images.append(path)
return images[:min(max_dataset_size, len(images))]
class MakeDataset:
def __init__(self, dataset_dir, max_dataset_size=float("inf")):
self.dir_A = os.path.join(dataset_dir,'data')
self.dir_B = os.path.join(dataset_dir,'target')
self.A_paths = sorted(make_dataset(self.dir_A, max_dataset_size))
self.B_paths = sorted(make_dataset(self.dir_B, max_dataset_size))
self.A_size = len(self.A_paths)
self.B_size = len(self.B_paths)
def __getitem__(self, index):
A_path = self.A_paths[index % self.A_size]
B_path = self.B_paths[index % self.B_size]
A_img = np.array(Image.open(A_path).convert('RGB'))
B_img = np.array(Image.open(B_path).convert('RGB'))
print(A_img.shape)
print(B_img.shape)
return A_img,B_img
def __len__(self):
return self.A_size
dataset=MakeDataset(dataset_dir="/data/xjtu/wys/image/")
DS=ds.GeneratorDataset(dataset,column_names=["LR,HR"])
for data in DS.create_dict_iterator():
print(data["LR"].shape)
报错信息
Traceback (most recent call last): File "/data/xjtu/wys/SRGAN/dataset.py", line 49, infor data in DS.create_dict_iterator(): File "/root/archiconda3/envs/xjtu/lib/python3.7/site-packages/mindspore/dataset/engine/iterators.py", line 263, in __next__ data = self.get_next() File "/root/archiconda3/envs/xjtu/lib/python3.7/site-packages/mindspore/dataset/engine/iterators.py", line 344, in get_next return {k: Tensor(v.as_array()) for k, v in self.depipeline.GetNextAsMap().items()} RuntimeError: Thread ID 281472224702944 Exception thrown from PyFunc. Invalid parameter, Generator should return same number of numpy arrays as specified in column names. Line of code : 122 File : /home/jenkins/agent-working-dir/workspace/Compile_Ascend_ARM_EulerOS/mindspore/mindspore/ccsrc/minddata/dataset/engine/datasetops/source/generator_op.cc
-
报错 Generator should return same number of numpy arrays as specified in column names.,描述的意思是返回的字段与指定列名个数不符。
-
我看代码里:class MakeDataset: -> def __getitem__(self, index): -> return A_img,B_img 返回的是两个字段。
-
但是 DS=ds.GeneratorDataset(dataset,column_names=["LR,HR"]) 中定义的column_names需要修改为 column_names=["LR", "HR"],表示为两个字段。



