如何在CNN中使用自己的图片进行预测?

时间:2020-02-06 09:13:37

标签: python tensorflow keras spyder

我正在CNN中尝试使用自己的28x28像素图像,但在尝试重塑时会不断出现此错误:

x = x.reshape(1,28,28,1)

ValueError: cannot reshape array of size 2352 into shape (1,28,28,1)

我的图像是28x28,但无法将其更改为单个灰度通道。我一直在通过anaconda使用spyder,并且每次在我的根环境上安装opencv时,都会收到“ UnsatisfiableError”错误消息。点安装也不起作用。 我想知道是否有人在不使用外部库而仅使用张量流的情况下重塑我的图像。

我已经在SO中寻找答案,并尝试了建议的解决方案,但不幸的是,它们都没有起作用。

谢谢。


回复AKX:

def Predict(imgPath):
    x = plt.imread(imgPath)
    x = x.reshape(1,28,28,1)


    with graph.as_default():
        out = model.predict(x)
        return out

回复Skander HR:

(28,28,3)

回复Matias Valdenegro:

我的问题是openCV无法正常工作。它已安装,但我尝试检查是否有任何代理服务器,安装了python3.dll,并尝试安装microsoft mediafeaturepack以摆脱错误,但这些都不起作用。 当我编写这样的程序时:

import cv2 as cv
print("done")

我收到错误消息:

    import cv2 as cv
ImportError: DLL load failed: The specified module could not be found.

3 个答案:

答案 0 :(得分:0)

您通常使用的是大小为28 * 28的RGB图像,因此大小为28 * 28 * 3 = 2352。您需要将其转换为灰度图像以匹配张量形状。

您可以使用以下命令使用opencv进行转换:-

gray_image = cv2.imread(path_to_image, cv2.IMREAD_GRAYSCALE) 

答案 1 :(得分:0)

只需使用Pillow来调整图像大小:

from PIL import Image
import numpy as np 
...
img = Image.fromarray(x)
img = img.resize((28,28))
x = np.asarray(img)
x = x.reshape(1,28,28,1)
...

使用pip安装 pip install pillow 要么 python3 -m pip install pillow 因此您确定使用的是正确的python版本。

答案 2 :(得分:0)

在对自己的图像进行预测并使用灰度图像时,有两个概念需要考虑。

  1. 默认情况下,OpenCV或PIL中的灰度模式会考虑没有最后一个轴(色轴)的灰度图像。这意味着您必须使用np.expand_dims(image,axis=2)image = image[..., np.newaxis]。完成此步骤后,您的图片大小将为(width,height,1)
  2. 您再次使用np.expand_dims(image, axis=0)来添加batch_index大小。这是必要的,因为默认情况下,在Keras / TensorFlow中,您只能按批次进行预测。就您而言,照片实际上意味着batch_size为1。

如果您牢记这两点,那么您将成功且轻松地使用model.predict()进行预测。