Cisco Japan Blog

Cisco Spark + AIで インスタ映え度を判定

1 min read



シスコの様々な製品には、 API があり、簡単に外部のプログラムから制御できるようになっています。ただ、「具体的にどのようなものができるのか?」といった疑問を持っている方が多いようです。今回は、シスコ製品が持つ API を利用したプログラム例として、東京と大阪で開催された 「Cloud Days 2018」のシスコ ブースで展示していた「インスタ映え度判定アプリ」を解説します。

「インスタ映え度判定アプリ」デモの概要

「インスタ映え度判定アプリ」は、顔写真を Cisco Spark へ投稿すると、Bot が写真を人工知能(AI)で解析して「インスタ映え度」を 100 点満点で採点するというものです。採点結果は「あなたのスコアは〇〇点です」と Cisco Spark のチャット画面にテキストで表示されます。より幸せそうに見える顔の判断のため、顔の表情や角度、写っている物などがスコアに反映されるようになっています。

Cloud Days 2018 の東京会場および大阪会場では、仮想化基盤として Cisco HyperFlex を利用して、アプリケーション用の Docker 基盤、 SwiftStack 、 Cassandra の環境を構築しました。

デモの手順

このデモは、会場のお客様に参加していただきます。その流れは次のとおりです。

  1. 会場にいらしたお客様の写真を撮り、その写真を Cisco Spark で投稿
  2. 事前に登録した宛先に、更新を Cisco Spark 側から通知(HTTP POST)
  3. Flask で構築した Web  サーバ上で下記手順のプログラムが動作
    1. HTTP POST されたJSON から写真の URL(Cisco Spark クラウド)を取得
    2. URL から写真をダウンロード
    3. 写真データサイズを必要に応じて小さくする(Azure への投稿に制限があるため)
    4. 写真データをオブジェクト ストレージ(SwiftStack)に保存
    5. 写真データを AI クラウド サービス(Azure)へアップロード
    6. AI クラウド サービスから解析結果を得る
    7. 解析結果を使ってスコアを計算
    8. スコアを No SQL データベース(Cassandra)へ保存
    9. スコアを Cisco Spark へ投稿

Cisco Spark からの通知の処理

Cisco Spark からは、下記 フォーマットの JSON が HTTP POST されます。

{
  "id": "Y2lzY29zcGFyazovL3VzL1dFQkhPT0svZjRlNjA1NjAtNjYwMi00ZmIwLWEyNWEtOTQ5ODgxNjA5NDk3",
  "name": "New message in 'Project Unicorn' room",
  "resource": "messages",
  "event": "created",
  "filter": "roomId=Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
  "orgId": "OTZhYmMyYWEtM2RjYy0xMWU1LWExNTItZmUzNDgxOWNkYzlh",
  "createdBy": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
  "appId": "Y2lzY29zcGFyazovL3VzL0FQUExJQ0FUSU9OL0MyNzljYjMwYzAyOTE4MGJiNGJkYWViYjA2MWI3OTY1Y2RhMzliNjAyOTdjODUwM2YyNjZhYmY2NmM5OTllYzFm",
  "ownedBy": "creator",
  "status": "active",
  "actorId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
  "data":{
    "id": "Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk",
    "roomId": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
    "personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
    "personEmail": "matt@example.com",
    "created": "2015-10-18T14:26:16.000Z"
  }
}

このなかには、メッセージの情報は記載されていません。data 要素の箇所が今回通知されたメッセージに関する情報で、ここにメッセージの ID や roomID などが含まれています。この情報を元に、下記 URL に HTTP GET することで、 HTTPS によってメッセージを取得できるようになっています。

https://api.ciscospark.com/v1/messages/#{messageId}

{messageId} の場所に、先ほどの ID を入れることで該当メッセージを取得することが可能です。上記のメッセージの例だと、下記のようなURLになります。

https://api.ciscospark.com/v1/messages/
Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk

下にメッセージのサンプルを参考にしてください。メッセージのテキスト情報のほか、ファイルが添付されている場合にはその URL もここに含まれています。

{
  "id" : "Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk",
  "roomId" : "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
  "roomType" : "group",
  "toPersonId" : "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX",
  "toPersonEmail" : "julie@example.com",
  "text" : "PROJECT UPDATE - A new project plan has been published on Box: http://box.com/s/lf5vj. The PM for this project is Mike C. and the Engineering Manager is Jane W.",
  "markdown" : "**PROJECT UPDATE** A new project plan has been published [on Box](http://box.com/s/lf5vj). The PM for this project is <@personEmail:mike@example.com> and the Engineering Manager is <@personEmail:jane@example.com>.",
  "files" : [ "http://www.example.com/images/media.png" ],
  "personId" : "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
  "personEmail" : "matt@example.com",
  "created" : "2015-10-18T14:26:16+00:00",
  "mentionedPeople" : [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ],
  "mentionedGroups" : [ "all" ]
}

files 要素をみると、一緒にアップロードされたファイルの URL が配列で記載されています。この URL にアクセスすれば、ファイルを取得できます。

メッセージに添付されたファイルの取得の方法を簡単にご紹介しましたが、これ以外の API の使い方については、Cisco Spark for Developers の ドキュメントをご覧ください。

ハイブリッド構成

通常、このようなシステムを構築する際には、1 つのパブリッククラウドで構成されることが多いと思います。お気づきのように今回は、プライベート クラウドとパブリック クラウドを連携させたハイブリッド構成になっています。これにより、複数のクラウドのいいとこ取りができています。

また今回は Microsoft の Azure を使っていますが、AWS、IBM Watson、Google Cloud などでも同じように画像を解析するサービスを利用することができます。それぞれ、認識の精度や含まれる結果に違いが出たのは、興味深いことでした。その一方で、様々なパブリック クラウドを試しながら、パブリック クラウドにも簡単に切り替えることもでき、非常に便利だと感じました。

プライベート クラウドは、重要なデータを保管するための安全性がメリットです。今回利用したSwiftStack は、プライベートクラウド環境に AWS の S3 同等のサービスを提供するソリューションです。HTTP でファイル操作ができ、一時的な URL を生成できる点など、多くの便利な機能があります。

まとめ

今回は、Cisco Spark と他のクラウドサービスを連携させたシステムを紹介しました。このデモは、5月24日・25日に開催される Cloud Days 2018九州、6月13日・14日に開催される Cloud Days 2018 名古屋 も展示予定です。ぜひ、シスコ ブースで実体験してみてください。

また現在シスコでは、「第4回 シスコテクノロジーコンテスト」の参加者を募集しています。 
このコンテストでは、プログラミング技術を用いて、シスコのテクノロジーとの連携によって更なる付加価値を提供できるソリューションを募集しています。今回ご紹介した「インスタ映え度判定アプリ」は、新たなソリューション作りの参考になると思います。

Authors

横石 雄大

システムズ エンジニア

SDN 応用技術室

コメントを書く