0. 개요
- S3에서 수천 개의 이미지를 기반으로 머신 러닝하여 모델을 생성하는 Task를 수행
- 보안 요건에 따라, S3에 있는 이미지를 jupyter에 저장하지 않는 방식으로 진행 -> S3 이미지 직접 접근 후 메모리에 저장하여 학습
- 작업 방식
- S3에 접속
- 작업할 파일 경로를 list 형태로 저장(file path + 파일명) ex)myproject/1.png
- 파일 경로 정보를 바탕으로 S3 image를 로컬 변수에 받아 후처리 진행
1. package install
!pip install opencv-python #cv2 import 위해 설치
2. module import
import boto3 #S3 관련 작업 수행
import cv2 #이미지를 다루는 작업 수행
3. S3 설정
accessKey = '**********************' #private S3 일 경우 필요
secretKey = '*********************' #private S3 일 경우 필요
region = 'ap-northeast-2'
bucket_name = 'my-s3-bucket-name'
prefix = 'my-img-path-prefix/'. #prefix에 경로를 지정할 경우, 그 하위 폴더에 대해서만 작업 수행
s3 = boto3.client('s3',
aws_access_key_id=accessKey, #public S3 일 경우, 입력하지 않아도 됨
aws_secret_access_key=secretKey #public S3 일 경우, 입력하지 않아도 됨
)
4. list 받아오기
- 받아야 할 리스트가 1,000건이 넘어, paginator를 사용
- 작업할 파일은 png 이므로, 해당 확장자만 filtering
paginator = s3.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket_name, Prefix=prefix)
file_list = []
# 확장자 filtering
for page in pages:
for obj in page['Contents']:
key = obj['Key']
if key.endswith('.png'):
file_list.append(key)
위 작업을 수행하면, file_list에 아래와 같은 양식으로 데이터 저장됨
- my-file-prefix/myfile.png
5. image 불러오기
- 위에서 저장한 이미지 리스트를 기반으로 데이터를 연속적으로 불러와 처리
- ing 형태로 최종 이미지 저장 완료
for file in file_list:
object = s3.get_object(Bucket=bucket_name, Key=img) #S3로부터 이미지 object 가져오기
nparr = np.frombuffer(object['Body'].read(), np.uint8) #numpy array 형태로 읽기
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) #이미지 decode
### 후 처리 로직 수행 ###
-끝-