LoginSignup
1
1

More than 3 years have passed since last update.

(初心者向け)ほぼコピペでAWS SDK For Java2.0 Rekognitionのサンプルコード(Java)で顔認識してみた

Last updated at Posted at 2021-04-30

背景

GW暇ですね。お家で手軽に遊べる技術はないか?ということでAWSの公式DOCを見ていると面白そうな題材を発見しましたので試してみました。
https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/example_code/rekognition/src/main/java/com/example/rekognition

つくるもの

AWS RekognitonをJavaで実装した顔認識アプリ

大まかな流れ

IAMユーザーを作成して、Rekognitionサービスにアクセスするための鍵取得→鍵を環境変数に設定→Javaソースコピペ

事前に用意するもの

EclipseでMavenプロジェクトを開発できる環境(Java8以上)
AWS無料アカウント

①AWSコンソールのIAMでユーザーを作成する

まずはJavaでAWSサービスを使うために必要なアクセスキーとシークレットキーを取得するため、IAMユーザー作成を行います。



IAMをAWSコンソール上で検索
image.png


メニュー:ユーザーからユーザーを追加ボタンを選択
image.png


ユーザー名を入力し、アクセスの種類で「プログラムによるアクセス」にチェックを入れ次へ。
image.png


「既存のポリシーを直接アタッチ」を選択し、Rekognitionで検索をかけAmazonRekognitionFUllAccessのチェックボックスにチェックします。
image.png


この画面は何もしなくて問題ないです。
image.png


この画面もそのまま進みます。
image.png


この画面がとても重要です。アクセスキーIDとシークレットキーをメモします。シークレットアクセスキーはこの段階でしか見れないので、忘れてしまうとまたユーザーを作り直す必要があります。
image.png

②手順①で取得したキー2つを環境変数に設定する

JAVAの環境構築時にJAVA_HOMEを設定したと思いますがそれと同様です。
image.png

③EclipseでMavenプロジェクトを作成する

Eclipseツールバーのファイル→新規→Mavenプロジェクト
image.png



シンプルなプロジェクトの作成をチェックし次へ
image.png


適当なグループIdとアーティファクトID入力し完了
image.png


④Javaファイルを作成する


src/main/java上で右クリック→新規→クラス
image.png


名前を入力しどのメソッドスタブを作成しますか?はpublic static void...にチェック
image.png


作成したクラス(DetectFaces)ファイルに下記コードを入力。エラーが出まくりますが次の手順で解消します。
公式のGithubソースから変えてるのはRegionを東京(ap-north-east-1)にしているのとSysoutの一部を消しています。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;

import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.AgeRange;
import software.amazon.awssdk.services.rekognition.model.Attribute;
import software.amazon.awssdk.services.rekognition.model.DetectFacesRequest;
import software.amazon.awssdk.services.rekognition.model.DetectFacesResponse;
import software.amazon.awssdk.services.rekognition.model.FaceDetail;
import software.amazon.awssdk.services.rekognition.model.Image;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;


public class DetectFaces {

    public static void main(String[] args) {
        String sourceImage = args[0];
        Region region = Region.AP_NORTHEAST_1;
        RekognitionClient rekClient = RekognitionClient.builder()
                .region(region)
                .build();

        detectFacesinImage(rekClient, sourceImage );
        rekClient.close();

    }

    public static void detectFacesinImage(RekognitionClient rekClient,String sourceImage ) {

        try {
            InputStream sourceStream = new FileInputStream(new File(sourceImage));
            SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream);

            // Create an Image object for the source image
            Image souImage = Image.builder()
                    .bytes(sourceBytes)
                    .build();

            DetectFacesRequest facesRequest = DetectFacesRequest.builder()
                    .attributes(Attribute.ALL)
                    .image(souImage)
                    .build();

            DetectFacesResponse facesResponse = rekClient.detectFaces(facesRequest);
            List<FaceDetail> faceDetails = facesResponse.faceDetails();

            for (FaceDetail face : faceDetails) {
                    AgeRange ageRange = face.ageRange();
                    System.out.println("The detected face is estimated to be between "
                            + ageRange.low().toString() + " and " + ageRange.high().toString()
                            + " years old.");

                System.out.println("There is a smile : "+face.smile().value().toString());
            }

        } catch (RekognitionException | FileNotFoundException e) {
            System.out.println(e.getMessage());
            System.exit(1);
        }
        // snippet-end:[rekognition.java2.detect_faces.main]
    }

}

⑤pom.xmlファイルに追記する

projectタグの間に追記しctrl+Sなりで保存します。保存するとほとんど前手順のエラーが消えます。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.16.29</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>rekognition</artifactId>
        </dependency>
    </dependencies>

⑥コンパイラ設定

コンパイラがデフォルトで1.5などになってしまっている場合今回のコードだと扱えない箇所があるので自分が使うバージョンに設定します。プロジェクト名で右クリック→ビルドパス→ビルド・パスの構成

image.png

メニューからJavaコンパイラーを選択し、Javaビルド・パス上の実行環境'J2SE-1.5'から準拠を使用のチェックを外し、プルダウンから自分か使うJavaのバージョンを選択し適用して閉じるを押す。
image.png

⑥顔認識実行

プロジェクト名上で右クリック→実行→実行の構成
image.png



プログラムの引数に、顔認識対象の画像の絶対パスを入力
image.png


ちなみに笑顔pngの中身です。
image.png


コンソールを見てみると、画像の人は14-26歳の人で、笑顔という解析結果が出ます。
image.png


怒り顔でもやってみましょう。


image.png


コンソールを見てみると、画像の人は25-39歳の人で、笑顔ではないという解析結果が出ます。
image.png

感想

特に機械学習の知識や技術力がなくても楽しめました。今後はフロントでファイルアップロード機能なりカメラ機能(フロント?Kotlin)なり実装して、連携してもっと身近なものも作りたい所存です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1