이번 글에서는 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을 사용한 얼굴 인식 구현 방법을 다룰 것이다. 기반 설정에서 어려움을 겪고 있다면 이 글의 내용을 차근차근 따라해보기 바란다.
'Cloud&Infra > AWS' 카테고리의 다른 글
Raspberry Pi와 AWS Service를 활용한 실시간 얼굴 인식 시스템 구축하기 - Part 2: Rekognition 기반 얼굴 인식 구현 (1) | 2024.11.24 |
---|---|
AWS SageMaker Neo와 AWS IoT Greengrass V2를 활용한 라즈베리파이 ML 모델 배포 가이드 (1) | 2024.10.27 |
Amazon Cognito 자격 증명 풀로 S3 파일 접근하기 (1) | 2024.03.13 |
S3 데이터를 RDS(Aurora MySQL) 클러스터로 로드하기 (1) | 2024.02.17 |
AWS QLDB와 Node.js 연결: 단계별 실습 (0) | 2023.05.14 |