我在大型数据集(> 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读取的图像 -
在预测期间,如果我传递从cv2读取的图像,则表示没有给出正确的结果。但是,将图像保存为HDF5并传递从此HDF5文件读取的图像可以提供正确的输出。如何在保存HDF5或预测期间处理此问题?
答案 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)