2016年7月17日日曜日

【Microsott HoloLens + Cognitive Services】撮影したイメージをCognitiveServicesへ、というスクリプト

HoloLens、楽しそうですよね。
https://www.microsoft.com/microsoft-hololens/en-us

ということで、Azureと連携したものを作ってみるのですが、せっかくなのでCognitiveServicesを使ってみます。
https://azure.microsoft.com/ja-jp/services/cognitive-services/

開発環境はこちらを見て構築します。
https://developer.microsoft.com/en-us/windows/holographic/install_the_tools

どうしても日本語が好きな人は、世界のやまささんのブログを参考に。
セッティング方法自体はあってます。
http://blog.nnasaki.com/entry/2016/04/02/105956

今回は、HoloLensについているカメラの画像を撮影して、それをCognitive Services の Emotion API で解析してJSONを受け取るものを作ります。
なお、すべてのコーディングはUnity側で行っています。

細かいセッティングなどは後日詳細を説明しますが、C#入門2週間の私が困ったスクリプトについてを今回はかいつまんで。

Cognitive Services のSDKはすでに公開されているので、これを使おうと思ったのですが...
https://github.com/Microsoft/Cognitive-emotion-windows

Unityでうまくコンパイルできなかったので、WWWクラスで直接 REST API を叩きます。
そのC#スクリプトはこちら。
using UnityEngine;
using System.Collections;

// ここから下5行を追加で読み込み
using System.Collections.Generic;
using System.Text;
using System.IO;
using UnityEngine.UI;
using System;

public class CapScreen : MonoBehaviour {

    public WebCamTexture webcam;
    public Texture2D texture;

    public Text res;

  // Use this for initialization
  void Start () {

        // カメラからの画像を取得開始
        WebCamDevice[] devices = WebCamTexture.devices;
        if (devices.Length > 0)
        {
            webcam = new WebCamTexture(devices[0].name, 320, 240, 10);
            webcam.Play();
        }
    }

    // Update is called once per frame
    void Update() {
    }

    // onClock event
    public void OnClick () {

        // カメラより画像をキャプチャ
        Color32[] pixels = webcam.GetPixels32();
        if (texture) Destroy(texture);
        texture = new Texture2D(webcam.width, webcam.height);
        texture.SetPixels32(pixels);

        // Cognitive Services Emotion API をコール
        StartCoroutine(WaitForRes());
    }

    // WWWクラスを使って Emotion API を呼び出す関数
    IEnumerator WaitForRes()
    {
        // 画像をJPEGとして取り出す
        Byte[] bytes = texture.EncodeToJPG();

        // Emotion REST API


        string url = "https://api.projectoxford.ai/emotion/v1.0/recognize";

        // リクエストヘッダー
        Dictionary header = new Dictionary();
        header.Add("Content-Type", "application/octet-stream");
        header.Add("Ocp-Apim-Subscription-Key", "自身のサブスクリプションキー");

        // リクエストする
        WWW www = new WWW(url, bytes, header);

        // 非同期なのでレスポンスを待つ
        yield return www;

        // エラーじゃなければ解析結果のJSONを取得
        if (www.error == null)
        {
            res.text = www.text;
        }
    }
}

次に続きます。


2016年7月4日月曜日

【Microsoft Azure】ついでにロックされたストレージのリソースをazure-cliで解放する

これは消せなくなったストレージを消すための備忘録。

リースがロックされているBLOBを解放。
azure storage blob lease break -a ストレージアカウント名 -k "アクセスキー" コンテナ名 BLOB名

リソースがロックされているコンテナを解放。
azure storage container lease break -a ストレージアカウント名 -k "アクセスキー" コンテナ名

【Microsoft Azure】今更ながらクラシックな仮想マシンをリソースマネージャーへ移行 with azure-cli

以前作った仮想マシンを、いい加減リソースマネージャーに移行しようと思い、今更ながらazure-cliでの手順をまとめてみましょう。

まず、方針はこんな感じ。

・リソースグループの作成
・リソースグループに新しいストレージアカウントとコンテナを作成
・クラシックなストレージから作成したストレージにVHDをコピー
・仮想ネットワーク、仮想NIC(セキュリティ)、パブリックIPを作成
・コピーしたVHDから仮想マシンを作成

まずは事前にログインして、該当するサブスクリプションをセットしておきます。
$ azure login
$ azure account list
$ azure account set サブスクリプションID

忘れずにARMモードにします。
$ azure config mode arm

リソースグループを東日本リージョンに作成します。
$ azure group create リソースグループ名 JapanEast

ストレージアカウントを追加して、コンテナを作成します。
とりあえずLRSで東日本リージョンに作ります。
azure storage account create --resource-group リソースグループ名 --sku-name LRS --location JapanEast --kind storage ストレージアカウント名

コンテナを作成するために、アクセスキーを確認します。
表示されたリストのkey1を使ってコンテナを作成します。
アクセスキーは念のため「"」で囲んでいます。
azure storage account keys list --resource-group リソースグループ名 ストレージアカウント名
$ azure storage container create -a ストレージアカウント名 -k "アクセスキー" コンテナ名

既存の古いストレージからVHDをコピーします。
azure storage blob copy start -a 古いストレージアカウント名 -k "古いアクセスキー" --dest-account-name 新しいストレージアカウント名 --dest-account-key "新しいアクセスキー" "既存VHDのURI" コンテナ名

仮想ネットワーク、仮想ネットワークインターフェースなどを東日本リージョンに作成します。
azure network vnet create リソースグループ名 仮想ネットワーク名 JapanEast
$ azure network vnet subnet create -a 10.0.0.0/24 リソースグループ名 仮想ネットワーク名 サブネット名
$ azure network public-ip create リソースグループ名 パブリックIPアドレス名 JapanEast
$ azure network nsg create リソースグループ名 セキュリティグループ名 JapanEast
$ azure network nic create --subnet-name サブネット名 --subnet-vnet-name 仮想ネットワーク名 --network-security-group-name セキュリティグループ名 --public-ip-name パブリックIPアドレス名 リソースグループ名 仮想NIC名 JapanEast

最後にVHDから仮想マシンを作成します。
azure vm create -d コピーしたVHDのURI --nic-name 仮想NIC名 --vnet-name 仮想ネットワーク名 --public-ip-name パブリックIPアドレス名 リソースグループ名 仮想マシン名 JapanEast Linux

といろいろやってみたところ、マイグレーションのツールがGAしたようで...
https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-cli-migration-classic-resource-manager/