* 이 포스팅은 https://developing-soosoo.tistory.com/51 과 연결된 포스팅입니다
* Java 또는 Python으로 Amazon S3 버킷에 저장된 비디오 분석 (SDK) - Amazon Rekognition 를 바탕으로 작성했습니다
SDK 이용하기
(코드 예시)
#Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.)
import boto3
import json
import sys
import time
class VideoDetect:
jobId = ''
rek = boto3.client('rekognition')
sqs = boto3.client('sqs')
sns = boto3.client('sns')
roleArn = ''
bucket = ''
video = ''
startJobId = ''
sqsQueueUrl = ''
snsTopicArn = ''
processType = ''
def __init__(self, role, bucket, video):
self.roleArn = role
self.bucket = bucket
self.video = video
def GetSQSMessageSuccess(self):
jobFound = False
succeeded = False
dotLine=0
while jobFound == False:
sqsResponse = self.sqs.receive_message(QueueUrl=self.sqsQueueUrl, MessageAttributeNames=['ALL'],
MaxNumberOfMessages=10)
if sqsResponse:
if 'Messages' not in sqsResponse:
if dotLine<40:
print('.', end='')
dotLine=dotLine+1
else:
print()
dotLine=0
sys.stdout.flush()
time.sleep(5)
continue
for message in sqsResponse['Messages']:
notification = json.loads(message['Body'])
rekMessage = json.loads(notification['Message'])
print(rekMessage['JobId'])
print(rekMessage['Status'])
if rekMessage['JobId'] == self.startJobId:
print('Matching Job Found:' + rekMessage['JobId'])
jobFound = True
if (rekMessage['Status']=='SUCCEEDED'):
succeeded=True
self.sqs.delete_message(QueueUrl=self.sqsQueueUrl,
ReceiptHandle=message['ReceiptHandle'])
else:
print("Job didn't match:" +
str(rekMessage['JobId']) + ' : ' + self.startJobId)
# Delete the unknown message. Consider sending to dead letter queue
self.sqs.delete_message(QueueUrl=self.sqsQueueUrl,
ReceiptHandle=message['ReceiptHandle'])
return succeeded
def StartLabelDetection(self):
response=self.rek.start_label_detection(Video={'S3Object': {'Bucket': self.bucket, 'Name': self.video}},
NotificationChannel={'RoleArn': self.roleArn, 'SNSTopicArn': self.snsTopicArn})
self.startJobId=response['JobId']
print('Start Job Id: ' + self.startJobId)
def GetLabelDetectionResults(self):
maxResults = 10
paginationToken = ''
finished = False
while finished == False:
response = self.rek.get_label_detection(JobId=self.startJobId,
MaxResults=maxResults,
NextToken=paginationToken,
SortBy='TIMESTAMP')
print('Codec: ' + response['VideoMetadata']['Codec'])
print('Duration: ' + str(response['VideoMetadata']['DurationMillis']))
print('Format: ' + response['VideoMetadata']['Format'])
print('Frame rate: ' + str(response['VideoMetadata']['FrameRate']))
print()
for labelDetection in response['Labels']:
label=labelDetection['Label']
print("Timestamp: " + str(labelDetection['Timestamp']))
print(" Label: " + label['Name'])
print(" Confidence: " + str(label['Confidence']))
print(" Instances:")
for instance in label['Instances']:
print (" Confidence: " + str(instance['Confidence']))
print (" Bounding box")
print (" Top: " + str(instance['BoundingBox']['Top']))
print (" Left: " + str(instance['BoundingBox']['Left']))
print (" Width: " + str(instance['BoundingBox']['Width']))
print (" Height: " + str(instance['BoundingBox']['Height']))
print()
print()
print (" Parents:")
for parent in label['Parents']:
print (" " + parent['Name'])
print ()
if 'NextToken' in response:
paginationToken = response['NextToken']
else:
finished = True
def CreateTopicandQueue(self):
millis = str(int(round(time.time() * 1000)))
#Create SNS topic
snsTopicName="AmazonRekognitionExample" + millis
topicResponse=self.sns.create_topic(Name=snsTopicName)
self.snsTopicArn = topicResponse['TopicArn']
#create SQS queue
sqsQueueName="AmazonRekognitionQueue" + millis
self.sqs.create_queue(QueueName=sqsQueueName)
self.sqsQueueUrl = self.sqs.get_queue_url(QueueName=sqsQueueName)['QueueUrl']
attribs = self.sqs.get_queue_attributes(QueueUrl=self.sqsQueueUrl,
AttributeNames=['QueueArn'])['Attributes']
sqsQueueArn = attribs['QueueArn']
# Subscribe SQS queue to SNS topic
self.sns.subscribe(
TopicArn=self.snsTopicArn,
Protocol='sqs',
Endpoint=sqsQueueArn)
#Authorize SNS to write SQS queue
policy = """{{
"Version":"2012-10-17",
"Statement":[
{{
"Sid":"MyPolicy",
"Effect":"Allow",
"Principal" : {{"AWS" : "*"}},
"Action":"SQS:SendMessage",
"Resource": "{}",
"Condition":{{
"ArnEquals":{{
"aws:SourceArn": "{}"
}}
}}
}}
]
}}""".format(sqsQueueArn, self.snsTopicArn)
response = self.sqs.set_queue_attributes(
QueueUrl = self.sqsQueueUrl,
Attributes = {
'Policy' : policy
})
def DeleteTopicandQueue(self):
self.sqs.delete_queue(QueueUrl=self.sqsQueueUrl)
self.sns.delete_topic(TopicArn=self.snsTopicArn)
def main():
roleArn = '' ##
bucket = ''
video = ''
analyzer=VideoDetect(roleArn, bucket,video)
analyzer.CreateTopicandQueue()
analyzer.StartLabelDetection()
if analyzer.GetSQSMessageSuccess()==True:
analyzer.GetLabelDetectionResults()
analyzer.DeleteTopicandQueue()
if __name__ == "__main__":
main()
* 이 때, roleArn 을 전에 생성한 역할의 ARN으로 바꿔줍니다.
* bucket, video 는 각각 지정한 버킷과 비디오 파일 이름으로 바꿔줍니다
CLI 이용하기
https://docs.aws.amazon.com/ko_kr/rekognition/latest/dg/video-cli-commands.html 를 참고했습니다
1. 비디오에서 레이블 감지하기
aws rekognition start-label-detection --video "S3Object={Bucket=bucketname,Name=videofile}" \
--notification-channel "SNSTopicArn=TopicARN,RoleArn=RoleARN" \
--endpoint-url Endpoint \
--region us-east-1
해당 코드를 터미널에서 실행하면 됩니다!
* 이 때 Bucket, Name, SNSTopicArn, RoleArn은 본인 버킷이름, 비디오파일,SNS ARN, 역할 ARN으로 바꿔주세요 *
2. JobId 기록하기
위에 코드를 실행하면 해당 코드가 출력됩니다. 이 때 JobId를 잘 기록해두세요!
{
"JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn"
}
3. 레이블 검색 결과 표시
aws rekognition get-label-detection --job-id JobId \
--region us-east-1
이 때, JobId는 위에서 기록해둔 JobId로 대체해줍니다 (region도 본인이 해당하는 region으로 바꿔줍니다)
(출력 결과)
{
"Labels": [
{
"Timestamp": 0,
"Label": {
"Confidence": 99.03720092773438,
"Name": "Speech"
}
},
{
"Timestamp": 0,
"Label": {
"Confidence": 71.6698989868164,
"Name": "Pumpkin"
}
},
{
"Timestamp": 0,
"Label": {
"Confidence": 71.6698989868164,
"Name": "Squash"
}
},
{
"Timestamp": 0,
"Label": {
"Confidence": 71.6698989868164,
"Name": "Vegetable"
}
}, .......
이런식으로 코드가 출력되면 성공입니다 !
'AWS' 카테고리의 다른 글
4-1. AWS rekognition으로 streaming video 분석 전 셋팅 (0) | 2022.01.03 |
---|---|
4-0. ubuntu 환경에서 java 설치 (terminal 이용) (0) | 2022.01.03 |
3-0. AWS Amazon Rekognition Video 구성 (SNS, SQS) (0) | 2021.12.29 |
2. AWS Amazon Rekognition 입문 가이드 (이미지 작업하기) (0) | 2021.12.29 |
1-2. AWS boto3 resource 와 client의 차이 (0) | 2021.12.23 |