如何在Inception_v3示例中直接传入图像而非图像路径?
解决方案:直接传入图像数据到Inception_v3
当然可以直接传入图像本身而非路径!你当前代码里用到的DecodeJpeg/contents:0这个输入节点,本质上就是接收图像的二进制字节数据——原来的tf.gfile.FastGFile(imagePath, 'rb').read()只是从文件读取字节的方式而已。下面给你几种常见场景的修改方案:
1. 直接传入图像二进制字节数据
如果你已经通过其他渠道(比如网络下载、内存缓存)拿到了图像的bytes类型数据,直接替换掉文件读取的部分即可:
import tensorflow as tf import numpy as np def run_inference_on_image(image_bytes): answer = None create_graph() # 保留你原有的创建图的逻辑 with tf.Session() as sess: softmax_tensor = sess.graph.get_tensor_by_name('final_result:0') # 直接将图像字节传入模型输入节点 predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_bytes}) predictions = np.squeeze(predictions) # 这里可以添加你原有的结果处理逻辑(比如取Top N预测结果) return predictions
2. 传入PIL Image对象
如果你的图像是PIL格式的对象,只需先将其编码为JPEG字节再传入:
from PIL import Image import io def run_inference_on_pil_image(pil_image): # 将PIL图像转为JPEG格式的字节数组 img_byte_buffer = io.BytesIO() pil_image.save(img_byte_buffer, format='JPEG') img_bytes = img_byte_buffer.getvalue() # 调用上面的推理函数 return run_inference_on_image(img_bytes)
3. 传入Numpy数组格式的图像(比如OpenCV读取的图像)
如果是OpenCV读取的BGR格式Numpy数组,需要先转为RGB格式,再编码为JPEG字节:
import cv2 import numpy as np def run_inference_on_numpy_image(numpy_img): # OpenCV默认读BGR,转为Inception要求的RGB格式 if numpy_img.shape[-1] == 3: numpy_img = cv2.cvtColor(numpy_img, cv2.COLOR_BGR2RGB) # 将Numpy数组编码为JPEG字节 _, encoded_img = cv2.imencode('.jpg', numpy_img) img_bytes = encoded_img.tobytes() return run_inference_on_image(img_bytes)
小提示
- 如果你的图像是PNG等其他格式,可以把输入节点换成
DecodePng/contents:0,或者统一转成JPEG字节传入会更通用; - 确保图像尺寸符合Inception_v3的要求(默认是299x299),如果尺寸不对,可以在传入前先做resize处理。
内容的提问来源于stack exchange,提问作者송준석
相关产品推荐
相关产品推荐

