
本教程旨在指导开发者如何利用python,通过api调用从laion 5b等大型在线图像数据库高效获取指定类别的图片,而无需下载整个庞大的数据集。文章详细介绍了使用laion knn服务进行图像搜索和下载的步骤,包括必要的库、api请求参数配置、数据处理以及图片保存机制,为数据科学家和开发者提供了一种便捷的图像资源获取方案。
在处理计算机视觉或机器学习项目时,经常需要大量特定类别的图像数据。ImageNet、LAION 5B等大型在线数据库是宝贵的资源。然而,这些数据集通常规模巨大,完整下载不仅耗时,更可能对本地存储空间造成巨大压力。为了解决这一痛点,本文将介绍如何通过编程方式,利用API从这些在线数据库中按需获取指定类别的图像,特别是以LAION kNN服务为例。
1. 准备工作:安装必要的Python库
在开始之前,请确保您的Python环境中安装了以下库:pathlib (Python标准库,用于路径操作)、shutil (Python标准库,用于文件操作)、pandas (用于数据处理) 和 requests (用于HTTP请求)。如果尚未安装pandas和requests,可以使用pip进行安装:
pip install pandas requests
2. 理解LAION kNN服务
LAION 5B是一个包含数十亿图像-文本对的庞大数据集。LAION kNN (k-Nearest Neighbors) 服务提供了一个API接口,允许用户通过文本查询来搜索与查询文本语义最相似的图像,而无需直接访问原始数据集。这使得按类别获取图像变得非常高效和便捷。
3. 构建API请求与数据获取
核心思路是向LAION kNN服务的API端点发送一个POST请求,指定查询文本(即您想要的图片类别),然后解析返回的JSON数据,从中提取图片URL。
立即学习“Python免费学习笔记(深入)”;
以下是实现这一过程的Python代码:
import pathlibimport shutilimport pandas as pdimport requestsfrom 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 = 0for 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}' 图片。")
4. 代码详解与注意事项
IMAGE_DIR 和 TARGET_LABEL: 您可以根据需要修改这两个变量,分别指定图片保存的根目录和要搜索的类别。API_URL: LAION kNN服务的固定API地址。HEADERS: User-Agent 是一个重要的HTTP请求头,它告诉服务器发起请求的客户端类型。模拟一个常见的浏览器User-Agent可以有效避免某些网站或服务因识别为爬虫而拒绝请求。PAYLOAD:modality: 指定查询的模态,此处为’image’。num_images: 每次API请求返回的图片数量。请注意,LAION kNN服务可能有默认或最大返回数量限制。indice_name: 指定使用的LAION数据集索引。’laion5B-L-14′ 是一个常用且包含大量高质量图像的索引。您也可以尝试其他索引,具体取决于LAION服务的文档。text: 这是您实际的查询文本,与TARGET_LABEL变量结合使用。请求与响应处理:requests.post(): 发送POST请求。json=PAYLOAD | {‘text’: TARGET_LABEL} 巧妙地合并了通用参数和特定查询文本。response.raise_for_status(): 这是一个非常重要的错误检查机制,如果HTTP请求返回的状态码表示错误(例如4xx或5xx),它会抛出一个HTTPError异常。pd.DataFrame(response.json()): 将API返回的JSON数据直接转换为Pandas DataFrame,方便后续通过列名(如’url’)访问数据。图片下载:requests.get(img_url, stream=True): stream=True 允许您以流的方式下载文件,而不是一次性将整个文件加载到内存中。这对于下载大文件非常有用。shutil.copyfileobj(img_response.raw, fp): 将流式响应的内容直接复制到文件对象中,高效地保存图片。错误处理: 代码中包含了对ConnectionError和RequestException的捕获,以处理网络问题或下载失败的情况,确保程序不会因单张图片下载失败而中断。对于生产环境,可以考虑更复杂的重试逻辑。目录创建: (IMAGE_DIR / TARGET_LABEL).mkdir(exist_ok=True, parents=True) 会创建目标目录,如果目录已存在则不会报错,parents=True 会自动创建所有不存在的父目录。
5. 扩展与优化
批量下载: 如果需要下载大量图片(例如数千张),可以多次调用API,每次请求不同的num_images,或者通过调整查询参数来获取更多结果。请注意API的使用限制。查询多样性: 除了简单的类别名称,您还可以尝试更复杂的文本描述来获取更精确的图片,例如 “一只在草地上玩耍的金毛犬”。API密钥与认证: 某些高级API服务可能需要API密钥或OAuth认证。LAION kNN服务目前是公开的,但未来可能会有所调整。代理设置: 如果您遇到网络限制或需要隐藏IP,可以在requests请求中添加proxies参数。图片去重与质量筛选: LAION 5B虽然庞大,但可能存在重复或低质量的图片。在实际应用中,您可能需要额外的步骤来对下载的图片进行去重、质量评估或手动筛选。
总结
通过本文介绍的方法,您可以有效地利用Python和LAION kNN服务从大型在线图像数据库中按需获取指定类别的图片,极大地简化了数据收集过程,并避免了下载和存储整个数据集的巨大开销。这种方法对于快速原型开发、特定任务的数据补充以及研究探索都非常实用。记住在使用任何在线资源时,请遵守其服务条款和数据使用政策。
以上就是使用Python从LAION 5B等在线数据库高效获取指定类别图片教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1381542.html
微信扫一扫
支付宝扫一扫