Amazon RekognitionをSDKから使ってみました #reinvent

reinvent2016_eyecatch

こんにちは、小澤です。

今回はre:Invent 2016で発表されたAmazon RekognitionをSDKから使ってみたいと思います。

Rekognitionとは

Deep Learningを利用した画像解析のサービスです。 できることとしては

  • どのようなものが写っているかのラベル情報取得
  • 画像から顔の位置を取得
  • 2枚の顔画像中の同一人物取得
  • の3つのようです。
    ラベル情報の取得をWeb上から行ってみるとこのように取得できます。

    スクリーンショット 2016-12-02 11.35.14

    SDKを使ってみる

    今回はGetting Started with Amazon RekognitionのStep4にあるExercise 1: Detect Labels in an Image (API)ベースにSDKから動かしてみたいと思います(他の2つも使い方はほぼ変わらないため、掲載するのはDetect Labelsのみにします)。

    awscliからの実行

    まずは、awscliを最新版にしておきます。 また、credencialの設定は行っているものとします。

    pip install -U awscli
    

    サンプルでは、S3上にある画像を利用しているので、S3上に解析したい画像をアップロードしておきます。 awscliからの利用は非常に簡単です。
    --imageオプションでjson形式のデータを渡してやっています。内容としても解析しい画像とBucketを指定しているだけになります。

    $ aws rekognition detect-labels --image '{"S3Object":{"Bucket":"<bucket name>", "Name":"<image file>"}}' --region us-east-1
    {
        "Labels": [
            {
                "Name": "Comics",
                "Confidence": 90.87444305419922
            },
            {
                "Name": "Manga",
                "Confidence": 90.87444305419922
            },
            {
                "Name": "Face",
                "Confidence": 52.16993713378906
            },
            {
                "Name": "Selfie",
                "Confidence": 52.16993713378906
            },
            {
                "Name": "Head",
                "Confidence": 51.08589553833008
            },
            {
                "Name": "Portrait",
                "Confidence": 51.08589553833008
            },
            {
                "Name": "Glasses",
                "Confidence": 50.81120300292969
            },
            {
                "Name": "Goggles",
                "Confidence": 50.81120300292969
            },
            {
                "Name": "Person",
                "Confidence": 50.53571319580078
            }
        ]
    }
    

    Javaから実行

    サンプルではもう一つ、JavaのSDKの使い方も書かれていますので、こちらも試してみます。 今回は内容を簡単にするため、例外処理などの部分を取り除いて記述してみました。

    import com.amazonaws.services.rekognition.AmazonRekognitionClient;
    import com.amazonaws.auth.AWSCredentials;
    import com.amazonaws.auth.profile.ProfileCredentialsProvider;
    import com.amazonaws.services.rekognition.model.DetectLabelsRequest;
    import com.amazonaws.services.rekognition.model.DetectLabelsResult;
    import com.amazonaws.services.rekognition.model.Image;
    import com.amazonaws.services.rekognition.model.S3Object;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class DetectLabels {
        public static void main(String[] args) throws Exception {
            AWSCredentials credential = new ProfileCredentialsProvider("default").getCredentials();
            DetectLabelsRequest request = new DetectLabelsRequest();
    	request.withImage(new Image().withS3Object(new S3Object().withName("<image file>").withBucket("<bucket name>")));
            request.withMaxLabels(5);
    
            AmazonRekognitionClient client = new AmazonRekognitionClient(credential);
            DetectLabelsResult result = client.detectLabels(request);
            ObjectMapper objectMapper = new ObjectMapper();
            System.out.println(objectMapper.writeValueAsString(result));
        }
    }
    

    依存するjarのバージョンは1.11.62になります。 mavenであれば以下のような依存を記述します。

    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk</artifactId>
      <version>1.11.62</version>
    </dependency>
    

    fat jarなどを作成し、実行してみると

     java -cp target/rekognition_example-0.1.jar DetectLabelsExample | jq
    {
      "sdkResponseMetadata": {
        "requestId": "4e386767-b837-11e6-9587-b71eece4b016"
      },
      "sdkHttpMetadata": {
        "httpHeaders": {
          "x-amzn-RequestId": "4e386767-b837-11e6-9587-b71eece4b016",
          "Connection": "keep-alive",
          "Content-Length": "254",
          "Date": "Fri, 02 Dec 2016 02:30:39 GMT",
          "Content-Type": "application/x-amz-json-1.1"
        },
        "httpStatusCode": 200
      },
      "labels": [
        {
          "name": "Comics",
          "confidence": 90.874466
        },
        {
          "name": "Manga",
          "confidence": 90.874466
        },
        {
          "name": "Face",
          "confidence": 52.169945
        },
        {
          "name": "Selfie",
          "confidence": 52.169945
        },
        {
          "name": "Head",
          "confidence": 51.085896
        }
      ],
      "orientationCorrection": null
    }
    

    のように同様にjson形式で結果を返してくれました。

    おまけ:顔として検知されるものは?

    さて、こういったサービスをみるとどんなものが認識されるのか気になってきます。
    そこで、顔検出でいくつか試してみましょう。

    まずは、問題なく検出できそうな、『モナ・リザ』。こちらはうまくいきました。

    スクリーンショット 2016-12-02 12.05.31

    では、『叫び』はどうでしょう?こちらはダメなようです。

    スクリーンショット 2016-12-02 12.06.58

    つぎは私がTwitterなどのアイコンで利用している初音ミクのフィギュアをやってみます。 こちは顔ではないところも認識されてしまっていますが、顔の部分はうまくいっているようです。

    スクリーンショット 2016-12-02 12.08.26

    最後にアニメキャラをやってみます。
    アニメキャラの顔認識はなぜか盛り上げることも多いので、ひょっとすると対応しているかもしれません。

    スクリーンショット 2016-12-02 12.11.44

    残念ながら認識できませんでした。

    終わりに

    Rekognitionは利用者がデータを用意し、学習を行ってからモデルを利用するのではく、学習済みのモデルを利用してのサービス提供となっているようなので非常に手軽に利用できます。 ただし、ラベルのつけ方を変えたい、人間の顔ではなく動物を認識させたいなど、学習済みのモデルが実際の利用シーンに合わない場合はそのまま使うことはできません(先ほどの実在する人物ではなくアニメキャラの顔を認識させるのもこの例です)。
    機械学習を利用したサービスは内部がブラックボックス化しやすいですが、何がどこまでできるのかは意識しておくといいでしょう。
    とはいえ、提供されているものだけでもかなりのことができるようになっているくらい、Deep Learningを利用した画像認識は利用価値のあるものになっているかと思います。

    AWS Cloud Roadshow 2017 福岡