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
    
    ### 후 처리 로직 수행 ###

 

-끝-

+ Recent posts