Download - JAWSDAYS2016 Technical Deep DIVE
JAWSDAYS2016 3月12日(土) ベルサール新宿グランド
Cognitoでお手軽
クラウドソーシング
AWS Technical Deep Dive 発表資料 発表:足立 陽一 サンプルアプリ:じえんちゃん 資料:山口 陽平
1
今日話すこと
• 自己紹介 & 会社紹介
• 来栖川電算の業務
• Cognito
• Cognito Identity の基本フロー
• サンプルアプリの実装
• サンプルアプリによる実験
• まとめ
つぶやくなら ⇒ #jawsdays #jawsug
2
足 立 陽 一 @adacola
• 所属
–有限会社 来栖川電算
• 自己紹介
–アプリ、サービス、インフラ、機械学習と色々手掛けるエンジニア。仕事では Scala を使っているが個人的には F# が好き
• 好きなAWS
– Cloud Formation,S3,Lambda
4
じえんちゃん @ZiQwx
• 所属
–有限会社 来栖川電算
• 自己紹介
–毎朝体操、認識アプリ、コンパイラ、開発環境、ゲームなどなんでも作るエンジニア。いろんな技術に挑戦したい年頃。
• 好きなAWS
– API Gateway,Lambda
山 口 陽 平 @melleo1978
• 所属 & 経歴 – 有限会社 来栖川電算 取締役
– Mashup Awards 9 優秀賞受賞
– 名古屋工業大学大学院 博士前期課程修了
– IPA未踏ソフトウェア創造事業 採択
• 自己紹介 企画 ~ 実装まで全部やる人
– 認識技術 & アルゴリズム の研究開発
• 文字認識,物体認識,動作認識,行動認識
– 言語処理系 の研究開発
• 分散DB,仮想機械,コンパイラ
• 好きなAWS S3,DynamoDB
※実物に髪の毛はありません。
6
山 口 陽 平 @melleo1978
• [実践]画像認識 を執筆 WEB+DB PRESS Vol.83
–これから画像認識をはじめる人におススメ
7
– OpenCV の使い方や実装例
– SIFTなどの各種アルゴリズムや特定物体認識のしくみ
–精度改善への取り組み方
来栖川電算 設立 2003年(名古屋工業大学発ベンチャー) 従業員 36人
• SF世界の技術を実現し、社会に役立てる
–人工知能技術のライセンス販売・研究・SI
• 文字認識,物体認識,動作認識,行動認識
–スマホアプリの企画・制作・運営
スマートライフ技術
NTTドコモ様との共同研究
スマートドライブ技術
大手自動車メーカー様むけ
メイドさん もふくめて
8
来栖川電算 様々なアルゴリズムを駆使する技術者集団
• 様々な認識技術
–文字認識,物体認識,モーション認識
• 限界性能を引き出す優れた実装技術
–機械学習・コンパイラ・データベース・仮想機械などのアルゴリズムとバイナリハック
• 高速化,並列化,分散化,省空間化,高精度化
• ビジネスを差別化する認識エコシステム
–スケールに応じた仕組,競争力の自動強化
9
通称:東北の方々 在宅データ入力部隊 ※主に主婦 ※震災がきっかけで雇用
• 様々な認識タスクのためのデータを入力 – 文字認識,画像検索,物体検出,シーン分類,行動推定,ダンス採点,…
• ダンス採点:音楽に合わせた動作データ – 一般体操:ラジオ体操,アルゴリズムこうしん/体操,ようかい体操,くまモン体操,…
– 企業体操:製鉄系,自動車系,福祉施設系,…
– アイドル:プリキュア,ラブライブ,AKB,…
– 伝統舞踊:郡上おどり,…
– ※よいデータを作るために、しっかり練習!
12
教師エディタ 東北の方々が使うアプリ 認識タスクごとに開発
• データ入力機能 ← ここに専念したい
–認識タスクによって全く異なる UI
• ユーザ管理機能 ← Cognito Identity
–ユーザIDの発行・認証・認可,…
• データ保管機能 ← S3, DynamoDB, Cognito Sync
–データ同期(デバイス⇔クラウド)
• 進捗管理機能 ← DynamoDB
–タスクの割り当て・検収,統計,…
13
Cognito EC2レスでクラウド上にユーザ領域を確保可能
• Cognito Identity ← 今日はココを説明
– アプリ用のユーザIDプール • 外部ユーザIDとの紐づけ
– AWS資源のユーザ領域への安全なアクセス • S3,DynamoDB,…
• Cognito Sync – データのオフライン編集
– ユーザのデータ同期
• デバイス⇔クラウド,デバイス間
• 更新のプッシュ通知
15
Cognito Identity ユーザ認証機構を外部化したユーザID管理サービス
• 認証済ユーザID(紐づけ) – 外部ユーザID(認証済)に対応するIdentityIdを発行
– 様々なユーザ認証機構(IDプロバイダ)で可能
– パスワードの変更や再発行などの管理が不要
• 未認証ユーザID(ゲスト) – 認証していなくてもIdentityIdを発行
– ユーザ登録手続きが不要
• ユーザIDのマージ(名寄せ) – 実は同じユーザでしたに対応可能
• AWS資源のユーザ領域への安全なアクセス – アプリへ認証情報を埋め込まないので安全
– きめ細やかに制限可能な期限付き認証情報なので安全
16
主に4パターン IDプロバイダの種類 × ロールの種類
• IDプロバイダ
–一般的:Amazon,Facebook ,Google+,Twitter,OpenId Connect
–独自:上記でないもの
• ロール
–静的:あらかじめ設定したロール
–動的:ユーザや状況ごとに変化するロール
18
アプリの仕様 加速度データを S3 へ保存 ※ダンスのデータ収集に使える
• 機能
– ①加速度データを記録後、S3 へアップロードするボタン
– ②現在のユーザを新しいゲストユーザにするボタン
– ③現在のユーザに Google+ のアカウントを紐付けるボタン
– ④現在のユーザに Amazon のアカウントを紐づけるボタン
– ⑤現在のユーザの IdentityId
– ⑥現在のユーザが過去に S3 へ保存した加速度データの一覧
• 制限 – アプリには紐付けを解除する方法がないので、マネージメントコンソールなどから解除対象の IdentityId を削除してください。
24
⑤
⑥
Cognito の設定 ソーシャルログインの設定に慣れていればすぐ
• ①プール名 – Identity ID の名前空間
• ②プール ID – アプリから Cognito への
Web API 呼出に必要
• ③ロールの設定 – 未認証ユーザと認証済ユーザの IAM ロール • 同じ内容に設定
• ④未認証ユーザの設定 – ゲストユーザの有無
• 有に設定
• ⑤認証済ユーザの設定 – Cognito から ID プロバイダへの Web API 呼出に必要 • Amazon App ID と Google
Client ID を入手し設定
25
①
②
③
④
⑤
{"Version":"2012-10-17", "Statement":[ {"Effect":"Allow", "Action":["cognito-identity:*“], "Resource":[ "arn:aws:cognito-identity:ap-northeast-1:266204898704:identitypool/ap-northeast-1:c488a352-92f7-4d83-8daa-fa1549854748“ ]}, {"Effect":"Allow", "Action":["s3:ListBucket“], "Resource":[ "arn:aws:s3:::sandbox.cognito.sample“ ], "Condition":{ "StringLike":{"s3:prefix":["cognito/sample/${cognito-identity.amazonaws.com:sub}/*“]} }}, {"Effect":"Allow", "Action":["s3:GetObject", "s3:PutObject", "s3:DeleteObject“], "Resource":[ "arn:aws:s3:::sandbox.cognito.sample/cognito/sample/${cognito-identity.amazonaws.com:sub}", "arn:aws:s3:::sandbox.cognito.sample/cognito/sample/${cognito-identity.amazonaws.com:sub}/*" ]} ]}
ロールの設定 S3 のパスに対する操作を限定する内容
• Identity ID のプレースホルダ
–ユーザ領域を分割するときに使用
– ${cognito-identity.amazonaws.com:sub}
26
アプリのビルド Android Studio 1.3.2 以上の環境で次の手順を実施
1. 次の URL からソースコードを入手
– https://bitbucket.org/maiasa/cognito_identity_sample
2. strings.xml の赤文字を修正
3. Gradle でビルド
27
<resources> <string name="app_name">Cognito Identity Sample</string> <string name=“amazon_cognito_identity_pool_id”>「Cognito の設定」に登場した Cognito Pool ID を設定</string> <string name=“google_auth_client_id”>「Cognito の設定」で設定した Google Client ID を設定</string> <string name=“bucket_name”>加速度データを保存する S3 Bucket を作成し、その名前を設定</string> <!-- これらの値を設定するとBasicフローになります。設定しない場合(空文字)はEnhancedフローになります。 --> <string name="aws_account_id"></string> <string name="unauth_role"></string> <string name="auth_role"></string> </resources>
cognito_sample/app/src/main/res/values/strings.xml
アプリの動作確認 便利なコンソールで実行結果を覗いてみよう!
• Dashboard
– IDプロバイダごとのログイン回数をグラフ化
• Identity Browser
–発行された IdentityId の確認・削除
28
実験1:ゲスト 未認証ユーザが自分の領域へ書き込む
• 手順
1. ②で現在のユーザをゲストユーザにする。
2. ①で加速度データを記録し、アップロードする。
3. ゲストユーザ領域(赤枠の
IdentityId の含まれる S3 パス)に加速度データ(緑枠のファイル)があるかを確認する。
30
実験2:紐付け 認証済ユーザを2個作り、加速度データを記録する
• Amazon アカウントと紐づいた認証済ユーザ A を作る(+データも記録する)手順
1. ②で現在のユーザをゲストユーザにする。
2. ④で Amazon のアカウントと紐付ける。
3. ①で加速度データを記録する。
• Google+ アカウントと紐づいた認証済ユーザ G を作る(+データも記録する)手順
1. ②で現在のユーザをゲストユーザにする。
2. ③で Google+ のアカウントと紐付ける。
3. ①で加速度データを記録する。
31
実験3:切り換え ユーザを切り替え、データも切り替わるか確認する
• ユーザ A への切り替え手順
1. ②で現在のユーザをゲストユーザにする。
2. ④で Amazon のアカウントと紐付ける。
• ユーザ G への切り替え手順
1. ②で現在のユーザをゲストユーザにする。
2. ③で Google+ のアカウントと紐付ける。
• サンプルアプリでは
– 切り換え = ゲストに紐付け
32
実験4:名寄せ 2つのユーザを名寄せし、データを確認する。
1. ユーザ A へ切り替える。
1. ②で現在のユーザをゲストユーザにする。
2. ④で Amazon のアカウントと紐づける。
2. ユーザ G と名寄せする。
1. ユーザ A のまま、③で Google+ のアカウントと紐づける。
3. ユーザ G に切り変わらず、ユーザ A のデータが表示されたままか確認する。
– ユーザ G はユーザ A に名寄せされ消滅
– 名寄せイベントはとれるのでデータ移行は可能
33
まとめ Cognito の可能性:どのように使うと捗るか?
• EC2 レスでもリッチな機能 – クラウド上に安全なユーザ領域を実現
• 例:ヘルスケアデータの蓄積
– クラウドストレージ経由の安全なユーザ協調 • 例:ヘルスケアデータの統計・ランキング
• 必要になるまでユーザ登録を遅延 – 初回起動時の情報入力による離脱率上昇を抑制
• 外部アカウントの紐付けによるデータ移行 – パスワード的なものの管理やトラブルからの解放
• サービスごとに閉じたユーザID – トラッキングリスクの低減
35
スタッフ募集中 学生さん、転職者さん、力を貸して!
• 研究(認識技術) – 機械学習・アルゴリズム・高速化・省メモリ・画像・センサーに関する知識,Java,C++
• 開発(サーバサイド) – プロセス・アーキテクチャ・ミドルウェア・ネットワークに関する知識,Scala,Java,C++
• 開発(フロントエンド)
– UI/UX・Android・iOSに関する知識,JavaScript
• 企画(認識アプリ・認識サービス)
– 新しい習慣を考える力,普及のためのアイデア
37
オフィス 必要なら増やすよ!在宅もOK
• 気軽に遊びに来てね!
–見学できて、ご飯も食べれて、泊まれる。
名古屋本社(2013年フロア増設)
イオン千種・名大病院・名工大の近く
上野支社(2012年開設)
入谷駅・鶯谷駅・上野駅の近く
38
情景画像文字認識とは
いわゆる “OCR” とは ”扱う画像” が違う
• 悪環境下での文字認識 –手書き・様々な書体・かすれ・点描・きついパース・統一性のない並び・逆光・陰・影・グラデーション・モアレなど
• 使える場面
–屋外でのスマホカメラを使った棚卸し
–車載カメラからの標識認識
–商品パッケージからの成分情報抽出
–キーワードによるアルバム・ビデオの頭出し
42
事例:1000sors 誰でも簡単に使えるクラウド型物体認識エンジン
• 広い適用範囲 – 照明姿勢の変化に強く、様々な撮影環境に対応
• 驚異的な精度 – 数十万種類をほぼ完ぺきに識別
• 圧倒的な性能 – たった1台のPCで100万種類を瞬時に識別
– 台数を増やせばリニアにスケールアウト
48
事例:Cellars 18万件のワインラベルを認識するアプリ
• 世界で賞を獲得したアプリをダウンロード! – Asia Smartphone Apps Contest
• 広告マーケティング部門 Silver Award 2位
– 立命館大学 学生ベンチャーコンテスト • 最優秀賞 NICT賞
52
事例:画像認識API 画像を送るだけで写っている商品の情報を取得
• 登録商品:500 万件以上(昨年10月)の市販商品
–書籍,DVD,CD,PCソフト,ゲームソフト,食品パッケージ,… どんどん増加中
• 定期更新:網羅性 と 認識精度 の改善
–データ追加,パラメータ・アルゴリズム改良
54
開発者は今すぐ登録! ⇒ https://dev.smt.docomo.ne.jp
事例:画像認識API だれでも、かんたんに、マッシュアップ!
• docomo Developer support より提供中
画像認識 画像に写っている物体の情報を取得
環境センサー 日本全国の気温、降水量、紫外線量を取得
音声認識 話した内容を即座に文字に変換
雑談対話 自然な会話をやり取り
知識Q&A 今知りたいことをピンポイントで回答
音声合成 入力した文字を読み上げ
トレンド記事抽出 今人気の話題をジャンルやキーワードで検索
文字認識 画像の文字を読み取り
発話理解 要求を理解して、適切な機能を提示
動作推定 行っていた動作の推定
55
事例:動作推定API ドコモ と 来栖川電算 の共同研究
• 加速度データから人の動作や行動を検出
–静止,歩き,走り,自転車,睡眠,食事
• 動作と直接対応しない行動も検出可能
• スマホ・スマートウォッチに対応
– Android,Android Wear,… • 加速度データにアクセスできる API を備えたウェアラブルデバイス
– ※次の画像は画像中のデバイスに対応していることを保証するものではありません。
58
開発者は今すぐ登録! ⇒ https://dev.smt.docomo.ne.jp
事例:動作推定API だれでも、かんたんに、マッシュアップ!
• docomo Developer support より提供中
画像認識 画像に写っている物体の情報を取得
環境センサー 日本全国の気温、降水量、紫外線量を取得
音声認識 話した内容を即座に文字に変換
雑談対話 自然な会話をやり取り
知識Q&A 今知りたいことをピンポイントで回答
音声合成 入力した文字を読み上げ
トレンド記事抽出 今人気の話題をジャンルやキーワードで検索
文字認識 画像の文字を読み取り
発話理解 要求を理解して、適切な機能を提示
動作推定 行っていた動作の推定
59
事例:ライフログ ドコモの動作推定APIの応用例
60
開発者は今すぐ確認! ⇒ https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=127