物体抽出したい画像が集まったら、オリジナルの学習モデルをカスタムラベルで作成します。
(1) Custom Labelsのプロジェクトを作成
Amazon RekognitionからCustom Labels -> Use Custom Labels -> Get Started -> S3バケットの作成をしていきます。このS3バケットに画像を入れて学習をしていきます。
物体抽出したい画像が集まったら、オリジナルの学習モデルをカスタムラベルで作成します。
(1) Custom Labelsのプロジェクトを作成
Amazon RekognitionからCustom Labels -> Use Custom Labels -> Get Started -> S3バケットの作成をしていきます。このS3バケットに画像を入れて学習をしていきます。
自分がターゲットにしたい対象物を認識させるためには、その対象物の教師画像を用意して学習させなければなりません。今回はFlickrという画像収集サイトのAPIを使って、まとめて画像を取得してきます。どのようなpython環境(Google Colab)でもできますが、ここではSageMakerで実施していきます。
(1) Flickr APIの用意
Flickrでは様々な画像を取得できますが、一度に取得するためには、APIを使った方が便利です。詳しいページもたくさんあるので、下記を参考にしてFlickr APIキーを取得して下さい。
https://worktoolsmith.com/flickr-api-key/
(2) ライブラリのインストール
最初にFlickr APIを使うためのライブラリをインストールしておきます。Jupyterファイルを用意して、ファイル名を付けて保存しておきます。そのファイルに下記2つのコマンドを書き、インストールします。
!pip install flickrapi
(3) プログラムの実行
最初に画像を格納するフォルダを作成します。今回は「image」とします。これをjupyterファイルと同じ階層に用意します。imageの中にキーワードをフォルダ名として作成し、そのキーワードフォルダの中に画像を10枚程度保存していきます。以下のプログラムを実行します。
プログラムをキーワードを富士山として実行すると、./image/富士山/ フォルダができ、その中に画像が格納されます。
他のキーワードでも検索を行うと、フォルダが作成され画像が格納されます。このような形で教師画像を取得することができました。
(4) 取得画像のダウンロード
S3にプログラムで転送してもいいのですが、ちょっと面倒なのでここでは、手元にダウンロードしてから、改めてS3にアップロードします。jupyterファイルに次を追加します。jupyterファイルと同じディレクトリにあるimageフォルダの中身を全てzip化します。
!zip -r image.zip ./image/*
zipファイルが作成されますので、ダウンロードして中身を確認して下さい。これでS3にアップする準備ができました。
Amazon Rekognitionを利用した、動画からのラベル抽出をやってみます。
(1) S3に解析用動画を準備する
動画からのラベル抽出をRekognitionをするには、S3に動画を保存する必要があります。短めの動画をS3にアップロードしておきます。前回作ったバケットに「video」というフォルダを作り、その中に動画をアップロードしておきます。動画はmp4かmovのようです。
(2)SagemakerでRekognition Video APIを利用前回S3上にアップした画像のラベル抽出ができました(https://smizunolab.blogspot.com/2022/08/aws-rekognition-1.html)。ただ、毎回S3に画像を直接アップロードするのは大変ですので、既に蓄えられている画像をS3にアップロードして、ラベル抽出をしやすくしたいと思います。環境はSagemakerでやりますが、boto3がインストールされていれば、自分の環境でも同様にできます。
(1) Sagemaker上に画像フォルダ「image」を用意します。
このimageの中にラベル抽出したいファイルを入れておきます。(2) S3上に転送されたファイルを格納するフォルダ「image」を用意します。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)プログラミングスキル向上のために、僕が考えていることを書いておきます。プログラミング言語は限定しませんが、オブジェクト指向型言語(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で紹介した「型に当てはめる」ということで、大規模なプログラムもすっきり作れるようになります。中々細部まで説明が難しいですが、授業などで話す機会があれば触れていきます。頑張って下さい。
AWS Academyに利用者(学生)として登録する方法です。
(1) メールを確認する。
教員がAWS Academyに学生を登録すると、以下のメールが来ます。
Get Started をクリックして、登録を行います。