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

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

<h1>つくるもの</h1>
AWS RekognitonをJavaで実装した顔認識アプリ

<h1>大まかな流れ</h1>
IAMユーザーを作成して、Rekognitionサービスにアクセスするための鍵取得→鍵を環境変数に設定→Javaソースコピペ

<h1>事前に用意するもの</h1>
EclipseでMavenプロジェクトを開発できる環境(Java8以上)
AWS無料アカウント

<h1>①AWSコンソールのIAMでユーザーを作成する</h1>
まずはJavaでAWSサービスを使うために必要なアクセスキーとシークレットキーを取得するため、IAMユーザー作成を行います。
<hr>
IAMをAWSコンソール上で検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/0ab79563-a1b6-647c-9cef-9bb6f44a0d5c.png)
<hr>
メニュー：ユーザーからユーザーを追加ボタンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/19a7ccff-6409-b798-07ed-087ad44ffc7a.png)
<hr>
ユーザー名を入力し、アクセスの種類で「プログラムによるアクセス」にチェックを入れ次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/ff90ccc5-0349-9117-59b1-7385ca29546d.png)
<hr>
「既存のポリシーを直接アタッチ」を選択し、Rekognitionで検索をかけAmazonRekognitionFUllAccessのチェックボックスにチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/3cc9736d-9ff8-385f-c52f-98a909647edd.png)
<hr>
この画面は何もしなくて問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/251a799a-cf1f-2443-79ac-39c1f297f84e.png)
<hr>
この画面もそのまま進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/275857d3-8d34-9c19-bd62-de3c935bb50a.png)
<hr>
この画面がとても重要です。アクセスキーIDとシークレットキーをメモします。シークレットアクセスキーはこの段階でしか見れないので、忘れてしまうとまたユーザーを作り直す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/83ab4a01-1a72-19a2-5f10-2a00045573cf.png)

<h1>②手順①で取得したキー2つを環境変数に設定する</h1>
JAVAの環境構築時にJAVA_HOMEを設定したと思いますがそれと同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/43dd0b77-43ea-5849-a5e1-9be716e19bcf.png)

<h1>③EclipseでMavenプロジェクトを作成する</h1>
Eclipseツールバーのファイル→新規→Mavenプロジェクト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/486d6a78-ee40-2bd5-ed5b-f1cf90b01b44.png)
<hr>
シンプルなプロジェクトの作成をチェックし次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/7e68fe23-6da5-e6a0-96d1-5b61bf9287c8.png)
<hr>
適当なグループIdとアーティファクトID入力し完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/ed0fc05c-8f43-2eab-104f-5179df579970.png)
<hr>
<h1>④Javaファイルを作成する</h1>
src/main/java上で右クリック→新規→クラス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/a4fad244-18bb-d09c-97fb-b48464adb721.png)
<hr>
名前を入力しどのメソッドスタブを作成しますか？はpublic static void...にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/66545aed-d473-6bf7-e0e7-4dc7306fb674.png)
<hr>
作成したクラス(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]
    }

}
```

<h1>⑤pom.xmlファイルに追記する</h1>
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>

```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/bc6183f7-b046-05b9-0a6f-ae9fc6dab71a.png)

メニューからJavaコンパイラーを選択し、Javaビルド・パス上の実行環境'J2SE-1.5'から準拠を使用のチェックを外し、プルダウンから自分か使うJavaのバージョンを選択し適用して閉じるを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/7ad83d2c-649e-f4fc-897e-9d0bbfa2e242.png)

<h1>⑥顔認識実行</h1>
プロジェクト名上で右クリック→実行→実行の構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1f24b817-8757-c4ae-8011-b15e29ea0909.png)
<hr>
プログラムの引数に、顔認識対象の画像の絶対パスを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/65a53778-ae19-bc9e-3ddd-2cf4e569374d.png)
<hr>
ちなみに笑顔pngの中身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1d7a419a-8444-51ee-4668-5b0ede6cd93f.png)
<hr>
コンソールを見てみると、画像の人は14-26歳の人で、笑顔という解析結果が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/411cc801-2b34-4f39-11b1-a8e261ccefe9.png)
<hr>
怒り顔でもやってみましょう。
<hr>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/63a2545d-f38b-8daf-73ad-8caeab94399d.png)
<hr>
コンソールを見てみると、画像の人は25-39歳の人で、笑顔ではないという解析結果が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/27141015-c2d1-a58f-0d8b-e6809085f793.png)

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