我有一个脚本可以模糊图像的一部分并通过预测网运行,以查看图像的哪些部分对标签预测的影响最大。为此,我使用PIL打开本地图像并调整其大小,同时以不同的间隔添加黑盒子。我使用Tensorflow打开我的模型,我想将图像传递给模型,但它不期望具有这种特定形状的值:
Traceback (most recent call last):
File "obscureImage.py", line 55, in <module>
originalPrediction, originalTag = predict(originalImage, labels)
File "obscureImage.py", line 23, in predict
{'DecodeJpeg/contents:0': image})
File "C:\Users\User\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\client\session.py", line 766, in run
run_metadata_ptr)
File "C:\Users\User\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\client\session.py", line 943, in _run
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (224, 224, 3) for Tensor 'DecodeJpeg/contents:0', which has shape '()'
这是我的代码:
def predict(image, labels):
with tf.Session() as sess:
#image_data = tf.gfile.FastGFile(image, 'rb').read() # What I used to use.
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
predictions = sess.run(softmax_tensor,
{'DecodeJpeg/contents:0': image})
predictions = np.squeeze(predictions)
top_k = predictions.argsort()[-5:][::-1] # Getting top 5 predictions
return predictions[0], labels[top_k[0]] # Return the raw value of tag matching and the matching tag.
originalImage = Image.open(args.input).resize((args.imgsz,args.imgsz)).convert('RGB')
originalPrediction, originalTag = predict(originalImage, labels)
打开并使用磁盘中的图像可以正常工作,但当然它不是我修改过的图像。我尝试使用tf.image.decode_jpeg(image,0)
作为softmax张量的参数,但这给了我TypeError: Expected string passed to parameter 'contents' of op 'DecodeJpeg', got <PIL.Image.Image image mode=RGB size=224x224 at 0x2592F883358> of type 'Image' instead.
答案 0 :(得分:1)
&#39; DecodeJpeg:0 /内容:0&#39;是一种用于将base64字符串解码为原始图像数据的操作。 您正尝试输入原始图像数据。 所以你应该把它喂给'DecodeJpeg:0&#39;这是&#39; DecodeJpeg的输出:0 /内容:0&#39;或者进入“穆尔:0&#39;这是图表的输入。 不要忘记调整大小,因为输入应该是形状的(299,299,3) 穆尔接受了(1,299,299,3)
试试这样:
image = Image.open("example.jepg")
image.resize((299,299), Image.ANTIALIAS)
image_array = np.array(image)[:, :, 0:3] # Select RGB channels only.
prediction = sess.run(softmax_tensor, {'DecodeJpeg:0': image_array})
or
prediction = sess.run(softmax_tensor, {'Mul:0': [image_array]})
as well discussed in this stackoverflow question
可视化操作:
for i in sess.graph.get_operations():
print (i.values())
希望这有帮助
答案 1 :(得分:0)
您可以使用PIL的getdata()
将图像的内容作为包含像素的序列对象返回 值。序列对象被展平,因此第一行的值 在零行的值之后直接跟随,依此类推。
或Tensorflow的gfile
。
from tensorflow.python.platform import gfile
image_data = gfile.FastGFile(image_filename, 'rb').read()
答案 2 :(得分:0)
不确定为什么马克西米利安的答案不起作用,但这里有什么对我有用:
getchar()
制作一个字节缓冲区,将PIL图像保存到其中,得到它的值并将其传入。我还是Tensorflow和图像处理的新手,所以如果有人有一个具体的原因,为什么这个工作和Max的东西没有,这将是对这个答案的一个很好的补充。
答案 3 :(得分:0)
使用Keras的img_to_array
函数:
from PIL import Image
pil_img = Image.new(3, (200, 200))
image_array = tf.keras.preprocessing.image.img_to_array(pil_img )
答案 4 :(得分:0)
我已经尝试过了,并且对我很好。随时更改参数以调整您的解决方案。该图像是作为输入的PIL图像。
def read_tensor_from_image(image, input_height=224, input_width=224,
input_mean=0, input_std=255):
float_caster = tf.cast(image, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0);
resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
sess = tf.Session()
result = sess.run(normalized)
return result