Google Duplexのまとめ

Google Duplex

はじめに

ユーザーの代わりに電話予約を行ってくれるというGoogleのAIシステム(Google Duplex)が発表されました。 デモの動画を見て、これはすごそうだと思ってgoogleのブログを読んで見ました。要点をまとめます。

元サイト: ai.googleblog.com

概要(Duplexとは)

  • 電話上での現実世界のタスクを実行する技術。
  • 可能なかぎり自然に会話することで、人も機械に合わせることなく応答できる。
  • 閉じた環境(レストランの予約や散髪の予約等の特定のシチュエーションに絞って)で使用する。
  • ヘアーカットの予約・レストランの予約(デモ参照)
    • ヘアーカットの例: (Duplex) 3rd Mayに予約したい。
      (店員)何時に?
      (Duplex) 12PM
      (店員)12PMは無理。最速で1:50PMなら可能
      (Duplex)10AM-12PM はどう?
      (店員)サービスによるけど何をご希望?
      (Duplex)女性のヘアーカット
      (店員)10AMならOK
      (Duplex)じゃあ10AMでお願い。
      (店員)ファーストネームを教えてください。
      (Duplex)リサ
      (店員)確認のため予約内容を復唱...

Duplexの特徴

  • 理解、振る舞い、タイミング、発話の工夫でDuplexは自然に聞こえる。
  • RNNをベースにしている。TFX(TensorFlow Extend)でハイパーパラメータ最適化を行う。
  • 匿名化された電話の会話コーパスをトレーニングに使った。タスクごとに別々のモデルとして学習したが、タスク間でコーパスの共有は行った。
  • ASR(automatic speech recognition)を使用(音声、会話履歴、会話のパラメータに関して)

自然に聞こえる

  • TacotronとWaveNetを用い、イントネーションを制御するため、TTS(text to speech)と音声合成を行った。
  • 相槌(hmmとかuh)を入れて、自然に聞こえるようにした。(処理中であることを自然に伝えることができる)
  • 応答までの時間を人の期待に合わせることが重要。 簡単な返答を求められたとき(helloとか)は、高速で低信頼のモデル利用。難しい返答は応答までの時間を置くと より自然に聞こえる。

システムのオペレーション

  • 人の介入なしに完全自動で応答することができる。もし自動で応答できないと判断したときは(通常でない複雑なスケジューリングとか)、対応できる人間のオペレータにつなぐ。
  • システムを新たな領域で訓練するときは、リアルタイム教師あり学習 を実施した。
  • Duplexでは経験のあるオペレータが教師として訓練を行う。応答中都度必要があれば、オペレータがーシステムの振る舞いに干渉する。これを応答が十分なクオリティに達するまで続ける。

Duplex利用のメリット

  • 客に予定のリマインドをし、同時にキャンセルやリスケジューリングを簡単にさせることを可能にし、連絡なしキャンセルを防ぐことができる。
  • 非同期にビジネス者側とユーザーのコミュニケーションを行うことができるようになる。営業時間外や電話できない時でも予約リクエストを行い、 Duplexが代わりに予約を取ってくれる。耳の不自由な人や現地語を喋れない人でも電話予約が可能になる。

その他

  • この夏に「レストランの予約・ヘアサロンの予約・休日の問い合わせ」のタスクに関して、googleAssistantを使ってDuplex技術の実験を開始する。

まとめ

  • ヘアーカットやレストランの予約は人間がやってるんじゃないかと疑いたくなるクオリティの高さ。
  • 汎用的な応対ができるシステムではなさそう。特定のシチュエーションに特化することで自然な会話感を出している模様。
  • 質問の回答難易度でモデルを切り替えるというのは面白い発想。どうやって切り替えるのかの判定が難しそうではあるが...
  • リアルタイム教師あり学習のやり方が気になる。誤りをその都度訂正していくとのことだが、効率的にやるのは難しそう。
  • この夏はレストランに電話予約が殺到し、電話で散髪のための予約をする人がやたら増え、休日がいつかを問い合わせる電話が殺到しそうw

機械学習セミナー参加記録(某有名企業主催)

プレゼンテーションとポスターセッションがあった。

(一つ目) 発表者:大学の先生

出力種類が複数あるタスクの効率的な学習の進め方に関する研究。

重み付きヘテロジニアスマルチタスクラーニングという手法を提案。
Task-wise early stopping:条件を満たしたタスクの学習を停止
例えば目・鼻・口を検出する教師あり学習をする場合に、目の検出精度が高くなったが、鼻・口の精度が高まらないときに、目のネットワークの学習率を落とし(止めて)、鼻・口の学習を重点的にさせると言った工夫を行う。
またGAN+属性推定(男・女、笑っている、メガネかけているなど)を別の入力して投入するマルチタスクで、 生成する画像の特定の属性を操作することができるようになる。
例:男かつ笑っていない生成画像と笑っている生成画像をパラメータを一ついじり変化させることができる

参考論文:
http://personal.ie.cuhk.edu.hk/~ccloy/files/eccv_2014_deepfacealign.pdf
DSSD:複数の層から予測を行うマルチタスクな物体検出
https://arxiv.org/pdf/1701.06659.pdf

(二つ目)発表者:主催企業の従業員

アノテーション作業の負担軽減に関する研究

1、RNNを使ってアノテーションを半自動化する手法
矩形で物体を囲むとその物体の詳細な境界を自動で表示してくれる。しかも点群で囲まれるので、アノテーションが間違っている場合、手動でその点を動かしてより良いアノテーションに修正することができる。またアノテーターが複数人いる場合に必ず発生してしまう囲み具合の個人差を少なくすると言った作業平準化にも役立つ可能性あり。
->データの質向上にも
参考論文:
https://arxiv.org/pdf/1704.05548.pdf

2、様々センサーを組み合わせて教師データを自動作成する。 (センサー間の情報統合作業、すなわちキャリブレーションが難しいらしい)
参考論文:
https://arxiv.org/pdf/1610.01238.pdf
https://pdfs.semanticscholar.org/ed15/5d1a146e0cba6be98fd7128461439f88732a.pdf https://pdfs.semanticscholar.org/1f97/022c8c826c1eb51de9e810d3dd07620fc902.pdf

コメント:金ないとできない…

3、CGによる学習データ自動生成
UnityやUnrealEngineで教師データを作成する手法に関する研究。自動車に関しては、イノシシが飛び出してきた場合の検出や、人が飛び出してきた場合の検出等、実物ではなかなか実現できないシチュエーションを簡単に作成できるメリットがある。ただし、CGのクオリティによって作成された教師データの質が変化する模様。
参考論文:
http://refbase.cvc.uab.es/files/RSM2016.pdf
https://arxiv.org/pdf/1612.02401.pdf

4、GANで教師データを作成する方法
あまりよくわからなかったが、車をアノテーションする場合に、車の画像をGANで生成し、アノテーションに使う(セグメンテーションされた画像もペアとしてGANで生成?)
参考論文:
GANをSemantic segmentationに応用した方法:
https://arxiv.org/pdf/1703.09695.pdf
視線検出タスクにGANとCGを組み合わせた方法:
https://arxiv.org/pdf/1612.07828.pdf

ポスターセッション(内容のみ)

  • 半導体をAIで生成 (専門外でよくわからなかった)
  • 強化学習の事例紹介(印象に残ったのは多関節ロボットに強化学習でフリースローを学習させるというもの。何百回かトレーニングして、フリースロー成功率を100%にしたらしい)
  • seq2seqの出力を変えて、seq2move?のようなものを作成したというもの。(移動指示を文で入れるとロボットの動き(関節移動角など)が出力されるというもの)
  • AIの品質・法的責任?(専門外でよくわからなかった)

総評

主催企業のリクルーティング目的のセミナーだと思っていたが、発表の質は高い・無料・食事だったのでかなり有意義であった。 アノテーションを自動化するツールは試してみたい。フリースローの実演を見て見たい。

ARKitを使ってiPhoneをホロレンズっぽい(透過型 MR)デバイスにする試み

ARKitを使ってiPhoneをホロレンズっぽい(透過型 MR)デバイスにする試み

ARKitでiPhoneでもカメラのイメージに仮想物体を置くことができるようになったという話を聞いて、「それなら頑張ればVRメガネ使って、ホロレンズみたいな擬似MRデバイスが実現できるのでは?」と思い試してみた。

カメラ画像をそのまま画面左右に配置してVRゴーグルで除けばそれっぽくなるのでは?と思ってたが、結果として意外とカメラの歪みとか、現実との表示のずれ(目線とカメラの位置が厳密に一致しないため?)等でVR酔い(MR酔いと呼ぶべきか?)しそうなアプリとなってしまった。もっともUnity側でカメラの角度を調整したりして、より現実に近づけることはできるかもしれない。

あと当然だが、ホロレンズほど現実空間に仮想物体を張り付かせるようなことは難しそう。またAirTapはもちろん使えない。(手を画像認識してジェスチャー対応させるとかやってみたい気もするが難しそうだし、精度が出なさそうな気がしてならない)

今回試した手順は以下の通り。

環境:

  • Macbook Pro 2017 13inch(Sierra)
  • iPhoneX(実機デバック用)
  • Xcode9.2
  • Unity 2017.2
  • VRゴーグル(iPhoneのカメラを遮蔽しないもの) (注意 ARKit Pluginの要求でUnityのバージョンが5.6.2以上である必要あり。)

手順:

  1. UnityでアセットストアからUnity ARKit Pluginをインポート

  2. Hierarchyで空のオブジェクトを作成、その中にカメラオブジェクトを二つ設置(デフォルトであるカメラをコピーするのでOK)

  3. 2つのカメラの名前を適切に変更、InspectorのCameraで Viewport Rectをそれぞれ図のように変更(表示画面を二つに分割し、iPhone上で二つの画面が並列に表示されるようする) またそれぞれのカメラに「Unity AR Video」,「Unity AR Camera Near Far」をアタッチする。(Clear MaterialはYUVMaterialを設定)

f:id:hygradme:20180205212613p:plainf:id:hygradme:20180205212617p:plain

4.新規C#スクリプトをProject上にで作成、以下を記述する。

参考:http://edom18.hateblo.jp/entry/2017/11/06/081821

なお通常使用するUnityARKitPluginのUnityARCameraManagerは1カメラを対象として設定しないといけないため、 2画面表示する今回の目的ではそのコードを変更をする必要がある。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.iOS;
public class CustomARCamera : MonoBehaviour {

    public Transform target;
    public UnityARAlignment startAlignment = UnityARAlignment.UnityARAlignmentGravity;
    public UnityARPlaneDetection planeDetection = UnityARPlaneDetection.Horizontal;
    public bool getPointCloud = true;
    public bool enableLightEstimation = true;
    public Dictionary<string, ARPlaneAnchorGameObject> planeAnchorMap = new Dictionary<string, ARPlaneAnchorGameObject>();
    public UnityARSessionNativeInterface session;

    void Start(){
        session = UnityARSessionNativeInterface.GetARSessionNativeInterface();
        Application.targetFrameRate = 60;
        ARKitWorldTrackingSessionConfiguration config = new ARKitWorldTrackingSessionConfiguration();
        config.planeDetection = planeDetection;
        config.alignment = startAlignment;
        config.getPointCloudData = getPointCloud;
        config.enableLightEstimation = enableLightEstimation;
        session.RunWithConfig(config);  
    }

    void Update(){
        //UnityARSessionNativeInterfaceから端末の状態を取得
        Matrix4x4 matrix = session.GetCameraPose();

        //設定した2カメラを子に持つゲームオブジェクトのTransformに位置・回転を適用
        target.transform.localPosition = UnityARMatrixOps.GetPosition(matrix);
        target.transform.localRotation = UnityARMatrixOps.GetRotation(matrix);

    }

}

5.Hierarchy上に空のオブジェクトを作成して、InspectorでCustomARCamera.csを追加する。また図のようにTargetを先ほど2で作成した二つのカメラを子オブジェクトに持つゲームオブジェクトのTransformに設定する。

f:id:hygradme:20180205212621p:plain

6.配置したい箱なり、キャラクターなり(私はルーレット)をHierarchyに作成、適当な位置に設置する。

7.(任意)「PlayerSetting」の「Resolution and Presenteation」のOrientationをLandscapeに設定すれば実機でアプリを実行した時の画面の自動回転が回避できる。(同 「XR Settings」の「Virtual Reality Supported」にチェックを入れるでも良さそう)

8.ビルドして、xcodeで実機デバック。iphoneをVRゴーグルにセットし(カメラを隠さないように)頭に装着すれば完成。 f:id:hygradme:20180205212625p:plain

動画: youtu.be

あとなんか気持ち、普通にARKit試した時に比べて、仮想物体の現実空間への張り付き具合が悪い感じがするが、気のせいだろうか?(床があまり認識されてないからか)あるいは何か間違えているのか? 画面が均等でないが、その辺は3.で設定したパラメータを変更すれば均等になるかもしれない。またパラメータは私のiPhoneXかつ手持ちのVRゴーグルに合わせて決めたので、iPhone8とか他のゴーグルの場合、調整が必要かもしれない。

つい最近ARKitが垂直方向の壁等を認識できるようになったという情報が出てきたので、ARKitでできることが増えそうな気がする。iPhone MRデバイス化に今後も期待。