【问题标题】:How to efficiently load thousands of HD photos into pandas df and convert to HDF?如何高效地将数千张高清照片加载到 pandas df 并转换为 HDF?
【发布时间】:2020-01-10 15:21:07
【问题描述】:

我想将数千张动物图像加载到 pandas df 中,添加特征并可能转换为 HDF。

我使用cv2.imread()尝试了以下方法

import cv2
import os
import numpy as np
import pandas as pd

def images_to_hdf(folder_path, label):
    """
    Save a folder of images to hdf format.
    Args:
        folder_path: Path to folder containing images.
        label: A string of the image content.
    Return:
        None
    """
    image_data = [np.array(cv2.imread(folder_path + img)) for img in os.listdir(folder_path)]
    data = pd.DataFrame()
    data['Images'] = image_data
    data['Label'] = label
    data.to_hdf(path, key)

但是仅读取 100 张图像需要超过 1 分钟的时间加上一个错误(太多的数值无法存储...),我确信这是一种非常低效的方法。

我尝试了np.fromfile() 而不是cv2.imread(),相比之下它的速度超快(我不太确定它的作用),但它返回 rank1 数组,我希望将图像 3 维数据存储在 pd 数据帧中以添加我将用来训练分类器的标签,我认为这可能是一种方法。

【问题讨论】:

  • 你在训练哪个分类器?大多数现代 ML 库(keraspytorch、...)都允许从硬盘读取图像。
  • 我将使用逻辑回归(我正在实现我自己的版本,以便了解我刚开始学习 ML 的工作原理)您有什么建议吗?
  • 如果您开始并使用逻辑回归,也许您应该考虑质量较低的图像,例如 MNIST 或 Fashion-MNIST。
  • 是的,我知道LQ图像方法,我想对动物照片进行分类,我只是想从头开始做东西,让它变得现实,只是为了了解整个过程,请帮助我你可以使用加载图像部分,我会从那里开始。

标签: python python-3.x pandas numpy image-processing


【解决方案1】:

h5py 的帮助下,您可以直接将图像和标签保存到 hdf5 文件中(无需使用 pandas)。这是一个如何做到这一点的例子(改编自here):

import os
import glob
import cv2
import h5py
import numpy as np

def images_to_hdf5(images_path='/path/to/images',
                   label=0,
                   hdf5_path='/path/to/hdf5_file/file.hdf5'):

    image_names = glob.glob(os.path.join(images_path, '*.jpg'))
    n = len(image_names)
    labels = [label]*n

    hdf5_file = h5py.File(hdf5_path, mode='w')
    hdf5_file.create_dataset("Images", (n, 3, 224, 224), np.int8)
    hdf5_file.create_dataset("Labels", (n,), np.int8)
    hdf5_file["Labels"][...] = labels

    for i, image_name in enumerate(image_names):
        img = cv2.imread(image_name)        
        img = cv2.resize(img, (224, 224))  # shape (224, 224, 3)
        img = np.rollaxis(img, 2)[None]  # shape (1, 3, 224, 224)
        hdf5_file["Images"][i, ...] = img

    hdf5_file.close()

打开它:

hdf5_file = h5py.File(hdf5_path, "r")

访问例如第一张图片和标签:

hdf5_file["Images"][0]
hdf5_file["Labels"][0]
#hdf5_file.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2016-10-18
    • 2011-04-12
    相关资源
    最近更新 更多