【问题标题】:Loading a custom dataset from json annotations files for Keras classification task为 Keras 分类任务从 json 注释文件加载自定义数据集
【发布时间】:2019-02-21 01:09:23
【问题描述】:

我是深度学习的新手,想使用 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 分类模型的输入?

【问题讨论】:

    标签: python json keras


    【解决方案1】:

    您的图像似乎已经为训练做好了充分准备,而您的预处理只是加载文件。在加载数据时,json 格式可能不是最快的方法。如果您使用 pickle 之类的东西来保存和加载图像,您可能会体验到速度提升。

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

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

    keras.utils.Sequence 的使用保证了排序和保证 使用时每个 epoch 的每个输入的单次使用 use_multiprocessing=True。

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

    【讨论】:

    • 感谢您的回复。问题是创建包含图像的 X 数组,我必须使用 json 文件将每个图像单独加载到 X 数组中,我认为这会占用我大部分的内存。但是我别无选择,只能从单个 json 文件中解码图像标签,并且在加载数据集时无法使用 keras 中的 flow_from_directory 函数。即使我在 6 核机器上使用 ProcessPoolExecutor,但 2055 个图像的内存不足。有什么解决办法吗?
    • 如果您的内存不足,则 PoolExecutor 的数量无关紧要。这只是意味着您的图像太大而无法同时加载。正如您所说, flow_from_directory 可能是最好的解决方案。你为什么不一张一张地加载你的图片,然后将它们保存为 flow_from_directory 的新兼容格式?
    • 好的,你能提到我可以使用的 flow_from_directory 的任何兼容格式吗?我真的迷路了。另外,我想知道如果我的图像太大而无法同时加载,那么 Keras flow_from_directory 如何优雅地处理它?
    • keras.io/preprocessing/image 我认为 keras 文档解释得很好,基本上每个典型的图像格式都支持。 Keras 会及时加载它们。因此,对于每个训练步骤,图像都会单独加载,然后在该步骤后立即丢弃。因此,您在内存中将只有与您的 batch_size 一样多的图像。 Keras 将并行执行此操作,这样您的模型就不必为图像等待太久。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多