'How to user a tensorflow server saved model with string tensor input to predict in the local machine?
I'm trying to run saved serving models in my local machine. However, it takes string tensor as input, and I'm having trouble converting the images to the correct string format.
To load the model I use:
saved_model = tf.saved_model.load('model/1/')
inf_model = saved_model.signatures['serving_default']
The model has the following input-output structure:
inputs {
key: "encoded"
value {
name: "serving_default_encoded:0"
dtype: DT_STRING
tensor_shape {
}
}
}
outputs {
key: "output_0"
value {
name: "StatefulPartitionedCall:0"
dtype: DT_FLOAT
tensor_shape {
dim {
size: 19451
}
}
}
}
method_name: "tensorflow/serving/predict" To process the image I use this:
img = tf.io.read_file(path)
# Decodes the image to W x H x 3 shape tensor with type of uint8
img = tf.io.decode_image(img, channels=3)
img = tf.image.resize_with_pad(img, 224, 224)
img = tf.image.convert_image_dtype(img, tf.float32)
And I try to convert it to string tensor format like this:
img_encoded = base64.urlsafe_b64encode(img).decode("utf-8")
img_encoded = tf.constant(img_encoded)
Predicting:
pred = inf_model(encoded=enc)['sequential_1'][0]
However, I get the following error:
Traceback (most recent call last):
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/spyder_kernels/py3compat.py", line 356, in compat_exec
exec(code, globals, locals)
File "/home/james/Desktop/Project/dev_test/inference.py", line 79, in <module>
res = inf_model(encoded=enc)['sequential_1'][0]
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1669, in __call__
return self._call_impl(args, kwargs)
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1678, in _call_impl
return self._call_with_structured_signature(args, kwargs,
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1759, in _call_with_structured_signature
return self._call_flat(
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/saved_model/load.py", line 115, in _call_flat
return super(_WrapperFunction, self)._call_flat(args, captured_inputs,
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 1918, in _call_flat
return self._build_call_outputs(self._inference_function.call(
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/function.py", line 555, in call
outputs = execute.execute(
File "/home/james/anaconda3/envs/james/lib/python3.8/site-packages/tensorflow/python/eager/execute.py", line 59, in quick_execute
tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
InvalidArgumentError: Unknown image file format. One of JPEG, PNG, GIF, BMP required.
[[{{node StatefulPartitionedCall/decode_image/DecodeImage}}]] [Op:__inference_signature_wrapper_129216]
Function call stack:
signature_wrapper
Solution 1:[1]
The error is due to image format, which is not of JPEG, PNG, GIF, BMP formats. The images might have an extension name jpg but be in say a tiff format. As the error states that the image file format is unknown, kindly check the image type and delete the images which are not of JPEG, PNG, GIF, BMP type from your dataset using the code below;
import os
import cv2
import imghdr
def check_images( s_dir, ext_list):
bad_images=[]
bad_ext=[]
s_list= os.listdir(s_dir)
for klass in s_list:
klass_path=os.path.join (s_dir, klass)
print ('processing class directory ', klass)
if os.path.isdir(klass_path):
file_list=os.listdir(klass_path)
for f in file_list:
f_path=os.path.join (klass_path,f)
tip = imghdr.what(f_path)
if ext_list.count(tip) == 0:
bad_images.append(f_path)
if os.path.isfile(f_path):
try:
img=cv2.imread(f_path)
shape=img.shape
except:
print('file ', f_path, ' is not a valid image file')
bad_images.append(f_path)
else:
print('*** fatal error, you a sub directory ', f, ' in class directory ', klass)
else:
print ('*** WARNING*** you have files in ', s_dir, ' it should only contain sub directories')
return bad_images, bad_ext
source_dir =r'c:\temp\people\storage'
good_exts=['jpg', 'png', 'jpeg', 'gif', 'bmp' ] # list of acceptable extensions
bad_file_list, bad_ext_list=check_images(source_dir, good_exts)
if len(bad_file_list) !=0:
print('improper image files are listed below')
for i in range (len(bad_file_list)):
print (bad_file_list[i])
else:
print(' no improper image files were found')
Removing such images from the dataset will help.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |