Amazon Rekognitionで犬と唐揚げを見分けるアプリを作ってみた

#はじめに

####1.「犬が唐揚げに見える」
というネタが2014年くらいに流行りました。
![mig.jpeg](https://qiita-image-store.s3.amazonaws.com/0/189055/f8329c6b-d57f-7e89-9543-14d8f31d93bd.jpeg)

####２.「Not Hotdog」の流行
2017年の5月くらいに「Not Hotdog」という、ファニーな画像解析アプリが流行りました。
[Not Hotdog on the App Store - iTunes - Apple](https://itunes.apple.com/us/app/not-hotdog/id1212457521?mt=8)
[元ネタ](https://www.youtube.com/watch?v=ACmydtFDTGs)
![not-hotdog.jpg](https://qiita-image-store.s3.amazonaws.com/0/189055/1db6b4a8-b53f-e1ce-5c69-66824370a52c.jpeg)

####３.「Amazon Rekognition」の誕生
Amazon Rekognitionという、深層学習に基づく画像認識APIサービスが開始されました。
たとえばホットドッグの画像をアップロードすると、画像を解析し、画像内にホットドッグがあることを返してくれます。
![スクリーンショット 2017-06-26 13.29.58.png](https://qiita-image-store.s3.amazonaws.com/0/189055/54da6f7e-966b-f43d-40bb-ffd7dce44da6.png)

####4.ということで
犬と唐揚げを見分けたい人のために、画像解析アプリを作ることにしました。

#事前準備

####・Identity Pool ID の作成
[New Identity Pool](https://console.aws.amazon.com/cognito/setup/step1/?region=us-east-1)にアクセスし、ウィザードに従ってIdentity Pool IDの作成を行います。
下記サイトに詳しい解説が載っているので、こちらを参考にしてください。
[[Amazon Cognito] Cognito の導入方法がより簡単になりました！ ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/amazon-cognito-update-20150120/)

####・IAMポリシーのアタッチ
作成したIDに、AmazonRekognitionFullAccessのポリシーをアタッチします。

#Androidアプリの作成

####１．ライブラリの追加
AmazonRekognitionのSDKをAndroidで使う場合、最低限これらのDependenciesが必要になります。

    compile 'com.amazonaws:aws-android-sdk-core:2.4.4'
    compile 'com.amazonaws:aws-android-sdk-rekognition:2.4.4'
    compile 'com.amazonaws:aws-android-sdk-cognito:2.4.4'


####２．AmazonRekognitionClientの作成
こんな感じで作ります。
事前準備で作成したIdentity Pool IDとRegionに適宜置き換えてください。


        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                getContext(), // Context
                IDENTITY_POOL_ID, // Identity Pool ID
                Regions.US_EAST_1 // Region
        );
        amazonRekognitionClient = new AmazonRekognitionClient(credentialsProvider);

####３．イメージの作成
この例ではBitmapをimageBytesに変換しています。
（もっとスマートなやり方があるかも）

            ByteBuffer imageBytes = null;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            imageBytes = ByteBuffer.wrap(baos.toByteArray());


####４．APIリクエストの作成
※　withImageにはnew Image()を渡す必要があります。これで数時間ハマりました。
詳しい説明は下記Stack Overflowをご参照ください。
[java - How can I DetectFaces in Amazon Rekognition AWS with Android Studio? - Stack Overflow](https://stackoverflow.com/questions/42041693/how-can-i-detectfaces-in-amazon-rekognition-aws-with-android-studio)

            DetectLabelsRequest request = new DetectLabelsRequest().withImage(new Image().withBytes(imageBytes)).withMaxLabels(10).withMinConfidence(77F);
            DetectLabelsResult result = amazonRekognitionClient.detectLabels(request);
            List<Label> labels = result.getLabels();



####５．完成
犬と唐揚げを見分けるアプリが出来ました。
![screenshot-3.png](https://qiita-image-store.s3.amazonaws.com/0/189055/ad96ba99-af47-f1ee-551a-0094638c6293.png)
![screenshot-4.png](https://qiita-image-store.s3.amazonaws.com/0/189055/8cdd216b-6233-df7d-7600-43326a298872.png)
![screenshot-5.png](https://qiita-image-store.s3.amazonaws.com/0/189055/715e81c9-72f0-e9bf-a60a-8f1363d2cfe1.png)


####６．おわり
AmazonRekognitionSDK for Androidの解説は以上です。

今回作成したデモアプリは下記からダウンロード可能です。
[not dog - Google Play の Android アプリ]
(https://play.google.com/store/apps/details?id=com.unoemon.notdog)

Githubでソースの全文を公開しているので、よろしければこちらもご参照ください。
Identity Pool IDの部分を置き換えることだけで、AmazonRekognitionを試すことが出来ます。
[unoemon/notdog: Realtime dog or not dog classification!](https://github.com/unoemon/notdog)