Как получить оригинальное изображение после сохранения в формате HDF5? - PullRequest
0 голосов
/ 14 мая 2018

Я тренирую CNN, используя Keras fit_generator для большого набора данных (> 50 тыс. Изображений).Я читаю изображения, используя cv2, делаю некоторую предварительную обработку (вращаю, изменяю размер) и записываю в файл HDF5 (следуя этому учебнику).Моя проблема в том, что изображение, считанное из 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 голосов
/ 15 мая 2018

Я нашел проблему в своем коде и решении с помощью этого ТАКОГО ответа. При создании набора данных в 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)
...