Keras:单个图像的model.predict

Gra*_*ick 10 deep-learning keras

我想用Keras预测单个图像.我训练了我的模型,所以我只是加载重量.

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
import numpy as np
import cv2

# dimensions of our images.
img_width, img_height = 150, 150



def create_model():
  if K.image_data_format() == 'channels_first':
    input_shape = (3, img_width, img_height)
  else:
    input_shape = (img_width, img_height, 3)

  model = Sequential()
  model.add(Conv2D(32, (3, 3), input_shape=input_shape))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))

  model.add(Conv2D(32, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))

  model.add(Conv2D(64, (3, 3)))
  model.add(Activation('relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))

  model.add(Flatten())
  model.add(Dense(64))
  model.add(Activation('relu'))
  model.add(Dropout(0.5))
  model.add(Dense(1))
  model.add(Activation('sigmoid'))

  return model


img = cv2.imread('./test1/1.jpg')
model = create_model()
model.load_weights('./weight.h5')
model.predict(img)
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方式加载图像:

img = cv2.imread('./test1/1.jpg')
Run Code Online (Sandbox Code Playgroud)

并使用模型的预测函数:

 model.predict(img)
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (499, 381, 3)
Run Code Online (Sandbox Code Playgroud)

我应该如何对单个图像进行预测?

veg*_*ega 35

由于您在小批量上训练模型,因此您的输入是一个形状的张量[batch_size,image_width,image_height,number_of_channels]

预测时,即使您只有一张图像,也必须尊重这种形状.您的输入应该是形状:[1,image_width,image_height,number_of_channels]

你可以轻松地在numpy中做到这一点.假设您有一个5x5x3图像:

    >>> x = np.random.randint(0,10,(5,5,3))
    >>> x.shape
    >>> (5, 5, 3)
    >>> x = np.expand_dims(x, axis=0)
    >>> x.shape
    >>> (1, 5, 5, 3)
Run Code Online (Sandbox Code Playgroud)

现在x是等级4张量!

  • 假设我的变量`x`是一个图像.我可能应该写'x = cv2.imread('image.jpg')`.函数cv2.imread()返回一个numpy数组.所以在你的情况下,`img`是一个numpy数组,我的`x`变量也是如此 (2认同)
  • 还要记住,如果使用ImageDataGenerator加载和训练数据,则可能使用了rescale = 1. / 255。如果使用的话,请确保添加np.expand_dims(image,axis = 0)/ 255。 (2认同)

小智 10

您可以加载具有所需宽度和高度的图像,将其转换为形状为 的 numpy 数组,(image_width, image_height, number_of_channels)然后将数组的形状更改为(1, image_width, image_height, number_of_channels). (batch_size =1)

import numpy as np
from keras.preprocessing import image

img_width, img_height = 150, 150
img = image.load_img('image_path/image_name.jpg', target_size = (img_width, img_height))
img = image.img_to_array(img)
img = np.expand_dims(img, axis = 0)

model.predict(img)
Run Code Online (Sandbox Code Playgroud)


Voc*_*Jax 7

即使这不能解决您的错误,也请确保并重新缩放图像(如果以前已这样做)。例如,我的训练生成器如下所示:

train_datagen = ImageDataGenerator(
   rotation_range=40,
   zoom_range=[0.7, 0.9],
   horizontal_flip=True,
   rescale=1./255
)
Run Code Online (Sandbox Code Playgroud)

因此,当我预测单个图像时:

from PIL import Image
import numpy as np
from skimage import transform
def load(filename):
   np_image = Image.open(filename)
   np_image = np.array(np_image).astype('float32')/255
   np_image = transform.resize(np_image, (256, 256, 3))
   np_image = np.expand_dims(np_image, axis=0)
   return np_image

 image = load('my_file.jpg')
 model.predict(image)
Run Code Online (Sandbox Code Playgroud)

我还必须将其调整为255。