【Microsoft Azure】Face APIを使う

# Face APIとは
Microsoftが提供するAPIで、顔画像から年齢・性別・感情といった特徴や顔認証といった機能を持っています。
デモは[こちら](https://azure.microsoft.com/ja-jp/services/cognitive-services/face/#demo)
今回はVisual Studioを使って、デモのようなFace APIを活用したデスクトップアプリを開発します。
参考にする[サンプルプログラム](https://github.com/Azure-Samples/Cognitive-Face-CSharp-sample)

# Face APIのAPIキーを取得(AzurePortalでの作業)
1.[ポータル](portal.azure.com)にアクセスし、上の検索窓にFaceと入力してでてきたMarketplaceのFaceをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/95c1ab84-568f-559b-22ca-66fd88153475.png)  
2.必要な項目を入力して[作成]。価格レベルはF0だと無料。S0だと有料になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/10a41080-eb74-e02d-c12d-6e376a66a307.png)
3.デプロイが完了したら、検索窓に名前を検索したり、すべてのリソースから作成した項目をクリックし、**APIキー**と**エンドポイント**をメモ。(**昔はエンドポイントが場所ごとに異なってたんですが、今はエンドポイントの項目をそのまま使うだけでいいみたいです。**)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/834e76c7-b5c6-dc76-7fea-b9d3caf68aca.png)

# Visual Studioの前準備
Visual StudioはAzureを用いた開発のためのツールやSDKを用意しています。準備としてそれらをインストールしておきます。
Visual Studio Installerの詳細→変更から、**Azureの開発**にチェックを入れて[変更]をクリックしてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/2d113725-69a2-1215-48bf-6454cda0a8ce.png)

# アプリを作る
### 1.プロジェクトの新規作成
Visual Studioを開いて、File->New->Projectとクリックし、新しいプロジェクトを作成します。Visual C#の中にある**WPF App (Visual C#)**を選択。
**WPF Appが見つからない場合は、Visual Studioの前準備と同じ手順で、.NETデスクトップ開発をインストールしてください。**
![NewProject.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/3763f819-7867-c9b8-1739-496ef870c21b.png)
### 2.MainWindow.xaml
Visual StudioのWPFアプリ開発は、GUIの設計と内部動作のコーディングをそれぞれ行います。GUIはボタンやテキストボックスをポチポチ配置することもできますが、サンプルプログラム通りにの見た目にしたいのでXAML(htmlみたいなもの)を編集します。Name="XXX"と書いてある部分は、コーディングの時に同じ名前を使ってボタンがクリックされたときの動作や、画像を表示するコンポーネントを指定するときに使うので、サンプルプログラム通りに使うのが良いと思います。

```xml:MainWindow.xaml
<Window x:Class="FaceTutorial.MainWindow"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="MainWindow" Height="700" Width="960">
    <Grid x:Name="BackPanel">
        <Image x:Name="FacePhoto" Stretch="Uniform" Margin="0,0,0,50" MouseMove="FacePhoto_MouseMove" />
        <DockPanel DockPanel.Dock="Bottom">
            <Button x:Name="BrowseButton" Width="72" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Left"
                     Content="Browse..."
                     Click="BrowseButton_Click" />
            <StatusBar VerticalAlignment="Bottom">
                <StatusBarItem>
                    <TextBlock Name="faceDescriptionStatusBar" />
                </StatusBarItem>
            </StatusBar>
        </DockPanel>
    </Grid>
</Window>
```

こんな見た目になればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/830c3905-facc-fa34-4bb4-2bff8d083f33.png)

### 3.MainWindow.xaml.csの編集
GUIの動作を定義します。とりあえずサンプルプログラムのMainWindow.xaml.csと同じようにコーディング。
エラーが出たので1つずつ解決。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/0326c190-bd95-5e5e-964d-dcf005a8770e.png)

- 1,2行目　using Microsoft.Azure.XXX　と 25,26,30行目 Faceに関するコード
    - 原因：using Mictosoft.Azure.CognitiveServices.Vision.Faceがない
    - 解決法：Tools->NuGet Package Manager->Manage NuGet Packages for Solutionとクリック。Browseで「Microsoft.Azure.CognitiveServices.Vision.Face」と入力し、**Include prereleaseにチェックを付けて**、画像と同じパッケージを自分のアプリにチェックを入れてインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/edba1b77-ecb2-254c-969c-b22e1c5d9a2c.png)
**検索しても出てこない場合は、右上にある歯車マークを押して、以下の画像を参考にnuget.orgを自分で追加してください**  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/3046806b-2c85-bb2c-1e8c-fbda04861663.png)

- 21,23行目 Environment.GetEnvironmentVariables("XXX")
    - 原因：定数が入力されていない
    - 解決法：メモしておいたAPIキーとエンドポイントを直接入力。

```csharp
private const string subscriptionKey = "自分のAPIキー";
private const string faceEndpoint = "https://myfacerecognitionapp.cognitiveservices.azure.com/";
```

### 4.実行
F5で実行します。画像は[This Person Does Not Exist](https://thispersondoesnotexist.com/)から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416672/e15d6a57-9faa-726b-94a5-1cce9471c110.png)
ちゃんと認識しました。