1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

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

JAVAの環境構築時にJAVA_HOMEを設定したと思いますがそれと同様です。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/43dd0b77-43ea-5849-a5e1-9be716e19bcf.png)

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

Eclipseツールバーのファイル→新規→Mavenプロジェクト ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/486d6a78-ee40-2bd5-ed5b-f1cf90b01b44.png)
シンプルなプロジェクトの作成をチェックし次へ ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/7e68fe23-6da5-e6a0-96d1-5b61bf9287c8.png)
適当なグループIdとアーティファクトID入力し完了 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/ed0fc05c-8f43-2eab-104f-5179df579970.png)

④Javaファイルを作成する

src/main/java上で右クリック→新規→クラス ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/a4fad244-18bb-d09c-97fb-b48464adb721.png)
名前を入力しどのメソッドスタブを作成しますか?はpublic static void...にチェック ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/66545aed-d473-6bf7-e0e7-4dc7306fb674.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1f24b817-8757-c4ae-8011-b15e29ea0909.png)
プログラムの引数に、顔認識対象の画像の絶対パスを入力 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/65a53778-ae19-bc9e-3ddd-2cf4e569374d.png)
ちなみに笑顔pngの中身です。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/1d7a419a-8444-51ee-4668-5b0ede6cd93f.png)
コンソールを見てみると、画像の人は14-26歳の人で、笑顔という解析結果が出ます。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/411cc801-2b34-4f39-11b1-a8e261ccefe9.png)
怒り顔でもやってみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/63a2545d-f38b-8daf-73ad-8caeab94399d.png)
コンソールを見てみると、画像の人は25-39歳の人で、笑顔ではないという解析結果が出ます。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/27141015-c2d1-a58f-0d8b-e6809085f793.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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?