You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python自动遍历文件夹图片调用Amazon Rekognition接口?

当然有办法解决这个重复修改文件名的麻烦!我们可以通过自动遍历S3目标文件夹里的所有图片,逐个调用Amazon Rekognition的detect_labels接口来实现批量处理。下面给你一套实用的Python方案(基于AWS的Boto3 SDK),直接就能复用:

批量处理S3文件夹图片的实现方案

基础版代码(适用于1000张以内图片)

如果你的目标文件夹里图片数量少于1000张,用这个简单版本就足够了:

import boto3

# 初始化S3和Rekognition客户端
s3_client = boto3.client('s3')
rekognition_client = boto3.client('rekognition')

# 配置你的桶名和目标文件夹前缀(比如存图片的文件夹是'images/',记得末尾加斜杠)
bucket_name = 'test1'
folder_prefix = 'images/'

# 列出S3文件夹下的所有对象
s3_response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_prefix)

# 遍历每个图片对象并调用Rekognition
for obj in s3_response.get('Contents', []):
    # 跳过文件夹本身(如果前缀是文件夹路径的话)
    if obj['Key'] == folder_prefix:
        continue
    
    # 调用detect_labels接口,这里直接用对象的Key作为图片名
    rek_response = rekognition_client.detect_labels(
        Image={
            'S3Object': {
                'Bucket': bucket_name,
                'Name': obj['Key']
            }
        }
    )
    
    # 自定义结果处理逻辑,这里只是打印出来,你可以改成写入文件/数据库
    print(f"=== 图片 {obj['Key']} 的检测结果 ===")
    for label in rek_response['Labels']:
        print(f"- {label['Name']}: {round(label['Confidence'], 2)}%")
    print("\n")

进阶版:处理分页与大量图片

AWS的list_objects_v2接口默认最多返回1000个对象,如果你的文件夹里图片超过这个数量,需要处理分页结果,用下面的版本:

import boto3

s3_client = boto3.client('s3')
rekognition_client = boto3.client('rekognition')

bucket_name = 'test1'
folder_prefix = 'images/'

continuation_token = None
while True:
    # 根据是否有分页token调用不同的list_objects_v2参数
    if continuation_token:
        s3_response = s3_client.list_objects_v2(
            Bucket=bucket_name,
            Prefix=folder_prefix,
            ContinuationToken=continuation_token
        )
    else:
        s3_response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=folder_prefix)
    
    # 遍历当前页的所有图片
    for obj in s3_response.get('Contents', []):
        if obj['Key'] == folder_prefix:
            continue
        # 只处理图片格式的文件(可根据需要调整后缀)
        allowed_extensions = ('.jpg', '.jpeg', '.png', '.gif')
        if not obj['Key'].lower().endswith(allowed_extensions):
            continue
        
        # 调用Rekognition检测标签
        rek_response = rekognition_client.detect_labels(
            Image={'S3Object': {'Bucket': bucket_name, 'Name': obj['Key']}}
        )
        
        # 这里可以替换成你需要的结果保存逻辑,比如写入CSV
        print(f"处理完成: {obj['Key']}")
        # 示例:写入CSV
        # with open('rekognition_results.csv', 'a') as f:
        #     f.write(f"{obj['Key']},{','.join([f'{l["Name"]}:{l["Confidence"]}' for l in rek_response['Labels']])}\n")
    
    # 检查是否还有下一页数据
    if not s3_response.get('IsTruncated'):
        break
    continuation_token = s3_response['NextContinuationToken']

几个实用的优化建议

  • 过滤非图片文件:上面的进阶版已经加了后缀过滤,避免处理无关文件浪费资源;
  • 结果持久化:不要只打印结果,建议把检测结果写入CSV、JSON文件或者数据库,方便后续分析;
  • 异常处理:可以给detect_labels调用加上try-except块,避免某张图片处理失败导致整个脚本中断;
  • 并发处理:如果图片数量极大,可以用线程池或者异步调用提高处理速度(注意AWS的API调用限额)。

这样一来,你再也不用手动修改文件名了,脚本会自动遍历指定S3文件夹里的所有图片并完成标签检测!

内容的提问来源于stack exchange,提问作者PepperTuna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:37:41