[Cognitive] 使用Cognitive Face API進行臉部的驗證與比較

在Azure上已經有提供了Face API這樣的服務,可以進行兩張照片中人像的比較,並回傳是否為同一人的判定

要使用Face API進行兩張人臉照片是否為同一人的驗證與比較是很簡單的
下面的步驟會說明如何進行Face API的使用

1.建立一個Azure Face API的服務,在Azure上建立新的服務,並選擇[Cognitive Services APIs] => [Face API]

每一個帳戶只能建立一個免費的Face API

2.在建立完成的Face API中,點選[Key],並將金鑰值記下來,在程式中會使用到

3.開啟Visual Studio,並建立一個新的桌面程式,放上兩個PictureBox,TextBox,Button,以及進行驗證的控制項

4.在專案中,加入[Microsoft.ProjectOxford.Face]的Nuget套件

5.接著在Form的程式碼畫面中加入下方的程式

/// <summary>
/// 上傳照片並取得Guid的動作
/// </summary>
/// <param name="txtPicturePath"></param>
/// <param name="pic"></param>
/// <param name="txtGuid"></param>
private async void UploadPicture(TextBox txtPicturePath, PictureBox pic, TextBox txtGuid)
{
    DialogResult res = openFileDialog1.ShowDialog();
    txtPicturePath.Text = "";
    pic.Image = null;
    txtGuid.Text = "";

    if (res == DialogResult.OK)
    {
        string strFilePath = openFileDialog1.FileName;

        // 上傳照片,並取得Guid
        FaceServiceClient objFaceSrv = new FaceServiceClient(strKey);
        Face[] objFace = await objFaceSrv.DetectAsync(File.OpenRead(strFilePath));
        if (objFace.Length > 0)
        {
            txtGuid.Text = objFace[0].FaceId.ToString();
            txtPicturePath.Text = strFilePath;
            pic.Load(strFilePath);
        }
        else
        {
            MessageBox.Show("無法辨識,請重新選擇一張照片");
        }
    }
}

這段程式碼主要的目的是使用Microsoft.ProjectOxford.Face的套件,將載入的圖片以串流的方式讀入並上傳到Azure上,上傳完成後若是成功的辨識出人臉,Azure則會傳回一組這張照片的人臉特徵的Guid值

6.接著在兩張照片點選Open動作時都加上這個動作

private void btnOpenPic1_Click(object sender, EventArgs e)
{
    UploadPicture(txtPic1, pic1, txtFace1Guid);
}

private void btnOpenPic2_Click(object sender, EventArgs e)
{
    UploadPicture(txtPic2, pic2, txtFace2Guid);
}

兩張照片都要執行這樣的動作,原因在於兩張照片都必須上傳至伺服器上,而進行比對與驗證的動作,必須提供這兩張照片的Guid給Azure Face API才能進行比對

7.在進行驗證比對的動作,加上下面的程式碼

private async void btnSend_Click(object sender, EventArgs e)
{
    // 兩個Guid送至伺服器進行比較
    FaceServiceClient objFaceVerfity = new FaceServiceClient(strKey);
    var res = await objFaceVerfity.VerifyAsync(System.Guid.Parse(txtFace1Guid.Text), System.Guid.Parse(txtFace2Guid.Text));

    bool blIsIdentical = res.IsIdentical;
    double duConfidence = res.Confidence;

    string strMessage = "是否為同一人:" + blIsIdentical.ToString() + ", 相似度:" + duConfidence.ToString();
    MessageBox.Show(strMessage);

}

這段程式碼的作用,就是將兩組人臉照片上傳伺服器後取得的Guid,進行驗證的功能呼叫,並傳入這兩組Guid,識別的結果以及相似度就會回傳並透過MessageBox的方式顯示

人像辨識前,必須先將照片上傳並執行Detect,從Detect後取得的Guid才能進行比較,Verify時必須送出兩張照片的Guid值

判別為同一人的結果

判別是不同人的結果

有興趣玩人像識別辨識又想自己寫REST API的話,可以參考Microsoft Cognitive Service上的API文件
Face - Detect
Face - Verify

官方提供在Github上的Nuget套件原始檔與使用範例
https://github.com/Microsoft/ProjectOxford-ClientSDK/tree/master/Face

若是使用的平台不是太奇怪的話,基本上安裝Nuget套件後就可以直接使用了,無需重新編譯原始檔
Detect的臉部資訊會保留24小時,若是有需要重覆比較的話,可以不用多次上傳照片,使用同一組Guid就可以了

本文章的程式碼範例:
https://github.com/madukapai/maduka-Cognitive