首页 > 解决方案 > 为 Keras 分类任务从 json 注释文件加载自定义数据集

问题描述

我是深度学习的新手,想使用 Keras 实现一个简单的分类任务。我的数据集包含超过 2000 张图像,对于每张图像,我都有一个相应的 json 文件,其中包含该图像的标签。以下是加载 json 文件并创建 X(图像)和 Y(标签)数组的代码:

X = []
Y = []
with concurrent.futures.ProcessPoolExecutor() as executor:
    # Get a list of files to process
    str = jsonpath + '/*.json'
    #print(str)
    json_files = glob.glob(str)
    for jsonfile,y in zip(json_files, executor.map(create_array, json_files)):
        X.append(y[0])
        Y.append(y[1])

其中函数 create_array 定义如下:

def create_array(jsonfile):
    array_list = []
    y_list = []
    with open(jsonfile) as f:
            data = json.load(f)
            name = data['annotation']['data_filename']
            img = cv2.imread(imgDIR + '/' + name) 
            array_list.append(img)      
            l = data['annotation']['data_annotation']['classification'][0]['classification_label']
            y_list.append(l)
return array_list, y_list

它适用于少量图像,例如 15,但对于整个 2000 张图像集,程序会自动终止,或者有时会给出错误“MemoryError:内存不足”。有没有一种有效的方法来做到这一点?如何加快此数据预处理部分以将其作为 keras 分类模型的输入?

标签: pythonjsonkeras

解决方案


看起来您的图像已经准备好进行训练,而您的预处理只是加载文件。在加载数据时,json 格式可能不是最快的方法。如果您使用诸如泡菜之类的东西来保存和加载图像,您可能会体验到速度提升。

另一个问题是如何有效地将数据传递给 keras。通常你会使用model.fit,但由于并非所有数据都适合你的记忆,你可以使用model.fit_generator Ther keras doc给我们以下提示:

为了提高效率,生成器与模型并行运行。例如,这允许您在 CPU 上对图像进行实时数据增强,同时在 GPU 上训练您的模型。

使用 keras.utils.Sequence 保证了排序,并保证在使用 use_multiprocessing=True 时每个 epoch 的每个输入的单一使用。

是一个如何实现这种生成器的示例。


推荐阅读