
本教程旨在指导开发者如何利用python,通过api调用从laion 5b等大型在线图像数据库高效获取指定类别的图片,而无需下载整个庞大的数据集。文章详细介绍了使用laion knn服务进行图像搜索和下载的步骤,包括必要的库、api请求参数配置、数据处理以及图片保存机制,为数据科学家和开发者提供了一种便捷的图像资源获取方案。
在处理计算机视觉或机器学习项目时,经常需要大量特定类别的图像数据。ImageNet、LAION 5B等大型在线数据库是宝贵的资源。然而,这些数据集通常规模巨大,完整下载不仅耗时,更可能对本地存储空间造成巨大压力。为了解决这一痛点,本文将介绍如何通过编程方式,利用API从这些在线数据库中按需获取指定类别的图像,特别是以LAION kNN服务为例。
在开始之前,请确保您的Python环境中安装了以下库:pathlib (Python标准库,用于路径操作)、shutil (Python标准库,用于文件操作)、pandas (用于数据处理) 和 requests (用于HTTP请求)。如果尚未安装pandas和requests,可以使用pip进行安装:
pip install pandas requests
LAION 5B是一个包含数十亿图像-文本对的庞大数据集。LAION kNN (k-Nearest Neighbors) 服务提供了一个API接口,允许用户通过文本查询来搜索与查询文本语义最相似的图像,而无需直接访问原始数据集。这使得按类别获取图像变得非常高效和便捷。
核心思路是向LAION kNN服务的API端点发送一个POST请求,指定查询文本(即您想要的图片类别),然后解析返回的JSON数据,从中提取图片URL。
立即学习“Python免费学习笔记(深入)”;
以下是实现这一过程的Python代码:
import pathlib
import shutil
import pandas as pd
import requests
from requests.exceptions import ConnectionError, RequestException
# 定义图片保存目录和目标类别
IMAGE_DIR = pathlib.Path('downloaded_images')
TARGET_LABEL = 'dog' # 您希望获取的图片类别,例如 'cat', 'car', 'flower'
# LAION kNN服务的API端点
API_URL = 'https://knn.laion.ai/knn-service'
# 请求头:模拟浏览器行为,避免某些服务器拒绝请求
HEADERS = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:120.0) Gecko/20100101 Firefox/120.0',
}
# 请求体:定义查询参数
# modality: 查询类型,'image'表示搜索图片
# num_images: 希望获取的图片数量
# indice_name: LAION数据集的索引名称,'laion5B-L-14'是一个常用的索引
# text: 您的查询文本,即目标类别
PAYLOAD = {
'modality': 'image',
'num_images': 40, # 每次请求获取的图片数量
'indice_name': 'laion5B-L-14',
}
print(f"正在从LAION 5B搜索 '{TARGET_LABEL}' 相关的图片...")
try:
# 发送POST请求,合并通用payload和特定查询文本
response = requests.post(API_URL, json=PAYLOAD | {'text': TARGET_LABEL}, headers=HEADERS, timeout=10)
response.raise_for_status() # 检查HTTP请求是否成功 (2xx状态码)
# 将JSON响应转换为Pandas DataFrame以便于处理
df = pd.DataFrame(response.json())
print(f"成功获取到 {len(df)} 张 '{TARGET_LABEL}' 图片的URL。")
except RequestException as e:
print(f"API请求失败: {e}")
exit()
except ValueError as e:
print(f"JSON解析错误: {e}")
exit()
# 创建保存图片的目录
(IMAGE_DIR / TARGET_LABEL).mkdir(exist_ok=True, parents=True)
print(f"图片将保存到: {IMAGE_DIR / TARGET_LABEL}")
# 遍历DataFrame中的图片URL并下载
downloaded_count = 0
for img_url in df['url']:
try:
# 使用stream=True进行流式下载,节省内存
img_response = requests.get(img_url, stream=True, timeout=5)
img_response.raise_for_status() # 检查图片下载请求是否成功
# 从URL中提取文件名
img_name = pathlib.Path(img_url).name
file_path = IMAGE_DIR / TARGET_LABEL / img_name
# 将图片内容写入文件
with open(file_path, 'wb') as fp:
shutil.copyfileobj(img_response.raw, fp)
downloaded_count += 1
print(f"已下载: {img_name}")
except ConnectionError:
print(f"下载 {img_url} 时连接错误,跳过。")
except RequestException as e:
print(f"下载 {img_url} 时发生请求错误: {e},跳过。")
except Exception as e:
print(f"下载 {img_url} 时发生未知错误: {e},跳过。")
print(f"\n下载完成!共成功下载 {downloaded_count} 张 '{TARGET_LABEL}' 图片。")通过本文介绍的方法,您可以有效地利用Python和LAION kNN服务从大型在线图像数据库中按需获取指定类别的图片,极大地简化了数据收集过程,并避免了下载和存储整个数据集的巨大开销。这种方法对于快速原型开发、特定任务的数据补充以及研究探索都非常实用。记住在使用任何在线资源时,请遵守其服务条款和数据使用政策。
以上就是使用Python从LAION 5B等在线数据库高效获取指定类别图片教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号