I am having trouble reading images from the S3 bucket. I can read images locally like that.
def load_image(path):
image = cv2.imread(path)
image = cv2.resize(image, (224, 224))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
return image
for image_path in os.listdir(path):
image = load_image(path + "/" + image_path)
X.append(image)
But I have no idea why S3 said error
TypeError: Can't convert object of type 'list' to 'str' for 'filename'
Advertisement
Answer
You need to first establish a connection to S3, then download the image data, and finally decode the data with OpenCV.
For the first bit (connecting to S3), Boto3 is a good alternative (it’s the Python SDK for AWS).
Full sample code:
from io import BytesIO
import boto3
import cv2
import numpy as np
endpoint_url = {your_s3_endpoint_url}
bucket_name = {your_s3_bucket_name}
key = {your_image_key_within_the_bucket}
aws_access_key_id = {your_aws_access_key_id} # Better not to directly expose in source code
aws_secret_access_key = {your_aws_secret_access_key} # Better not to directly expose in source code
bucket = boto3.resource(
"s3",
endpoint_url=endpoint_url,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
).Bucket(bucket_name)
file_stream = BytesIO()
bucket.Object(key).download_fileobj(file_stream)
np_1d_array = np.frombuffer(file_stream.getbuffer(), dtype="uint8")
img = cv2.imdecode(np_1d_array, cv2.IMREAD_COLOR)