如何在TensorFlow中加载图像及CSV标注文件用于目标检测?
TensorFlow目标检测:加载图像与CSV标注的方法
TensorFlow没有直接对应image_dataset_from_directory的目标检测专用加载函数,但可以通过tf.data.Dataset自定义实现,步骤如下:
1. 读取CSV标注文件
先通过pandas读取CSV,关联图像路径与边界框标注:
import pandas as pd import tensorflow as tf # 配置路径 IMAGE_DIR = "./path/to/your/images" CSV_PATH = "./path/to/annotations.csv" # 读取CSV,假设列名是filename, x0, y0, width, height df = pd.read_csv(CSV_PATH) # 拼接完整图像路径 df["image_path"] = df["filename"].apply(lambda x: f"{IMAGE_DIR}/{x}")
2. 创建基础数据集
从DataFrame中提取图像路径和标注数据,构建TensorFlow数据集:
# 提取图像路径数组和标注数组 image_paths = df["image_path"].values bboxes = df[["x0", "y0", "width", "height"]].values # 创建数据集 dataset = tf.data.Dataset.from_tensor_slices((image_paths, bboxes))
3. 编写图像与标注解析函数
实现加载图像、解码、格式转换的逻辑,把CSV的(x0,y0,width,height)转成目标检测常用的(xmin, ymin, xmax, ymax)格式:
def load_and_preprocess_image(image_path, bbox): # 读取图像文件 img_raw = tf.io.read_file(image_path) # 解码成RGB图像 img = tf.image.decode_jpeg(img_raw, channels=3) # 归一化到[0,1]区间(可选,根据模型需求调整) img = tf.cast(img, tf.float32) / 255.0 # 转换边界框格式:x0,y0,w,h → xmin, ymin, xmax, ymax xmin = bbox[0] ymin = bbox[1] xmax = bbox[0] + bbox[2] ymax = bbox[1] + bbox[3] # 包装成模型需要的格式(比如列表或字典) bbox_processed = tf.stack([xmin, ymin, xmax, ymax]) return img, bbox_processed
4. 应用解析函数并优化数据集
对数据集映射解析函数,添加shuffle、batch、prefetch等操作提升训练效率:
# 应用解析函数 dataset = dataset.map(load_and_preprocess_image, num_parallel_calls=tf.data.AUTOTUNE) # 数据集优化 BATCH_SIZE = 32 dataset = dataset.shuffle(buffer_size=len(df)) \ .batch(BATCH_SIZE) \ .prefetch(tf.data.AUTOTUNE)
额外说明
- 如果你的CSV包含类别标签,只需在解析函数中加入类别处理逻辑,返回
(img, (bbox, label))即可适配多输出模型。 - 若存在单张图像对应多个边界框的情况,需先按图像名分组标注,再调整数据集构建逻辑(比如用
tf.data.Dataset.group_by_window)。
内容的提问来源于stack exchange,提问作者Nikesh Devkota
相关产品推荐
相关产品推荐

