본문

[AWS Rekognition] 이미지 분석 실습

반응형

AWS Rekognition은 Amazon Web Services가 제공하는 이미지 및 동영상 분석 서비스입니다. 머신 러닝 기술을 활용하여 객체, 장면, 얼굴, 텍스트 등을 감지하고 인식할 수 있습니다. 이 글에서는 AWS Rekognition의 주요 기능과 활용 방법에 대해 알아보겠습니다.

 

1. 이미지 분석

1.1. 객체 및 장면 감지

  • Rekognition은 이미지 내의 객체와 장면을 감지하고 분류할 수 있습니다.
  • 수천 가지의 객체와 장면을 인식할 수 있으며, 각 객체의 위치와 신뢰도 점수를 제공합니다.
  • 예시: 제품 이미지 분석, 자율 주행 차량의 환경 인식 등

1.2. 얼굴 감지 및 분석

  • 이미지에서 얼굴을 감지하고, 각 얼굴의 속성(나이, 감정, 시선 등)을 분석할 수 있습니다.
  • 얼굴 비교 기능을 통해 두 얼굴이 동일한 사람인지 여부를 판단할 수 있습니다.
  • 얼굴 모음(Face Collection)을 생성하여 대규모 얼굴 인식 및 검색이 가능합니다.
  • 예시: 사용자 인증, 출입 관리, 감정 분석 등

1.3. 텍스트 감지 (OCR)

  • 이미지 내의 텍스트를 감지하고 추출할 수 있습니다.
  • 인쇄된 텍스트뿐만 아니라 손글씨도 인식 가능합니다.
  • 다양한 언어를 지원하며, 텍스트의 위치와 신뢰도 점수를 제공합니다.
  • 예시: 명함 정보 추출, 차량 번호판 인식, 문서 디지털화 등

 

2. 동영상 분석

2.1. 얼굴 감지 및 인식

  • 동영상에서 얼굴을 감지하고 추적할 수 있습니다.
  • 등록된 Face Collection과 비교하여 동영상 내의 인물을 식별할 수 있습니다.
  • 예시: 영상 내 인물 검색, CCTV 영상 분석 등

2.2. 객체 및 활동 감지

  • 동영상 내의 객체를 감지하고 추적할 수 있습니다.
  • 사람, 차량, 동물 등 다양한 객체를 인식하며, 각 객체의 이동 경로를 추적합니다.
  • 특정 활동(걷기, 뛰기, 싸움 등)을 감지할 수 있습니다.
  • 예시: 교통량 분석, 이상 행동 탐지, 스포츠 경기 분석 등

2.3. 유해 콘텐츠 감지

  • 동영상에서 유해하거나 부적절한 콘텐츠를 감지할 수 있습니다.
  • 성인 콘텐츠, 폭력적인 장면, 불법 활동 등을 식별하여 필터링할 수 있습니다.
  • 예시: 동영상 플랫폼의 콘텐츠 모더레이션, 온라인 게시물 감시 등

 

3. Rekognition Custom Labels

  • Rekognition Custom Labels는 사용자 지정 머신 러닝 모델을 생성할 수 있는 기능입니다.
  • 고객이 직접 이미지 데이터셋을 업로드하고 레이블을 지정하여 맞춤형 모델을 학습시킬 수 있습니다.
  • 산업별, 도메인별 특화된 객체 감지 모델을 만들 수 있습니다.
  • 예시: 제조업에서 제품 검사, 농업에서 작물 모니터링, 의료 영상 진단 등

 

4. Rekognition과 다른 AWS 서비스 연계

  • S3: 분석할 이미지와 동영상을 S3 버킷에 저장하고, Rekognition API를 호출하여 분석을 수행합니다.
  • Lambda: Rekognition 분석 결과를 기반으로 Lambda 함수를 트리거하여 후처리 작업을 자동화할 수 있습니다.
  • Kinesis Video Streams: 실시간 비디오 스트림을 Rekognition으로 분석하여 실시간 객체 감지, 얼굴 인식 등을 수행할 수 있습니다.

 

정리

AWS Rekognition은 강력한 이미지 및 동영상 분석 기능을 제공하여 다양한 비즈니스 문제를 해결할 수 있습니다. 객체 감지, 얼굴 인식, 텍스트 추출 등의 기능을 활용하면 이미지와 동영상에서 유용한 정보를 추출하고 인사이트를 얻을 수 있습니다. 또한, Rekognition Custom Labels를 통해 도메인 특화 모델을 만들어 고객별 요구사항에 맞는 분석 서비스를 제공할 수 있습니다. AWS의 다른 서비스와 연계하여 Rekognition을 활용한다면 더욱 강력하고 자동화된 분석 파이프라인을 구축할 수 있습니다.

 


Rekognition을 활용한 Object Detection 실습

본 실습에서는 Amazon Rekognition을 활용하여 이미지 속에서 객체를 검출하는 내용을 다룹니다. Amazon Rekognition 을 활용하면 API수준에서 쉽게 이미지 속의 오브젝트를 검출할 수 있습니다.

 

1. 샘플이미지 로드

1.1. 샘플이미지는 다음을 활용하겠습니다.

 

1.2. 필요 라이브러리 Import

import boto3
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

 

1.3. 이미지 확인

image_path = 'sample.jpg'

image = Image.open(image_path)
plt.figure(figsize=(15, 15))
plt.imshow(image)
plt.axis('off')
plt.show()
import boto3
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

 

1.4. AWS Python SDK인 Boto3를 활용하여 클라이언트 초기화

  • 자격증명이 이미 구성되어있는경우 Default 프로필을 사용하여 진행합니다.
rekognition = boto3.client('rekognition')

 

  • 자격증명 구성이 존재하지 않는경우 aws_access_key_id 와 aws_secret_access_key 를 직접 전달합니다.
aws_access_key_id = "AKIA...."
aws_secret_access_key = "Zp...."
rekognition = boto3.client('rekognition',
                           aws_access_key_id=aws_access_key_id,
                           aws_secret_access_key=aws_secret_access_key,)

 

 

1.5. 최대로 감지할 라벨 갯수와 최소 컨피던스를 설정하여 API 콜 합니다.

  • MaxLabels : 최대 감지할 라벨 수를 설정합니다.
  • MinConfidence : 최소 컨피던스입니다. 이를 초과하는 경우 검출됩니다.
# 최대로 감지할 라벨
max_labels=10
# 최소 컨피던스 (threshold, 초과 시 검출됨)
min_confidence=95

with open(image_path, 'rb') as image_file:
    image_bytes = image_file.read()

response = rekognition.detect_labels(
    Image={'Bytes': image_bytes},
    MaxLabels=max_labels,
    MinConfidence=min_confidence
)

 

1.6. Response를 확인해보겠습니다.

response['Labels']
[{'Name': 'Pedestrian',
  'Confidence': 99.9852523803711,
  'Instances': [],
  'Parents': [{'Name': 'Person'}],
  'Aliases': [],
  'Categories': [{'Name': 'Person Description'}]},
 {'Name': 'Person',
  'Confidence': 99.9852523803711,
  'Instances': [{'BoundingBox': {'Width': 0.12218771129846573,
     'Height': 0.5296525955200195,
     'Left': 0.5033873319625854,
     'Top': 0.3425632119178772},
    'Confidence': 98.49806213378906},
   {'BoundingBox': {'Width': 0.06897973269224167,
     'Height': 0.5191138386726379,
     'Left': 0.9307627081871033,
     'Top': 0.35653653740882874},
    'Confidence': 98.43036651611328},
   {'BoundingBox': {'Width': 0.09470358490943909,
     'Height': 0.5733098983764648,
     'Left': 0.3799506723880768,
     'Top': 0.37358373403549194},
    'Confidence': 98.38298034667969},
   {'BoundingBox': {'Width': 0.2699248194694519,
     'Height': 0.9478078484535217,
...
     'Top': 0.4051380157470703},
    'Confidence': 96.77462005615234}],
  'Parents': [{'Name': 'Adult'}, {'Name': 'Male'}, {'Name': 'Person'}],
  'Aliases': [],
  'Categories': [{'Name': 'Person Description'}]}]
  • Amazon Rekognition의 response['Labels']는 이미지에서 감지된 레이블(label)들의 리스트를 담고 있는 구조입니다. 각 레이블은 이미지에서 인식된 객체, 장면, 활동 등을 나타냅니다.
  • response['Labels']의 각 요소는 다음과 같은 정보를 포함하는 딕셔너리입니다:
    1. Name: 감지된 레이블의 이름을 나타내는 문자열입니다. 예를 들어, "Person", "Car", "Landscape" 등이 될 수 있습니다.
    2. Confidence: 레이블이 정확하게 감지되었다고 확신하는 정도를 나타내는 0에서 100 사이의 실수 값입니다. 값이 높을수록 레이블 감지에 대한 확신도가 높음을 의미합니다.
    3. Instances: 감지된 레이블의 인스턴스 정보를 담은 리스트입니다. 각 인스턴스는 이미지 내에서 해당 레이블이 감지된 특정 영역을 나타냅니다. 인스턴스 정보에는 BoundingBox (감지된 영역의 위치와 크기), Confidence (인스턴스 감지에 대한 확신도) 등이 포함됩니다.
    4. Parents: 감지된 레이블의 상위 레이블 정보를 담은 리스트입니다. 예를 들어, "Car"라는 레이블의 상위 레이블로는 "Vehicle"이 있을 수 있습니다.

 

1.7. 바운딩 박스를 생성하고 출력해보겠습니다.

image = Image.open(image_path)
fig, ax = plt.subplots(1, figsize=(15,15))
ax.imshow(image)

for label in labels:
    if 'Instances' in label:
        for instance in label['Instances']:
            if 'BoundingBox' in instance:
                box = instance['BoundingBox']
                x = box['Left'] * image.width
                y = box['Top'] * image.height
                width = box['Width'] * image.width
                height = box['Height'] * image.height

                rect = patches.Rectangle((x, y), width, height, linewidth=2, edgecolor='r', facecolor='none')
                ax.add_patch(rect)
                confidence = instance.get('Confidence', 0)
                plt.text(x, y, f"{label['Name']} ({confidence:.2f}%)", bbox=dict(fill=True, edgecolor='r', facecolor='white', alpha=0.5))

plt.show()

반응형

공유

댓글