我正在尝试推断张量流中的numpy图像数组是否存在分类问题,因此结果将采用数组形式,其值的范围为0到1。目前,我有一个Web界面,Base64格式的图像从该界面开始收到后,服务器将裁剪图像的一小部分,将其保存到磁盘,然后再次将图像加载到tensorflow中进行推断。但是,我想减少磁盘的IO数量,因此将numpy图像数组直接转换为张量,然后执行推理而不先保存到磁盘。现在,我可以将numpy数组转换为张量并成功推断出它,但是置信度结果与将图像保存到磁盘时得到的置信度有所不同。
加载文件并进行推理(按预期工作):
def predict(self, file_name):
input_name = "file_reader"
file_reader = tf.read_file('images/' + file_name, input_name)
if file_name.endswith(".png"):
image_reader = tf.image.decode_png(file_reader, channels=3, name="png_reader")
elif file_name.endswith(".gif"):
image_reader = tf.squeeze(tf.image.decode_gif(file_reader, name="gif_reader"))
elif file_name.endswith(".bmp"):
image_reader = tf.image.decode_bmp(file_reader, name="bmp_reader")
else:
print('file_reader -> {}'.format(file_reader))
image_reader = tf.image.decode_jpeg(file_reader, channels=3, name="jpeg_reader")
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0)
resized = tf.image.resize_bilinear(dims_expander, [self.input_layer_size, self.input_layer_size])
normalized = tf.divide(tf.subtract(resized, [0]), [128])
sess = tf.InteractiveSession()
result = sess.run(normalized)
sess.close()
del sess
return result
以下是我针对不同图像获得的输出类型:
[5.3e-08, 0.0, 0.0, 0.0, 0.999999404, 1.0, 1e-09, 0.228272051, 6.2e-08, 0.995405078, 1.0, 1.0, 0.999997616, 2.2e-08, 0.0, 0.000580777, 1.5233e-05, 0.0]
从numpy数组推断(无法正常工作)
def predict_numpy_image(self, raw_image):
r, g, b = np.array(raw_image).T
raw_image = np.array([b, g, r]).transpose()
tensor_image = tf.convert_to_tensor(raw_image, dtype=tf.float32)
dims_expander = tf.expand_dims(tensor_image, 0)
resized = tf.image.resize_bilinear(dims_expander, [self.input_layer_size, self.input_layer_size])
normalized = tf.divide(tf.subtract(resized, [0]), [128])
sess = tf.InteractiveSession()
result = sess.run(normalized)
sess.close()
del sess
return result
以下是我针对不同图像获得的输出类型:
[9.9e-08, 1e-09, 0.0, 0.0, 0.999943137, 1.0, 1e-09, 0.174775824, 3.4e-08, 0.997927666, 1.0, 1.0, 0.999979138, 4.2e-08, 0.0, 0.005487741, 1.8515e-05, 0.0]
我不确定两个函数为什么给出不同的输出。是否因为我推断的数据不同?还是因为曾经通过tensorflow保存/加载的数据不同于直接来自numpy数组的数据。
下面供我参考的是我如何裁剪图像,以及我将传递给第二个函数的numpy图像数组(predict_numpy_image):
height, width, channels = img.shape
x = int(region[j][0] * width)
y = int(region[j][1] * height)
w = int(region[j][2] * width)
h = int(region[j][3] * height)
crop_img = img[y:y + h, x:x + w]
predict_numpy_image(crop_img)
这是我用来裁剪其他图像的相同代码。在整整2天的时间里一直在尝试各种方法,以便从张量流中获得相同的输出。
P.S。抱歉,如果使用任何错误的术语,对于tensorflow和ML还是很新的。