在Azure上已經有提供了Face API這樣的服務,可以進行兩張照片中人像的比較,並回傳是否為同一人的判定
要使用Face API進行兩張人臉照片是否為同一人的驗證與比較是很簡單的
下面的步驟會說明如何進行Face API的使用
1.建立一個Azure Face API的服務,在Azure上建立新的服務,並選擇[Cognitive Services APIs] => [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