将包含 jpeg 图像的文件夹转换为 hdf5

Convert a folder comprising jpeg images to hdf5

有没有办法在 Python 中将包含 .jpeg 图像的文件夹转换为 hdf5?我正在尝试建立一个用于图像分类的神经网络模型。谢谢!

您可以通过在 Python 中使用 HDFql 执行以下操作来解决您的问题(HDFql 还支持 C、C++、Java、C#、R 和 Fortran):

import HDFql

cursor = HDFql.Cursor()

folder = "/home/dummy/images/"

HDFql.execute("create and use file images.h5")

HDFql.execute("show file \"%s\"" % folder)

while HDFql.cursor_next() == HDFql.SUCCESS:

    file = HDFql.cursor_get_char()

    print("File found: \"%s\"" % file)

    HDFql.cursor_use(cursor)

    HDFql.execute("show file size \"%s%s\"" % (folder, file))

    HDFql.cursor_next()

    size = HDFql.cursor_get_bigint()

    HDFql.cursor_use_default()

    HDFql.execute("create dataset \"%s\" as opaque(%d) values from binary file \"%s%s\"" % (file, size, (folder, file)))

HDFql.execute("close file")

有关其他信息,请查看说明 HDFql 功能的 reference manual and examples

处理和保存图像数据的方法有很多种。以下是读取 1 个文件夹中的所有图像文件并加载到 HDF5 文件中的方法的 2 种变体。这个过程的概要:

  1. 计算图像的数量(用于调整数据集的大小)。
  2. 创建 HDF5 文件(前缀:1ds_
  3. 创建具有适当形状和类型(整数)的空数据集
  4. 使用glob.iglob()循环图像。然后做:
    • 阅读cv2.imread()
    • 使用 cv2.resize()
    • 调整大小
    • 复制到数据集img_ds[cnt:cnt+1:,:,:]

这是一种方法。需要考虑的其他事项:

  1. 我加载了 1 个数据集中的所有图像。如果您有不同尺寸的图像,则必须调整图像的大小。如果您不想调整大小,则需要将每个图像保存在不同的数据集中(相同的过程,但在循环内创建一个新的数据集)。查看第二个 with/as: 和将数据保存到第二个 HDF5 的循环(前缀:nds_
  2. 我没有尝试捕获图像名称。您可以使用 1 个数据集上的属性或多个数据集的数据集名称来执行此操作。
  3. 我的图片是.ppm个文件,所以你需要修改glob函数来 使用 *.jpg.

以下更简单的版本(2021 年 3 月 16 日添加):
假设所有文件都在当前文件夹中,并将所有调整大小的图像加载到一个数据集(名为 'images')。请参阅前面的代码了解第二种方法,即在不调整大小的情况下将每个图像加载到单独的数据集中。

import sys
import glob
import h5py
import cv2

IMG_WIDTH = 30
IMG_HEIGHT = 30

h5file = 'import_images.h5'

nfiles = len(glob.glob('./*.ppm'))
print(f'count of image files nfiles={nfiles}')

# resize all images and load into a single dataset
with h5py.File(h5file,'w') as  h5f:
    img_ds = h5f.create_dataset('images',shape=(nfiles, IMG_WIDTH, IMG_HEIGHT,3), dtype=int)
    for cnt, ifile in enumerate(glob.iglob('./*.ppm')) :
        img = cv2.imread(ifile, cv2.IMREAD_COLOR)
        # or use cv2.IMREAD_GRAYSCALE, cv2.IMREAD_UNCHANGED
        img_resize = cv2.resize( img, (IMG_WIDTH, IMG_HEIGHT) )
        img_ds[cnt:cnt+1:,:,:] = img_resize

下面的先前代码(自 2021 年 3 月 15 日起):

import sys
import glob
import h5py
import cv2

IMG_WIDTH = 30
IMG_HEIGHT = 30

# Check command-line arguments
if len(sys.argv) != 3:
    sys.exit("Usage: python load_images_to_hdf5.py data_directory model.h5")

print ('data_dir =', sys.argv[1])
data_dir = sys.argv[1]
print ('Save model to:', sys.argv[2])
h5file = sys.argv[2]

nfiles = len(glob.glob(data_dir + '/*.ppm'))
print(f'Reading dir: {data_dir}; nfiles={nfiles}')

# resize all images and load into a single dataset
with h5py.File('1ds_'+h5file,'w') as  h5f:
    img_ds = h5f.create_dataset('images',shape=(nfiles, IMG_WIDTH, IMG_HEIGHT,3), dtype=int)
    for cnt, ifile in enumerate(glob.iglob(data_dir + '/*.ppm')) :
        img = cv2.imread(ifile, cv2.IMREAD_COLOR)
        # or use cv2.IMREAD_GRAYSCALE, cv2.IMREAD_UNCHANGED
        img_resize = cv2.resize( img, (IMG_WIDTH, IMG_HEIGHT) )
        img_ds[cnt:cnt+1:,:,:] = img_resize

# load each image into a separate dataset (image NOT resized)    
with h5py.File('nds_'+h5file,'w') as  h5f:
    for cnt, ifile in enumerate(glob.iglob(data_dir + '/*.ppm')) :
        img = cv2.imread(ifile, cv2.IMREAD_COLOR)
        # or use cv2.IMREAD_GRAYSCALE, cv2.IMREAD_UNCHANGED
        img_ds = h5f.create_dataset('images_'+f'{cnt+1:03}', data=img)