如何下载数据集JSON分片中引用的图片(以image_caption/textcaps为例)
问题
我正在使用HuggingFace上的image_caption/textcaps数据集分片,下载的JSON文件里列出了图片文件名(比如train/011e7e629fb9ae7b.jpg),但实际图片文件缺失。我需要这些.jpg文件来结合QA对,在训练/验证过程中做图片可视化。
已执行操作
- 安装了Git LFS
- 用以下命令克隆数据集:
结果只下载了git lfs install git clone git@hf.co:datasets/<dataset-id>.jsonl/.json元数据文件,没拿到图片。
最小复现示例
from datasets import load_dataset # 加载数据集分片 dataset = load_dataset("allenai/c4", split="train") # 查看条目 print(dataset[0]['image']) # 示例输出:"train/011e7e629fb9ae7b.jpg" # 尝试访问图片(但文件不存在) image_path = "path/to/downloaded/dataset/" + dataset[0]['image'] try: with open(image_path, 'rb') as f: img_data = f.read() except FileNotFoundError: print(f"Image file not found: {image_path}")
输出:
Image file not found: path/to/downloaded/dataset/train/011e7e629fb9ae7b.jpg
示例JSON条目
{ "image": "train/011e7e629fb9ae7b.jpg", "qa": [ { "a": "Five Listerine Zero mouthwash bottles on a store shelf.", "i": "Write a one-sentence description of the image, requiring reading the text." } ] }
核心疑问
怎么下载JSON里引用的实际图片文件?有没有遗漏的外部存储链接、额外步骤或方法?
补充说明
- 数据集中没有
.tar或.zip压缩包 - HuggingFace数据集查看器能正常显示图片
解决方案
方法1:用datasets库自动处理图片加载
datasets库会自动处理图片的远程下载和本地缓存,无需手动拼接路径。修改代码如下:
from datasets import load_dataset from PIL import Image # 加载textcaps数据集,库会自动拉取图片 dataset = load_dataset("image_caption/textcaps", split="train") # 直接调用image字段即可获取PIL格式的图片,可直接可视化 image = dataset[0]['image'] image.show()
图片会被缓存到本地默认路径(~/.cache/huggingface/datasets/),后续访问无需重复下载。
方法2:手动批量下载图片到指定目录
如果需要将图片统一保存到自定义目录,可按以下步骤操作:
- 找到数据集的加载脚本(在HuggingFace数据集页面的
Files and versions板块中找到对应脚本文件,比如textcaps.py),从中提取图片的基础托管地址。 - 提取JSON中的图片文件名,与基础地址拼接成完整下载路径,批量下载。示例代码:
import json import requests # 读取本地数据集JSON文件 with open("path/to/dataset/train.json", "r") as f: data = json.load(f) # 替换为从加载脚本中获取的图片基础托管地址 base_url = "[图片基础托管地址]/" save_dir = "path/to/your/save/directory/" # 批量下载图片 for item in data: # 提取图片文件名(比如从"train/xxx.jpg"中取出"xxx.jpg") img_filename = item['image'].split("/")[-1] download_url = base_url + img_filename response = requests.get(download_url) if response.status_code == 200: with open(f"{save_dir}{img_filename}", "wb") as f: f.write(response.content)
方法3:排查Git LFS同步问题
如果克隆时未拉取到图片,可进入数据集目录执行以下命令强制同步LFS文件:
cd <dataset-id> git lfs pull
注:textcaps数据集的图片通常不通过Git LFS存储,此方法仅用于排查基础同步问题。
内容的提问来源于stack exchange,提问作者Tixtor 710
相关产品推荐
相关产品推荐

