使用Python从LAION 5B等在线数据库高效获取指定类别图片教程

花韻仙語
发布: 2025-11-20 13:02:11
原创
837人浏览过

使用Python从LAION 5B等在线数据库高效获取指定类别图片教程

本教程旨在指导开发者如何利用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。

千帆大模型平台
千帆大模型平台

面向企业开发者的一站式大模型开发及服务运行平台

千帆大模型平台 35
查看详情 千帆大模型平台

立即学习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}' 图片。")
登录后复制

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等在线数据库高效获取指定类别图片教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号