2022年8月15日月曜日

AWS Rekognition (3) : 動画からのラベル抽出

 Amazon Rekognitionを利用した、動画からのラベル抽出をやってみます。

(1) S3に解析用動画を準備する

動画からのラベル抽出をRekognitionをするには、S3に動画を保存する必要があります。短めの動画をS3にアップロードしておきます。前回作ったバケットに「video」というフォルダを作り、その中に動画をアップロードしておきます。動画はmp4かmovのようです。

(2)SagemakerでRekognition Video APIを利用
前回作成したSagemakerのノートブックインスタンスを立て上げます。
今回の動画認識をするノートブックを作成しておきます。

(i) rekognitionインスタンスの作成
credentialファイルまたは直接アクセスキーを書いておきます。
import boto3
rekognition = boto3.client(
'rekognition',
aws_access_key_id='***************',
aws_secret_access_key='******************',
aws_session_token='**********************',
region_name='us-east-1'
)
bucketName = '****************'
videoName = "*******************"

バケットや動画のファイル名は自分の環境に合わせておきます。

(ii) start_label_detection関数の呼び出し
画像と違い、動画の場合はstart_label_detection関数を最初に呼び出す必要があります。
# Start video label recognition job
startLabelDetection = rekognition.start_label_detection(
Video={
'S3Object': {
'Bucket': bucketName,
'Name': videoName,
}
},
MinConfidence = 90
)
labelsJobId = startLabelDetection['JobId']
print("Job Id: {0}".format(labelsJobId))

Job IDを確認します。

(iii) get_label_detection関数を実行
次にラベル取得を行います。
getObjectDetection = rekognition.get_label_detection(
JobId=labelsJobId,
SortBy='TIMESTAMP'
)
while(getObjectDetection['JobStatus'] == 'IN_PROGRESS'):
time.sleep(5)
print('.', end='')
getObjectDetection = rekognition.get_label_detection(
JobId=labelsJobId,
SortBy='TIMESTAMP')
display(getObjectDetection['JobStatus'])

SUCCEEDEDが出れば分析が完了です。
print(getObjectDetection) とするとjson形式で見ることができます。
みやすくしてみます。
for obj in getObjectDetection['Labels']:
print('Time : {0}'.format(obj['Timestamp']))
print('LabelName : {0}'.format(obj['Label']['Name']))
print('Confidence : {0}'.format(obj['Label']['Confidence']))
print()

得られた情報を格納したり、動画とリンクして表示することで、有効に使えそうです。

2022年8月13日土曜日

AWS Rekognition (2) : 画像をS3に転送する

 前回S3上にアップした画像のラベル抽出ができました(https://smizunolab.blogspot.com/2022/08/aws-rekognition-1.html)。ただ、毎回S3に画像を直接アップロードするのは大変ですので、既に蓄えられている画像をS3にアップロードして、ラベル抽出をしやすくしたいと思います。環境はSagemakerでやりますが、boto3がインストールされていれば、自分の環境でも同様にできます。

(1) Sagemaker上に画像フォルダ「image」を用意します。

このimageの中にラベル抽出したいファイルを入れておきます。
(2) S3上に転送されたファイルを格納するフォルダ「image」を用意します。
自分のバケットの中にフォルダ「image」を作成します。
この「image」にファイルを転送します。

(3) pythonでS3にファイル転送
前回利用したjupyterファイルに追加していきます。今回はcredentialsファイルを使わない形式で書いていきます。
import boto3
s3_client = boto3.client(
's3',
aws_access_key_id='*************************',
aws_secret_access_key='******************',
aws_session_token='********************',
region_name='us-east-1'
)
print(s3_client)
view raw s3_upload hosted with ❤ by GitHub

Bucket = '**********************'
Filename = ['./image/20220310-A7402532_TP_V4.jpg', './image/susipaku1128PAR53395340_TP_V4.jpg', './image/takeshitadoriIMGL3946_TP_V4.jpg']
Key = ['image/20220310-A7402532_TP_V4.jpg', 'image/susipaku1128PAR53395340_TP_V4.jpg', 'image/takeshitadoriIMGL3946_TP_V4.jpg']
for i in range(len(Filename)):
s3_client.upload_file(Filename[i], Bucket, Key[i])
view raw s3_upload2 hosted with ❤ by GitHub

今回はファイル名をリスト化していますが、適宜変更して下さい。ファイルがアップロードされたかS3側で確認します。
ファイルが指定場所、指定したファイル名でアップロードされたことが確認できました。

2022年8月12日金曜日

AWS Rekognition (1) : 簡単なラベル抽出

 AWSのRekognitionを使って画像からラベル抽出までをやってみます。今回は全てAWSの環境の中で完結するようにやっていきます。利用する環境は以下の通りです。

プログラミング言語:Python3

プログラミング実行環境:AWS Sagemaker

画像認識API : AWS Rekognition

画像保管用ストレージ:AWS S3

※今回は授業での利用を考えて、AWS AcademyのLearnerLabの環境で作っていきます

※ Javaで実施する場合は、https://smizunolab.blogspot.com/2019/11/aws-educate-3-rekognition.html

(1) AWS Sagemakerの立ち上げ

Amazon Sagemakerを開き、ノートブックインスタンスを一つ立ち上げます。名前を入力して、デフォルトのままで起動します。IAMロールで新規作成する必要があれば、新規作成して下さい。

作成をしたら、PendingからStartになるまで待ち、Jupyterを立ち上げてます。

(2) credentialファイルの作成 (~/.aws/credentials)
次にRekognitionを使えるように、credentialファイルを作成します。Jupyter右側のNewからTerminalを開きます。
Terminalを開いたら、
$ ls -la
を実施して、「.aws」があるか確認します。Sagemakerでは自動的に作られるようですが、自分で立てた環境などでは自分で「.aws」を作る必要があります。
$ cd .aws
$ vi credentials
credentialsファイルには以下の内容を書き込みます。

[default]
aws_access_key_id=XXXXXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYY
aws_session_token=ZZZZZZZZZZZZZZZZZZZZZZZ

AWS AcademyのLearnerLabの場合は、モジュールから「AWS Details」を押して、「AWS CLI : 」のshowを押すと出てきます。ただしAWS Academyの場合は4時間の期限があります。

この内容をcredentialsファイルに書き込み、保存をします。
(3) S3に対象となる画像を用意する
次に、S3を開き、bucketを作成します。バケット名を決めて、あとはデフォルトの内容で作成します。

作成したバケットに画像を入れておきます。猫の画像を一つ入れておきました。
(4) Rekognition APIを利用
Sagemakerに戻って、Rekognition APIを使って、S3にアップした画像のラベル抽出をしてみます。Jupyterでファイルを作成して名前を付けておきます。今回は「conda_python3」の環境で作りました。
boto3のインストール
Terminalか作成したjupyterファイルで、以下のコマンドを発行します。
pip install boto3
jupyterで実施する場合は、!pip install boto3. 「!」が先頭に必要
Rekognition APIで指定したラベル抽出を行います。
BUCKET : 作成したバケット名
KEY:ラベル抽出したいファイル名(S3にアップしたもの)
REGION : リージョン名「us-east-1」など
は自分の環境に合わせて入力します
これでラベル抽出ができました。猫以外にも画面に入っている物体抽出ができています。

何らかの理由でcredentialsファイルが作成できない場合は、ソースコードに直接書き込む方法もあります。推奨はされないようです。
import boto3
client = boto3.client(
'rekognition',
aws_access_key_id='********************',
aws_secret_access_key='*************************',
aws_session_token='**************************',
region_name='us-east-1'
)
BUCKET = "*************"
KEY = '****************'
def detect_labels(bucket, key, max_labels=10, min_confidence=90):
response = client.detect_labels(
Image={
"S3Object": {
"Bucket": bucket,
"Name": key,
}
},
MaxLabels=max_labels,
MinConfidence=min_confidence,
)
return response['Labels']
for label in detect_labels(BUCKET, KEY):
print("{Name} - {Confidence}%".format(**label))
view raw gistfile1.txt hosted with ❤ by GitHub