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ファイルまたは直接アクセスキーを書いておきます。

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

(ii) start_label_detection関数の呼び出し
画像と違い、動画の場合はstart_label_detection関数を最初に呼び出す必要があります。

Job IDを確認します。

(iii) get_label_detection関数を実行
次にラベル取得を行います。

SUCCEEDEDが出れば分析が完了です。
print(getObjectDetection) とするとjson形式で見ることができます。
みやすくしてみます。

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

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ファイルを使わない形式で書いていきます。


今回はファイル名をリスト化していますが、適宜変更して下さい。ファイルがアップロードされたか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ファイルが作成できない場合は、ソースコードに直接書き込む方法もあります。推奨はされないようです。

2022年7月9日土曜日

プログラミングスキル向上のために

 プログラミングスキル向上のために、僕が考えていることを書いておきます。プログラミング言語は限定しませんが、オブジェクト指向型言語(C++, Java, Pythonなど)を想定しています。僕自身、プログラミングは苦手意識がありました。周りでプログラミングが上手な人を見て、「センスがないとプログラミングはできないのかな?」と考えたことがあります。けれども今では、下に書いたようなコツを掴めば、誰でも上達できると考えています。

[対象者]

・プログラミングに苦手意識がある

・プログラミングを勉強しているが、成長が感じられない

[プログラミングスキル向上のために]

1. 基本文法を身につける(構造化プログラミング:順次、選択、繰り返し)

最低限の基本文法は身につけないとプログラミングが始まりません。構造化プログラミングという、順次(上から下の順序で実行)、選択(if, switch文)、繰り返し(for, while文)の3要素を身につけましょう。これ以外の細かな文法は後からで十分です。薄めの参考書を利用して、例題をやってみてここまでの知識を身につけましょう。英語で言うと、基本的な単語、文法を覚えるのと同じです。

2. 上から下へのプログラムを書いてみる

構造化プログラミングを身につけたら、とにかく自分の力で、汚いプログラミングで良いので、プログラムを作ってみましょう。構造化プログラミングを使えば、基本的にどのようなプログラミングも書くことができます。冗長になったり、同じことが書いてあってもよいので、自分でプログラムを作れるようになりましょう。英語で言うと、英語で話かけられたときに、なんとか苦労しながら自分の言葉で返して、意味が通じた時の感覚です。この段階がクリアできれば、プログラムはどんどん書けるようになります。

3. プログラムをまとめる(関数化:ルールを見つける)

2でプログラムがなんとか書けるようになったら、それを機能的にまとめていきます。これは関数化すると良いです。関数化するときには、引数と戻り値を明確に示さなければなりません。プログラムを関数化するときには、ある種のルールを見つけることになります。例えば、同じ処理を何度もしている時、ループや引数を変えることでまとめることができます。同じ処理を関数化して、出来るだけプログラムをスリムにしていきましょう。関数化することができれば、後から再利用もできて便利です。英語で言うと、あいさつやいつも使う言い回しをまとめておくことと同じです。

プログラミング環境は、pythonでいうと1~3はJupyter Notebookにメモ的に書いて、実行を確認していくような形です。

4. プログラムをさらにまとめる(クラス化:システム的に処理できるように)

3で関数化してスリムになったプログラム同士を、ある目的のためにシステム化していきましょう。例えば、サイコロを指定回数投げた時に、指定された目の出る確率を実験的に求めると、指定回数、指定する目、各回でなんの目が出るか、今までに出た指定目の回数などいくつかの情報を組み合わせていきます。これらをシステム的にまとめたものがクラスになります。クラスには、複数の関数、インスタンス変数など目的に合わせて組み合わせていきます。システムとして提供できるプログラムとして、クラスを考えていくのが良いと考えています。英語で言うと、作文、論文、プレゼンなどで起承転結のような流れがあり、仮定から結論までの流れのようなものです。個人的には、この4ができるようになると、どのようなプログラミングでも組める気になります。ここまでできたプログラムは再利用できる価値が高いので、githubなどにアップして、自分のリポジトリにしましょう。

プログラミング環境は、4を実施するときは、1~3でJupyter Notebookで書いてきたものを、pythonファイル(.py)に書き換えながらやっていく形です。クラス化をすることで、役割分担が明確になり、プログラムの「型」に当てはめていく作業です。型に当てはめることで、プログラミングがわかりやすくなります。

5. データの扱い:呼び出し、保存ができる

4まででプログラミングの大枠ができるようになると、次はデータの扱いです。プログラミングにおいて、変数の値の保存や、データの取り込みは欠かせないものです。これを行うために、配列、リストなどデータの扱いに慣れておく必要があります。データの構造を考えると、配列構造もどのようにするか考える必要があります。データの更新タイミングも大事なポイントです。データの取り扱いを自由にできると、色々なプログラミングに応用ができます。

その他:Webシステムでのプログラミング

プログラミングというとコンソールでやっていくようなイメージがあり、何となく難しいイメージがあります。Webシステムでプログラムを作っていくと、外部設計と連動するので、実際にどのように動かすかがイメージしやすいです。Webシステムの場合は、データはデータベースと連携してやりとりする場合が多いです。データ構造(モデル)、ビュー(表示、表、グラフ)、コントローラ(プログラミング)のMVC環境で行っていくことで、自然にわかりやすいプログラムが書けるようになります。

以上、僕がプログラミングするときにやっている方法を書きました。プログラミングに苦手意識があった僕も、このような段階を踏んでいくことで、プログラミングに対して苦手意識がなくなり、どのようなプログラミングでもトライできるようになりました。特に、4で紹介した「型に当てはめる」ということで、大規模なプログラムもすっきり作れるようになります。中々細部まで説明が難しいですが、授業などで話す機会があれば触れていきます。頑張って下さい。