如何手动构建批量,使用tf.image.resize_images调整JPG图片尺寸?
手动构建图片批量并完成尺寸调整的解决方案
不用Input Reader的话,咱们可以分步骤手动处理:先单独加载每张图片,再把它们组合成符合要求的4D张量,最后批量调整尺寸。下面是具体的实现步骤和代码示例,用TensorFlow 2.x的 eager execution 模式(这也是现在的主流用法):
步骤1:加载单张图片并解码
首先写一个简单的函数,负责读取JPG文件并转成TensorFlow能处理的3D张量(高度、宽度、通道数):
import tensorflow as tf def load_single_image(img_path): # 读取图片文件的原始二进制数据 img_raw = tf.io.read_file(img_path) # 解码JPG为RGB张量,channels=3确保输出是3通道的彩色图 img = tf.image.decode_jpeg(img_raw, channels=3) # 转换为float32类型,因为resize操作对浮点型输入更友好 img = tf.cast(img, tf.float32) return img
步骤2:构建图片批量
假设你的三张图片路径存在一个列表里,先把所有图片加载成3D张量的列表,再根据情况组合成4D批量张量:
情况A:所有原始图片尺寸相同
如果三张图片的原始高度、宽度完全一致,直接用tf.stack就能把3D张量列表堆叠成4D批量张量(维度顺序是[batch_size, height, width, channels]):
# 替换成你的图片路径 image_paths = ["pic1.jpg", "pic2.jpg", "pic3.jpg"] # 加载所有图片到列表 image_tensors = [load_single_image(path) for path in image_paths] # 堆叠成4D批量张量 image_batch = tf.stack(image_tensors, axis=0) # 此时image_batch的形状是 (3, H, W, 3),H/W是原始图片的高/宽
情况B:原始图片尺寸不同
如果三张图片大小不一样,直接堆叠会报错(因为TensorFlow张量要求形状统一)。这时候可以先单独调整每张图片的尺寸,再堆叠;或者用tf.map_fn批量完成加载+resize的操作,更高效:
# 定义你想要的目标尺寸,比如(224,224) target_size = (224, 224) # 方法1:先resize每张,再堆叠 resized_tensors = [tf.image.resize(img, target_size) for img in image_tensors] image_batch = tf.stack(resized_tensors, axis=0) # 方法2:用map_fn一次性完成加载和resize,代码更简洁 path_tensor = tf.convert_to_tensor(image_paths, dtype=tf.string) def load_and_resize(path): img_raw = tf.io.read_file(path) img = tf.image.decode_jpeg(img_raw, channels=3) img = tf.cast(img, tf.float32) return tf.image.resize(img, target_size) image_batch = tf.map_fn(load_and_resize, path_tensor, fn_output_signature=tf.float32)
两种方法最终得到的image_batch都是形状为(3, 224, 224, 3)的4D张量,完全符合tf.image.resize(也就是你提到的tf.image.resize_images,TF2.x里旧名称兼容)的输入要求。
额外注意点
- 如果你用的是TensorFlow 1.x,需要把操作放在
tf.Session里运行,语法会有差异,但核心逻辑是一样的:先加载单张转张量,再组合成批量,最后resize。 tf.image.resize默认用双线性插值,你可以通过method参数指定其他插值方式,比如tf.image.ResizeMethod.NEAREST_NEIGHBOR(最近邻插值)。- 解码JPG时,如果你的图片是灰度图,把
channels=3改成channels=1即可。
内容的提问来源于stack exchange,提问作者1981dev
相关产品推荐
相关产品推荐

