如何在存储为HDF5后获取原始图像?

时间:2018-05-14 12:54:31

标签: keras hdf5 cv2

我在大型数据集(> 50k图像)上使用Keras fit_generator训练CNN。我使用cv2读取图像,进行一些预处理(旋转,调整大小)并写入HDF5文件(在this教程之后)。我的问题是在写入HDF5之前,从HDF5读取的图像看起来与原始预处理图像不同。保存HDF5文件的代码 -

import numpy as np
import cv2
import imutils
import os
import random
import h5py

all_imgs = os.listdir(r"D:\test_images/")
img_rows, img_cols = 128, 128

hdf5_path = r'D:\test_images\test.hdf5'

train_shape = (len(all_imgs),3 , img_rows, img_cols)

hdf5_file = h5py.File(hdf5_path, mode='w')
hdf5_file.create_dataset("train_img", train_shape, np.int8)
hdf5_file.create_dataset("train_mean", train_shape[1:], np.float32)

mean = np.zeros(train_shape[1:], np.float32)
for i in range(len(all_imgs)):
    img = cv2.imread(r"D:\test_images/"+all_imgs[i])
    img = imutils.rotate(img,90)
    img = cv2.resize(img,(128,128))
    if i == 0:
        cv2.imwrite(r"D:\test_images/test_before.jpg",img)

    img = np.rollaxis(img, 2) #My CNN takes input with channel first

    hdf5_file["train_img"][i, ...] = img[None]
    mean += img / float(len(all_imgs))

hdf5_file["train_mean"][...] = mean
hdf5_file.close()

从HDF5文件中读取的代码 -

hdf5_path = r'D:\test_images\test.hdf5'

hdf5_file = h5py.File(hdf5_path, "r")
images = hdf5_file["train_img"][0:1, ...]
images = images.astype('float32')
# images /= 255
images = np.moveaxis(images, 1, -1)
cv2.imwrite(r"D:\test_images/test_after.jpg",images[0])
hdf5_file.close()

原始图像,写入HDF5前的图像和从HDF5读取的图像 - Original Image Preprocessed image before writing to HDF5 Image after reading from HDF5

在预测期间,如果我传递从cv2读取的图像,则表示没有给出正确的结果。但是,将图像保存为HDF5并传递从此HDF5文件读取的图像可以提供正确的输出。如何在保存HDF5或预测期间处理此问题?

1 个答案:

答案 0 :(得分:0)

我在代码和解决方案中找到了问题,并得到this SO的回答。在HDF5中创建数据集时,我将数据类型定义为np.int8(字节(-128到127))

hdf5_file.create_dataset("train_img", train_shape, np.int8)

将其更改为np.uint8(无符号整数(0到255))更正了结果

hdf5_file.create_dataset("train_img", train_shape, np.uint8)