Raspberry Pi와 AWS Service를 활용한 실시간 얼굴 인식 시스템 구축하기 - Part 1: 인프라 설정

이번 글에서는 Raspberry Pi 5와 AWS 서비스들을 연동하여 실시간 얼굴 인식 시스템을 구축하는 방법을 단계별로 살펴본다. 이 시스템은 보안 모니터링, 출입 관리, 혹은 방문자 확인 등 다양한 실제 현장에서 활용될 수 있다.

 

Architecture

 

이 시스템의 데이터 흐름은 다음과 같다.

  • 영상 수집 및 전송
    • Raspberry Pi 카메라에서 캡처된 영상을 Kinesis Video Streams로 실시간 전송
  • 얼굴 인식 처리
    • Kinesis Video Streams의 영상을 Rekognition이 실시간 분석
    • 사전 등록된 얼굴 정보와 비교하여 신원 확인
    • 분석 결과를 Kinesis Data Streams로 전송
  • 이벤트 처리
    • Lambda 함수가 Kinesis Data Streams의 분석 결과 처리
    • 특정 인물 감지 시 SNS를 통한 이메일 알림 발송
    • IoT Core를 통해 LED 센서 제어 명령 전송

 

실제 구현에 앞서, 이 시스템을 구성하는 핵심 기술들을 간단하게 살펴보겠다.

 

1. 스트리밍 데이터 처리

1-1. Kinesis Video Stream

완전 관리형 서비스로, AWS 클라우드에서 라이브 비디오를 스트리밍 하고 분석하는 기능을 제공한다.

  • 스마트폰, 보안 카메라, 웹캠, 자동차 카메라, 드론 등 다양한 소스에서 비디오 데이터 수집
  • 비디오 외에도 오디오, 열화상, 깊이 데이터, RADAR 데이터 등 시계열 데이터 전송 가능
  • GStreamer 플러그인이나 RTSP를 통한 비디오 스트리밍 지원
  • 지정된 보존 기간 동안 미디어 데이터 자동 저장 및 암호화
  • 생산자/수집 타임스탬프 기반 데이터 인덱싱
  • AWS Management Console이나 API를 통한 실시간 모니터링
  • Amazon EC2에서 실행되는 사용자 지정 애플리케이션과 연동 가능

1-2. Kinesis Data Stream

Kinesis Data Stream은 실시간 데이터 스트림 수집 및 처리를 위한 서비스이다.

  • 대규모 데이터 레코드의 실시간 수집 및 처리
  • IT 인프라 로그, 애플리케이션 로그, 소셜 미디어, 마켓 데이터 피드 등 처리
  • 실시간 데이터 수집과 처리 응답 시간이 1초 미만
  • 데이터 내구성과 탄력성 보장
  • 여러 Kinesis Data Streams 애플리케이션이 동시에 하나의 스트림 데이터 처리 가능
  • Amazon DynamoDB, Amazon S3 등 다른 AWS 서비스와 연동
  • 복잡한 스트림 처리를 위한 DAG(Directed Acyclic Graphs) 구성 지원

2. 컴퓨터 비전 처리

2-1. Rekognition

Rekognition은 클라우드 기반 이미지 및 비디오 분석 서비스이다.

  • 이미지/비디오에서 객체, 장면, 텍스트, 콘텐츠 감지 및 분류
  • 얼굴 감지, 분석, 비교 기능 (성별, 나이, 감정 등 특성 분석)
  • 유명인 인식 기능 (정치인, 운동선수, 배우, 음악가 등)
  • 부적절한 콘텐츠 필터링 및 안전하지 않은 콘텐츠 탐지
  • 사용자 지정 레이블을 통한 맞춤형 객체 감지
  • S3와 Lambda 서비스와의 기본 통합
  • 기계 학습 전문 지식 없이도 사용 가능

3. 알림 처리

3-1. Amazon SNS (Simple Notification Service)

AWS SNS는 게시자-구독자 모델 기반의 메시지 전송 관리 서비스이다.

  • 애플리케이션 간 비동기 메시지 전송 지원
  • 다양한 구독 엔드포인트 지원 (Amazon SQS, Lambda, HTTP, 이메일, SMS 등)
  • 표준 및 FIFO 토픽 지원으로 메시지 순서 보장
  • 지리적으로 분산된 서버에 메시지 저장으로 내구성 보장
  • 서버 사이드 암호화로 메시지 보안 강화
  • AWS KMS를 통한 암호화 키 관리

3-2. AWS IoT Core

AWS IoT Core는 IoT 디바이스를 AWS 클라우드 서비스와 연결하는 관리형 서비스이다.

  • MQTT, MQTT over WSS, HTTPS, LoRaWAN 프로토콜 지원
  • IoT 장치나 어플리케이션이 AWS IoT에 액세스 하는 방법
    • 디바이스 SDK
    • AWS CLI
    • AWS IoT API
    • AWS SDK(다양한 프로그래밍 언어 지원)
  • 메시지 브로커를 통한 게시-구독 통신 모델 제공

이제 실제 구현을 해보자.

 

라즈베리 파이 카메라로 Kinesis Video Stream으로 실시간 영상을 전송

1. Kinesis Video Stream 생성하기

1-1. Kinesis Video Stream 페이지에서 비디오 스트림 생성을 클릭한다.

1-2. 새 비디오 스트림 만들기 페이지에서 스트림 이름을 입력하고, KMS 구성은 기본구성으로 한 뒤 비디오 스트림을 생성한다.

1-3. 비디오 스트림 생성 확인

 

 

2. IAM 사용자 및 권한 추가

1. IAM (https://console.aws.amazon.com/iam/)에 AWS Management Console 로그인하고 에서 콘솔을 연다.

2. 왼쪽 탐색 메뉴에서 사용자를 클릭한다.

3. 새 사용자를 생성하려면 사용자 추가를 선택한다.

4. 사용자에 사용자 이름을 지정한다(예: kinesis-video-raspberry-pi-producer).

5. 액세스 유형에서 프로그래밍 방식 액세스를 선택한다.

6. 다음: 권한을 선택한다.

7. kinesis-video-raspberry-pi-producer에 대한 권한 설정에서 기존 정책 직접 연결을 선택한다.

8. 정책 생성을 선택합니다. 새 웹 브라우저 탭에서 정책 생성 페이지가 열린다.

9. JSON탭을 선택한다.

10. 다음 JSON 정책을 복사하여 텍스트 영역에 붙여 넣는다. 이 정책은 사용자에게 Kinesis 비디오 스트림에 데이터를 생성하고 쓸 수 있는 권한을 부여한다.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
      "Action": [
      "kinesisvideo:DescribeStream",
      "kinesisvideo:CreateStream",
      "kinesisvideo:GetDataEndpoint",
      "kinesisvideo:PutMedia"
    ],
    "Resource": [
      "*"
    ]
  }]
}

11. 정책 검토를 선택합니다.

12. 정책에 이름을 지정합니다(예: kinesis-video-stream-write-policy).

13. 정책 생성을 선택합니다.

14. 브라우저에서 사용자 추가 탭으로 돌아가서 새로 고침을 선택합니다.

15. 검색 상자에 생성한 정책 이름을 입력합니다.

16. 목록에서 새 정책 옆의 확인란을 선택합니다.

17. 다음: 검토를 선택합니다.

18. 사용자 생성을 선택합니다.

19. 콘솔에 새 사용자의 액세스 키 ID가 표시됩니다. 표시를 선택해 보안 액세스 키를 표시합니다. 애플리케이션을 구성할 때 필요하므로 이러한 값을 기록해 둡니다.

 

3. 소프트웨어 사전 요구사항 설치(GStreamer, Amazon Root 인증서 등)

3-1. 패키지 목록을 업데이트하고, 빌드에 필요한 라이브러리를 설치

sudo apt update
sudo apt install -y \\
  automake \\
  build-essential \\
  cmake \\
  git \\
  gstreamer1.0-plugins-base-apps \\
  gstreamer1.0-plugins-bad \\
  gstreamer1.0-plugins-good \\
  gstreamer1.0-plugins-ugly \\
  gstreamer1.0-tools \\
  gstreamer1.0-omx-generic \\
  libcurl4-openssl-dev \\
  libgstreamer1.0-dev \\
  libgstreamer-plugins-base1.0-dev \\
  liblog4cplus-dev \\
  libssl-dev \\
  pkg-config

 

3-2. Amazon 루트 인증서 다운로드 및 /etc/ssl/cert.pem 위치에 복사 후 권한 설정

sudo curl <https://www.amazontrust.com/repository/AmazonRootCA1.pem> -o /etc/ssl/AmazonRootCA1.pem
sudo chmod 644 /etc/ssl/AmazonRootCA1.pem

 

4. 라즈베리 파이에 Video Stream Producer SDK 설치

4-1. Git 저장소에서 Kinesis Video Stream Producer SDK 다운로드

git clone <https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git>

4-2. amazon-kinesis-video-streams-producer-sdk-cpp/build라는 경로에 디렉터리를 생성 및 build 디렉터리에 접속

mkdir -p amazon-kinesis-video-streams-producer-sdk-cpp/build
cd amazon-kinesis-video-streams-producer-sdk-cpp/build

4-3. CMake를 이용한 빌드 설정(GStreamer 플러그인을 빌드하도록, 외부 종속성 라이브러리를 빌드하지 않도록 설정) 후 빌드 실행

cmake .. -DBUILD_GSTREAMER_PLUGIN=ON -DBUILD_DEPENDENCIES=FALSE
make

 

 

5. Kinesis Video Stream Producer SDK 실행

5-1. kinesis SDK 폴더 접속

cd amazon-kinesis-video-streams-producer-sdk-cpp/build #빌드 디렉터리로 이동

5-2. kinesis 실행

# GStreamer 플러그인 경로 설정
export GST_PLUGIN_PATH=Directory Where You Cloned the SDK/amazon-kinesis-video-streams-producer-sdk-cpp/build
# AWS 리전 설정
export AWS_DEFAULT_REGION=AWS Region #i.e. us-east-1
# AWS 액세스 키 설정
export AWS_ACCESS_KEY_ID=Access Key ID
# AWS 시크릿 액세스 키 설정
export AWS_SECRET_ACCESS_KEY=Secret Access Key
#GStreamer sample 애플리케이션 실행
./kvs_gstreamer_sample Your Stream Name #i.e. RasspberryPi5-video-stream

 

 

5-3 kinesis 실행 확인

  • 로컬에서 확인: RECIVED, BUFFERING, PERSISTED 다음으로 postReadCallback()이 계속해서 나온다면 성공한 것이다. 
  • AWS Management Console에서 확인: 비디오 스트림에서 미디어 재생을 보고, 정확하게 나오고 있다면 성공한 것이다.

 

 

 

Kinesis Data Stream을 생성하고, IAM 권한 설정

1. Kinesis Data Stream 생성하기

1-1. Amazon Kinesis 접속 수 데이터 스트림 생성 클릭

 

1-2. 데이터 스트림 이름 입력 후 데이터 스트림 생성을 클릭한다.

 

2. S3 버킷에 감지하고자 하는 얼굴 업로드

2-1. S3 버킷 만들기

2-2. 테스트용 참조 이미지 업로드
얼굴 인식 테스트를 위한 참조 이미지로 공개된 인물 사진을 사용했다. 본 예제에서는 유재석 씨의 공개 프로필 이미지를 S3 버킷에 업로드했다.

 

 

3. IAM 역할 생성

3-1. IAM 역할 생성 클릭 후 신뢰할 수 있는 엔터티 선택

 

3-2. 권한 추가에서 정책 선택

  • AmazonKinesisFirehoseFullAccess
  • AmazonKinesisVideoStreamsFullAccess
  • AmazonRekognitionFullAccess
  • AmazonRekognitionServiceRole
  • AmazonS3ReadOnlyAccess

3-3. 역할 이름을 “Rekognition-kinesis”로 지정하고, 역할 생성하기

3-4. 생성된 역할(Rekognition-kinesis)에 들어가서 권한 추가의 인라인 정책 생성 클릭

3-5. 권한지정 페이지에서 JSON으로 클릭하고, 아래 JSON에서 Kinesis Data Stream ARN과 Kinesis Video Stream ARN을 수정한 뒤 넣어준다.

[ JSON ] 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kinesis:PutRecord",
                "kinesis:PutRecords"
            ],
            "Resource": "arn:aws:kinesis:us-east-1:[YourID]:stream/face_detect"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kinesisvideo:GetDataEndpoint",
                "kinesisvideo:GetMedia"
            ],
            "Resource": "[Your Kinesis Video Stream ARN]"
        }
    ]
}
  • 참고로 Kinesis Data Stream ARN은 Kinesis페이지의 데이터 스트림에서 “face_detect”를 클릭해서 들어가 보면 ARN이 있다.
  • Kinesis Video Stream ARN은 Kinesis Video Stream에서 “RasspberryPi5-video-stream” 비디오 스트림 정보에 가면 있다.

 

마무리하며

이번 part1에서는 실시간 얼굴 인식 시스템의 기반이 되는 Kinesis Video Stream과 Kinesis Data Stream 설정을 완료했다. 두 스트림 서비스는 각각 실시간 비디오 처리와 분석 결과 데이터 처리를 담당하는 핵심 컴포넌트다. 이러한 기반 설정은 다음 part2에서 진행할 Rekognition 기반 얼굴 인식과 IoT 디바이스 제어 구현의 토대가 될 것이다.

다음 part2 글에서는 본격적으로 Rekognition을 사용한 얼굴 인식 구현 방법을 다룰 것이다. 기반 설정에서 어려움을 겪고 있다면 이 글의 내용을 차근차근 따라해보기 바란다.