如何用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
相关产品推荐
相关产品推荐

