我正在使用AWS,boto3和Pycharm在python上编写一个非常简单的程序,它将一个面部图像与另一个面部图像的另一个面部进行比较。 我写了以下简单的源代码:
import boto3
s3 = boto3.resource('s3',
aws_access_key_id = "xxx",
aws_secret_access_key = "yyy")
BUCKET = "eyeglasses-images"
KEY_SOURCE = "Foucault.jpg"
KEY_TARGET = "Ricoeur.jpg"
def compare_faces(bucket, key, bucket_target, key_target, threshold=80, region="eu-west-1"):
rekognition = boto3.client("rekognition", region)
response = rekognition.compare_faces(
SourceImage={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
TargetImage={
"S3Object": {
"Bucket": bucket_target,
"Name": key_target,
}
},
SimilarityThreshold=threshold,
)
return response['SourceImageFace'], response['FaceMatches']
source_face, matches = compare_faces(BUCKET, KEY_SOURCE, BUCKET, KEY_TARGET)
# the main source face
print
"Source Face ({Confidence}%)".format(**source_face)
# one match for each target face
for match in matches:
print
"Target Face ({Confidence}%)".format(**match['Face'])
print
" Similarity : {}%".format(match['Similarity'])
但是我收到以下错误:
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials
(显然代替xxx和yyy我正在使用真正的密钥)
问题是什么?我该如何解决这个问题?
答案 0 :(得分:1)
问题在于:rekognition = boto3.client("rekognition", region)
因为你没有在这里指定密钥,所以boto3正试图在〜/ .aws中找到凭证文件。更新此项以使用Aniket提到的session
对象。您的代码应更改为:
session = boto3.session.Session(
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY
)
rekognition = session.client("rekognition", region)
答案 1 :(得分:0)
您可以先使用会话。例如
session = boto3.Session(
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
然后获取您的资源
s3 = session.resource('s3')
请注意,aws_session_token是可选的,如果您使用STS获取临时会话,则会使用它。
只是说
s3 = boto3.client('s3')
s3 = boto3.resource('s3')
将使用~/.aws/credentials
文件中的默认信用卡。所以它不能在你的情况下使用。
如果你可以直接使用 -
会很好s3 = boto3.client(
's3',
# Hard coded strings as credentials, not recommended.
aws_access_key_id='xx',
aws_secret_access_key='yy'
)
有关详细信息,请参阅 - boto3 configuration documentation