快速入門:使用臉部用戶端程式庫- Azure Cognitive Services

文章推薦指數: 80 %
投票人數:10人

請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用適用於.NET ... 跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 儲存 共用 Twitter LinkedIn Facebook 電子郵件 WeChat 目錄 快速入門:使用臉部用戶端程式庫 發行項 12/22/2021 此頁面有所助益嗎? 請為您的體驗評分 Yes No 還有其他意見反應嗎? 系統會將意見反應傳送給Microsoft:按下[提交]按鈕,您的意見反應將用來改善Microsoft產品和服務。

隱私權原則。

送出 謝謝。

本文內容 開始使用適用於.NET的臉部用戶端程式庫進行臉部辨識。

請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用適用於.NET的臉部用戶端程式庫來: 偵測並分析臉部 識別臉部 尋找類似臉部 參考檔連結庫來源程式碼封裝(NuGet)範例 必要條件 Azure訂用帳戶-建立免費帳戶 VisualStudioIDE或目前版本的.NETCore。

您的Azure帳戶必須具有已指派的認知服務參與者角色,才能同意負責任AI條款並建立資源。

請洽詢您的管理員,以將此角色指派給您的帳戶。

擁有Azure訂用帳戶之後,請,在Azure入口網站中建立臉部資源,以取得您的金鑰和端點。

在其部署後,按一下[前往資源]。

您需要來自所建立資源的金鑰和端點,以將應用程式連線至FaceAPI。

您稍後會在快速入門中將金鑰和端點貼到下列程式碼中。

您可以使用免費定價層(F0)來試用服務,之後可升級至付費層以用於實際執行環境。

設定 建立新的C#應用程式 VisualStudioIDE CLI 使用VisualStudio,建立新的.NETCore應用程式。

安裝用戶端程式庫 建立新專案後,以滑鼠右鍵按一下[方案總管]中的專案解決方案,然後選取[管理NuGet套件],以安裝用戶端程式庫。

在開啟的[封裝管理員]中,選取[流覽],核取[包含發行前版本],然後搜尋。

選取[版本]2.7.0-preview.1,然後2.7.0-preview.1。

在主控台視窗中(例如cmd、PowerShell或Bash),使用dotnetnew命令建立名為face-quickstart的新主控台應用程式。

此命令會建立簡單的"HelloWorld"C#專案,內含單一原始程式檔:program.cs。

dotnetnewconsole-nface-quickstart 將目錄變更為新建立的應用程式資料夾。

您可以使用下列命令來建置應用程式: dotnetbuild 建置輸出應該不會有警告或錯誤。

... Buildsucceeded. 0Warning(s) 0Error(s) ... 安裝用戶端程式庫 在應用程式目錄中,使用下列命令安裝適用於.NET的臉部用戶端程式庫: dotnetaddpackageMicrosoft.Azure.CognitiveServices.Vision.Face--version2.7.0-preview.1 提示 想要立刻檢視整個快速入門程式碼檔案嗎?您可以在GitHub上找到該檔案,其中包含本快速入門中的程式碼範例。

從專案目錄中,開啟程式.cs檔案,然後加入下列指示詞: usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Threading; usingSystem.Threading.Tasks; usingMicrosoft.Azure.CognitiveServices.Vision.Face; usingMicrosoft.Azure.CognitiveServices.Vision.Face.Models; 在應用程式的Program類別中,為資源的金鑰和端點建立變數。

重要 移至Azure入口網站。

如果您在[必要條件]區段中建立的臉部資源已成功部署,請按一下[下一步]下的[移至資源]按鈕。

您可以在[資源管理]底下的[金鑰和端點]頁面中找到金鑰和端點。

完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。

在生產環境中,請考慮使用安全的方式來儲存及存取您的認證。

如需詳細資訊,請參閱認知服務安全性一文。

//FromyourFacesubscriptionintheAzureportal,getyoursubscriptionkeyandendpoint. conststringSUBSCRIPTION_KEY="PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"; conststringENDPOINT="PASTE_YOUR_FACE_ENDPOINT_HERE"; 在應用程式的Main方法中,針對本快速入門中使用的方法新增呼叫。

您稍後會實作這些呼叫。

//Authenticate. IFaceClientclient=Authenticate(ENDPOINT,SUBSCRIPTION_KEY); //Detect-getfeaturesfromfaces. DetectFaceExtract(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //FindSimilar-findasimilarfacefromalistoffaces. FindSimilar(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //Verify-comparetwoimagesifthesamepersonornot. Verify(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //Identify-recognizeaface(s)inapersongroup(apersongroupiscreatedinthisexample). IdentifyInPersonGroup(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //LargePersonGroup-create,thengetdata. LargePersonGroup(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //Groupfaces-automaticallygroupsimilarfaces. Group(client,IMAGE_BASE_URL,RECOGNITION_MODEL4).Wait(); //FaceList-createafacelist,thengetdata 物件模型 下列類別和介面會處理臉部.NET用戶端程式庫的一些主要功能: 名稱 描述 FaceClient 此類別代表可使用臉部服務的授權,需要有此授權才能執行所有臉部功能。

您可以使用訂用帳戶資訊來具現化此類別,並用其來產生其他類別的執行個體。

FaceOperations 此類別會處理可使用人臉來執行的基本偵測和辨識工作。

DetectedFace 此類別代表從影像中單一臉部所偵測到的所有資料。

您可以用此資料來取出該臉部的詳細資訊。

FaceListOperations 此類別會管理儲存於雲端的FaceList建構,而這些建構會儲存一組混合的臉部。

PersonGroupPersonExtensions 此類別會管理儲存於雲端的Person建構,而這些建構會儲存一組屬於單一人員的臉部。

PersonGroupOperations 此類別會管理儲存於雲端的PersonGroup建構,而這些建構會儲存一組混合的Person物件。

程式碼範例 下列程式碼片段說明如何使用適用於.NET的臉部用戶端程式庫來執行下列工作: 驗證用戶端 偵測並分析臉部 識別臉部 尋找類似臉部 驗證用戶端 在新方法中,使用端點和金鑰來具現化用戶端。

使用您的金鑰建立ApiKeyServiceClientCredentials物件,並使用該物件與您的端點建立FaceClient物件。

/* * AUTHENTICATE * Usessubscriptionkeyandregiontocreateaclient. */ publicstaticIFaceClientAuthenticate(stringendpoint,stringkey) { returnnewFaceClient(newApiKeyServiceClientCredentials(key)){Endpoint=endpoint}; } 宣告helper欄位 您稍後將新增的幾個臉部作業需要下列欄位。

在Program類別的根目錄中,定義下列URL字串。

此URL會指向範例影像的資料夾。

//Usedforallexamples. //URLfortheimages. conststringIMAGE_BASE_URL="https://csdx.blob.core.windows.net/resources/Face/Images/"; 在Main方法中,定義要指向不同辨識模型類型的字串。

稍後,您將能夠指定要用於臉部偵測的辨識模型。

如需這些選項的詳細資訊,請參閱指定辨識模型。

//Recognitionmodel4wasreleasedin2021February. //Itisrecommendedsinceitsaccuracyisimproved //onfaceswearingmaskscomparedwithmodel3, //anditsoverallaccuracyisimprovedcompared //withmodels1and2. conststringRECOGNITION_MODEL4=RecognitionModel.Recognition04; 偵測並分析臉部 在所有其他案例中,第一個步驟都需要臉部偵測。

本節說明如何傳回額外的臉部屬性資料。

如果您只想要偵測臉部識別或驗證的臉部,請跳至稍後的章節。

取得偵測到的臉部物件 建立新方法來偵測臉部。

DetectFaceExtract方法會處理指定URL上的三個影像,並在程式記憶體中建立DetectFaceExtract物件的清單。

FaceAttributeType值的清單會指定要擷取的特徵。

/* *DETECTFACES *DetectsfeaturesfromfacesandIDsthem. */ publicstaticasyncTaskDetectFaceExtract(IFaceClientclient,stringurl,stringrecognitionModel) { Console.WriteLine("========DETECTFACES========"); Console.WriteLine(); //Createalistofimages ListimageFileNames=newList { "detection1.jpg",//singlefemalewithglasses //"detection2.jpg",//(optional:singleman) //"detection3.jpg",//(optional:singlemaleconstructionworker) //"detection4.jpg",//(optional:3peopleatcafe,1isblurred) "detection5.jpg",//family,womanchildman "detection6.jpg"//elderlycouple,malefemale }; foreach(varimageFileNameinimageFileNames) { IListdetectedFaces; //Detectfaceswithallattributesfromimageurl. detectedFaces=awaitclient.Face.DetectWithUrlAsync($"{url}{imageFileName}", returnFaceAttributes:newList{FaceAttributeType.Accessories,FaceAttributeType.Age, FaceAttributeType.Blur,FaceAttributeType.Emotion,FaceAttributeType.Exposure,FaceAttributeType.FacialHair, FaceAttributeType.Gender,FaceAttributeType.Glasses,FaceAttributeType.Hair,FaceAttributeType.HeadPose, FaceAttributeType.Makeup,FaceAttributeType.Noise,FaceAttributeType.Occlusion,FaceAttributeType.Smile}, //Wespecifydetectionmodel1becauseweareretrievingattributes. detectionModel:DetectionModel.Detection01, recognitionModel:recognitionModel); Console.WriteLine($"{detectedFaces.Count}face(s)detectedfromimage`{imageFileName}`."); 提示 您也可以偵測本機影像中的臉部。

請參閱IFaceOperations方法,例如DetectWithStreamAsync。

顯示偵測到的臉部資料 DetectFaceExtract方法的其餘部分會剖析每個偵測到的臉部,並列印屬性資料。

每個屬性必須在原始的臉部偵測API呼叫中個別指定(在FaceAttributeType清單中)。

下列程式碼會處理每個屬性,但您可能只需要使用一個或幾個屬性。

//Parseandprintallattributesofeachdetectedface. foreach(varfaceindetectedFaces) { Console.WriteLine($"Faceattributesfor{imageFileName}:"); //Getboundingboxofthefaces Console.WriteLine($"Rectangle(Left/Top/Width/Height):{face.FaceRectangle.Left}{face.FaceRectangle.Top}{face.FaceRectangle.Width}{face.FaceRectangle.Height}"); //Getaccessoriesofthefaces ListaccessoriesList=(List)face.FaceAttributes.Accessories; intcount=face.FaceAttributes.Accessories.Count; stringaccessory;string[]accessoryArray=newstring[count]; if(count==0){accessory="NoAccessories";} else { for(inti=0;iemotionValue){emotionValue=emotion.Anger;emotionType="Anger";} if(emotion.Contempt>emotionValue){emotionValue=emotion.Contempt;emotionType="Contempt";} if(emotion.Disgust>emotionValue){emotionValue=emotion.Disgust;emotionType="Disgust";} if(emotion.Fear>emotionValue){emotionValue=emotion.Fear;emotionType="Fear";} if(emotion.Happiness>emotionValue){emotionValue=emotion.Happiness;emotionType="Happiness";} if(emotion.Neutral>emotionValue){emotionValue=emotion.Neutral;emotionType="Neutral";} if(emotion.Sadness>emotionValue){emotionValue=emotion.Sadness;emotionType="Sadness";} if(emotion.Surprise>emotionValue){emotionType="Surprise";} Console.WriteLine($"Emotion:{emotionType}"); //Getmorefaceattributes Console.WriteLine($"Exposure:{face.FaceAttributes.Exposure.ExposureLevel}"); Console.WriteLine($"FacialHair:{string.Format("{0}",face.FaceAttributes.FacialHair.Moustache+face.FaceAttributes.FacialHair.Beard+face.FaceAttributes.FacialHair.Sideburns>0?"Yes":"No")}"); Console.WriteLine($"Gender:{face.FaceAttributes.Gender}"); Console.WriteLine($"Glasses:{face.FaceAttributes.Glasses}"); //Gethaircolor Hairhair=face.FaceAttributes.Hair; stringcolor=null; if(hair.HairColor.Count==0){if(hair.Invisible){color="Invisible";}else{color="Bald";}} HairColorTypereturnColor=HairColorType.Unknown; doublemaxConfidence=0.0f; foreach(HairColorhairColorinhair.HairColor) { if(hairColor.Confidence<=maxConfidence){continue;} maxConfidence=hairColor.Confidence;returnColor=hairColor.Color;color=returnColor.ToString(); } Console.WriteLine($"Hair:{color}"); //Getmoreattributes Console.WriteLine($"HeadPose:{string.Format("Pitch:{0},Roll:{1},Yaw:{2}",Math.Round(face.FaceAttributes.HeadPose.Pitch,2),Math.Round(face.FaceAttributes.HeadPose.Roll,2),Math.Round(face.FaceAttributes.HeadPose.Yaw,2))}"); Console.WriteLine($"Makeup:{string.Format("{0}",(face.FaceAttributes.Makeup.EyeMakeup||face.FaceAttributes.Makeup.LipMakeup)?"Yes":"No")}"); Console.WriteLine($"Noise:{face.FaceAttributes.Noise.NoiseLevel}"); Console.WriteLine($"Occlusion:{string.Format("EyeOccluded:{0}",face.FaceAttributes.Occlusion.EyeOccluded?"Yes":"No")}"+ $"{string.Format("ForeheadOccluded:{0}",face.FaceAttributes.Occlusion.ForeheadOccluded?"Yes":"No")}{string.Format("MouthOccluded:{0}",face.FaceAttributes.Occlusion.MouthOccluded?"Yes":"No")}"); Console.WriteLine($"Smile:{face.FaceAttributes.Smile}"); Console.WriteLine(); } } } 識別臉部 「識別」作業會取得個人(或多人)的影像,並尋找與影像中每個臉部相關聯的已儲存person物件(臉部辨識搜尋)。

它會將每個偵測到的臉部與PersonGroup(即已知臉部資料的不同人員物件的資料庫)進行比較。

若要執行識別作業,您必須先建立並訓練PersonGroup 建立PersonGroup 下列程式碼會建立有六個不同Person物件的PersonGroup。

其會將每個Person與一組影像範例產生關聯,然後進行訓練以透過其臉部特徵辨識每個人。

Person和PersonGroup物件會用在驗證、識別和群組作業中。

在類別根目錄上宣告字串變數,以代表您將建立的PersonGroup識別碼。

staticstringpersonGroupId=Guid.NewGuid().ToString(); 在新方法中,新增下列程式碼。

此方法會執行識別作業。

第一個程式碼區塊會將人員的名稱與範例影像產生關聯。

publicstaticasyncTaskIdentifyInPersonGroup(IFaceClientclient,stringurl,stringrecognitionModel) { Console.WriteLine("========IDENTIFYFACES========"); Console.WriteLine(); //Createadictionaryforallyourimages,groupingsimilaronesunderthesamekey. DictionarypersonDictionary= newDictionary {{"Family1-Dad",new[]{"Family1-Dad1.jpg","Family1-Dad2.jpg"}}, {"Family1-Mom",new[]{"Family1-Mom1.jpg","Family1-Mom2.jpg"}}, {"Family1-Son",new[]{"Family1-Son1.jpg","Family1-Son2.jpg"}}, {"Family1-Daughter",new[]{"Family1-Daughter1.jpg","Family1-Daughter2.jpg"}}, {"Family2-Lady",new[]{"Family2-Lady1.jpg","Family2-Lady2.jpg"}}, {"Family2-Man",new[]{"Family2-Man1.jpg","Family2-Man2.jpg"}} }; //Agroupphotothatincludessomeofthepersonsyouseektoidentifyfromyourdictionary. stringsourceImageFileName="identification1.jpg"; 請注意,此程式碼會定義sourceImageFileName變數。

此變數會對應到來源影像,也就是包含要識別之人員的影像。

接下來,新增下列程式碼,在字典中為每個人建立Person物件,並從適當的影像加入臉部資料。

每個Person物件都會透過其唯一的識別碼字串,與相同的PersonGroup產生關聯。

請記得將變數client、url和RECOGNITION_MODEL1傳遞給此方法。

//Createapersongroup. Console.WriteLine($"Createapersongroup({personGroupId})."); awaitclient.PersonGroup.CreateAsync(personGroupId,personGroupId,recognitionModel:recognitionModel); //Thesimilarfaceswillbegroupedintoasinglepersongroupperson. foreach(vargroupedFaceinpersonDictionary.Keys) { //LimitTPS awaitTask.Delay(250); Personperson=awaitclient.PersonGroupPerson.CreateAsync(personGroupId:personGroupId,name:groupedFace); Console.WriteLine($"Createapersongroupperson'{groupedFace}'."); //Addfacetothepersongroupperson. foreach(varsimilarImageinpersonDictionary[groupedFace]) { Console.WriteLine($"Addfacetothepersongroupperson({groupedFace})fromimage`{similarImage}`"); PersistedFaceface=awaitclient.PersonGroupPerson.AddFaceFromUrlAsync(personGroupId,person.PersonId, $"{url}{similarImage}",similarImage); } } 提示 您也可以從本機影像建立PersonGroup。

請參閱IPersonGroupPerson方法,例如AddFaceFromStreamAsync。

訓練PersonGroup 當您從影像中擷取臉部資料,並將其分類至不同Person物件後,您必須訓練PersonGroup,以識別與其每一個Person物件相關聯的視覺特徵。

下列程式碼會呼叫非同步訓練方法並輪詢結果,以將狀態列印到主控台。

//Starttotrainthepersongroup. Console.WriteLine(); Console.WriteLine($"Trainpersongroup{personGroupId}."); awaitclient.PersonGroup.TrainAsync(personGroupId); //Waituntilthetrainingiscompleted. while(true) { awaitTask.Delay(1000); vartrainingStatus=awaitclient.PersonGroup.GetTrainingStatusAsync(personGroupId); Console.WriteLine($"Trainingstatus:{trainingStatus.Status}."); if(trainingStatus.Status==TrainingStatusType.Succeeded){break;} } Console.WriteLine(); 提示 臉部API會在一組本質為靜態的預建模型上執行(模型的效能不會在服務執行時衰退或改善)。

如果Microsoft更新模型的後端,而未遷移到全新的模型版本,則模型產生的結果可能會變更。

若要利用較新版本的模型,您可以使用相同的註冊映像來重新訓練PersonGroup,進而將較新的模型指定為參數。

此Person群組及其相關聯的Person物件現在已準備好用於驗證、識別或群組作業。

識別人臉 下列程式碼會採用來源影像,並建立在影像中偵測到的所有臉部清單。

這些是依據PersonGroup所識別的臉部。

ListsourceFaceIds=newList(); //Detectfacesfromsourceimageurl. ListdetectedFaces=awaitDetectFaceRecognize(client,$"{url}{sourceImageFileName}",recognitionModel); //AdddetectedfaceIdtosourceFaceIds. foreach(vardetectedFaceindetectedFaces){sourceFaceIds.Add(detectedFace.FaceId.Value);} 下一個程式碼片段會呼叫IdentifyAsync作業,並將結果列印至主控台。

在此,該服務會嘗試將來源影像中的每個臉部與指定PersonGroup中的Person進行比對。

這會關閉您的識別方法。

//Identifythefacesinapersongroup. varidentifyResults=awaitclient.Face.IdentifyAsync(sourceFaceIds,personGroupId); foreach(varidentifyResultinidentifyResults) { Personperson=awaitclient.PersonGroupPerson.GetAsync(personGroupId,identifyResult.Candidates[0].PersonId); Console.WriteLine($"Person'{person.Name}'isidentifiedforfacein:{sourceImageFileName}-{identifyResult.FaceId},"+ $"confidence:{identifyResult.Candidates[0].Confidence}."); } Console.WriteLine(); } 尋找類似臉部 下列程式碼會取得一個偵測到的臉部(來源),並搜尋一組其他臉部(目標)來尋找相符臉部(依影像進行臉部搜尋)。

若找到相符的臉部,便會將相符臉部的識別碼列印到主控台。

偵測臉部以進行比較 首先,定義第二個臉部偵測方法。

您必須先偵測影像中的臉部,才能進行比較,而此偵測方法已針對比較作業進行最佳化。

該方法不會擷取詳細的臉部特性(如上節中所述),而是會使用不同的辨識模型。

privatestaticasyncTask>DetectFaceRecognize(IFaceClientfaceClient,stringurl,stringrecognition_model) { //DetectfacesfromimageURL.Sinceonlyrecognizing,usetherecognitionmodel1. //Weusedetectionmodel3becausewearenotretrievingattributes. IListdetectedFaces=awaitfaceClient.Face.DetectWithUrlAsync(url,recognitionModel:recognition_model,detectionModel:DetectionModel.Detection03); Console.WriteLine($"{detectedFaces.Count}face(s)detectedfromimage`{Path.GetFileName(url)}`"); returndetectedFaces.ToList(); } 尋找相符臉部 下列方法會在一組目標影像和單一來源影像中偵測臉部。

然後,該方法會比較這些影像,並尋找與來源影像類似的所有目標影像。

/* *FINDSIMILAR *Thisexamplewilltakeanimageandfindasimilaronetoitinanotherimage. */ publicstaticasyncTaskFindSimilar(IFaceClientclient,stringurl,stringrecognition_model) { Console.WriteLine("========FINDSIMILAR========"); Console.WriteLine(); ListtargetImageFileNames=newList { "Family1-Dad1.jpg", "Family1-Daughter1.jpg", "Family1-Mom1.jpg", "Family1-Son1.jpg", "Family2-Lady1.jpg", "Family2-Man1.jpg", "Family3-Lady1.jpg", "Family3-Man1.jpg" }; stringsourceImageFileName="findsimilar.jpg"; IListtargetFaceIds=newList(); foreach(vartargetImageFileNameintargetImageFileNames) { //Detectfacesfromtargetimageurl. varfaces=awaitDetectFaceRecognize(client,$"{url}{targetImageFileName}",recognition_model); //AdddetectedfaceIdtolistofGUIDs. targetFaceIds.Add(faces[0].FaceId.Value); } //Detectfacesfromsourceimageurl. IListdetectedFaces=awaitDetectFaceRecognize(client,$"{url}{sourceImageFileName}",recognition_model); Console.WriteLine(); //Findasimilarface(s)inthelistofIDs.Comapringonlythefirstinlistfortestingpurposes. IListsimilarResults=awaitclient.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value,null,null,targetFaceIds); 列印相符臉部 下列程式碼會將相符臉部的詳細資料列印到主控台: foreach(varsimilarResultinsimilarResults) { Console.WriteLine($"Facesfrom{sourceImageFileName}&ID:{similarResult.FaceId}aresimilarwithconfidence:{similarResult.Confidence}."); } Console.WriteLine(); 執行應用程式 VisualStudioIDE CLI 按一下IDE視窗頂端的[偵錯]按鈕,以執行應用程式。

使用dotnetrun命令從您的應用程式目錄執行應用程式。

dotnetrun 清除資源 如果您想要清除和移除認知服務訂用帳戶,則可以刪除資源或資源群組。

刪除資源群組也會刪除其關聯的任何其他資源。

入口網站 AzureCLI 如果您在本快速入門中建立了PersonGroup,但想要將其刪除,請在程式中執行下列程式碼: //Atend,deletepersongroupsinbothregions(sincetestingonly) Console.WriteLine("========DELETEPERSONGROUP========"); Console.WriteLine(); DeletePersonGroup(client,personGroupId).Wait(); 以下列程式碼定義刪除方法: /* *DELETEPERSONGROUP *Afterthisentireexampleisexecuted,deletethepersongroupinyourAzureaccount, *otherwiseyoucannotrecreateonewiththesamename(ifrunningexamplerepeatedly). */ publicstaticasyncTaskDeletePersonGroup(IFaceClientclient,StringpersonGroupId) { awaitclient.PersonGroup.DeleteAsync(personGroupId); Console.WriteLine($"Deletedthepersongroup{personGroupId}."); } 後續步驟 在本快速入門中,您已了解如何使用適用於.NET的臉部用戶端程式庫來執行基本臉部辨識工作。

接下來,瞭解不同的臉部偵測模型,以及如何為您的使用案例指定正確的模型。

指定臉部偵測模型版本 什麼是臉部辨識服務? 此範例的原始程式碼可以在GitHub上找到。

開始使用適用於Go的臉部用戶端程式庫進行臉部辨識。

請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用適用於Go的臉部服務用戶端程式庫來: 偵測並分析臉部 識別臉部 驗證臉部 尋找類似臉部 參考檔連結庫來源程式碼SDK下載 必要條件 最新版的Go Azure訂用帳戶-建立免費帳戶 您的Azure帳戶必須具有已指派的認知服務參與者角色,才能同意負責任AI條款並建立資源。

請洽詢您的管理員,以將此角色指派給您的帳戶。

擁有Azure訂用帳戶之後,請,在Azure入口網站中建立臉部資源,以取得您的金鑰和端點。

在其部署後,按一下[前往資源]。

您需要來自所建立資源的金鑰和端點,以將應用程式連線至FaceAPI。

您稍後會在快速入門中將金鑰和端點貼到下列程式碼中。

您可以使用免費定價層(F0)來試用服務,之後可升級至付費層以用於實際執行環境。

取得金鑰和端點之後,請分別針對名為和的金鑰和端點建立環境變數FACE_ENDPOINT。

設定 建立Go專案目錄 在主控台視窗(cmd、PowerShell、Bash)中,為您的Go專案建立新的工作區my-app,並瀏覽至該工作區。

mkdir-pmy-app/{src,bin,pkg} cdmy-app 您的工作區將包含三個資料夾: src-此目錄將包含原始程式碼和套件。

任何使用goget命令安裝的套件都會位於此資料夾中。

pkg-此目錄將包含已編譯的Go套件物件。

這些檔案都具有.a副檔名。

bin-此目錄將包含您執行時所建立的二進位可執行檔。

提示 若要深入了解Go工作區的結構,請參閱Go語言文件。

本指南包含用來設定$GOPATH和$GOROOT的資訊。

安裝適用於Go的用戶端程式庫 然後,安裝適用於Go的用戶端程式庫: goget-ugithub.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face 或者,如果您使用dep,請在存放庫中執行: depensure-addhttps://github.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face 建立Go應用程式 接下來,在src目錄中建立名為的檔案: cdsrc touchsample-app.go 在您慣用的IDE或文字編輯器中開啟sample-app.go。

然後,新增套件名稱,並匯入下列程式庫: packagemain import( "encoding/json" "container/list" "context" "fmt" "github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v1.0/face" "github.com/Azure/go-autorest/autorest" "github.com/satori/go.uuid" "io" "io/ioutil" "log" "os" "path" "strconv" "strings" "time" ) 接著,您將開始新增程式碼以執行不同的臉部服務作業。

物件模型 下列類別和介面會處理臉部服務Go用戶端程式庫的一些主要功能。

名稱 描述 BaseClient 此類別代表可使用臉部服務的授權,需要有此授權才能執行所有臉部功能。

您可以使用訂用帳戶資訊來具現化此類別,並用其來產生其他類別的執行個體。

用戶端 此類別會處理可使用人臉來執行的基本偵測和辨識工作。

DetectedFace 此類別代表從影像中單一臉部所偵測到的所有資料。

您可以用此資料來取出該臉部的詳細資訊。

ListClient 此類別會管理儲存於雲端的FaceList建構,而這些建構會儲存一組混合的臉部。

PersonGroupPersonClient 此類別會管理儲存於雲端的Person建構,而這些建構會儲存一組屬於單一人員的臉部。

PersonGroupClient 此類別會管理儲存於雲端的PersonGroup建構,而這些建構會儲存一組混合的Person物件。

SnapshotClient 此類別會管理快照集功能。

您可以用此類別來暫時儲存所有的雲端式臉部資料,並將該資料遷移至新的Azure訂用帳戶。

程式碼範例 這些程式碼範例會示範如何使用適用於Go的臉部服務用戶端程式庫來完成基本工作: 驗證用戶端 偵測並分析臉部 識別臉部 驗證臉部 尋找類似臉部 驗證用戶端 注意 本快速入門假設您已為臉部金鑰和端點建立名為的環境變數FACE_ENDPOINT。

建立main函式,並在其中新增下列程式碼,以使用您的端點和金鑰具現化用戶端。

使用金鑰建立CognitiveServicesAuthorizer物件,並使用該物件搭配您的端點來建立Client物件。

此程式碼也會將內容物件具現化,其為建立用戶端物件所需的物件。

此外,也會定義遠端位置,在其中可找到本快速入門中的一些範例影像。

funcmain(){ //Aglobalcontextforuseinallsamples faceContext:=context.Background() //BaseurlfortheVerifyandLargeFaceListexamples constimageBaseURL="https://csdx.blob.core.windows.net/resources/Face/Images/" /* Authenticate */ subscriptionKey:="PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE" endpoint:="PASTE_YOUR_FACE_ENDPOINT_HERE" //ClientusedforDetectFaces,FindSimilar,andVerifyexamples. client:=face.NewClient(endpoint) client.Authorizer=autorest.NewCognitiveServicesAuthorizer(subscriptionKey) /* END-Authenticate */ 偵測並分析臉部 需要臉部偵測作為臉部分析和身分識別驗證的第一個步驟。

本節說明如何傳回額外的臉部屬性資料。

如果您只想要偵測臉部識別或驗證的臉部,請跳至稍後的章節。

在您的main方法中新增下列程式碼:此程式碼會定義遠端範例影像,並指定要從影像中擷取哪些臉部特徵。

此外,也會指定要使用哪個AI模型來對偵測到的臉部擷取資料。

如需這些選項的詳細資訊,請參閱指定辨識模型。

最後,DetectWithURL方法會在影像上執行臉部偵測作業,並將結果儲存在程式記憶體中。

//Detectafaceinanimagethatcontainsasingleface singleFaceImageURL:="https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg" singleImageURL:=face.ImageURL{URL:&singleFaceImageURL} singleImageName:=path.Base(singleFaceImageURL) //ArraytypeschosenfortheattributesofFace attributes:=[]face.AttributeType{"age","emotion","gender"} returnFaceID:=true returnRecognitionModel:=false returnFaceLandmarks:=false //APIcalltodetectfacesinsingle-facedimage,usingrecognitionmodel4 //Wespecifydetectionmodel1becauseweareretrievingattributes. detectSingleFaces,dErr:=client.DetectWithURL(faceContext,singleImageURL,&returnFaceID,&returnFaceLandmarks,attributes,face.Recognition04,&returnRecognitionModel,face.Detection01) ifdErr!=nil{log.Fatal(dErr)} //Dereference*[]DetectedFace,inordertoloopthroughit. dFaces:=*detectSingleFaces.Value 提示 您也可以偵測本機影像中的臉部。

請參閱用戶端方法,例如DetectWithStream。

顯示偵測到的臉部資料 下一個程式碼區塊會取得DetectedFace物件陣列中的第一個元素,並將其屬性列印到主控台。

如果您使用了有多個臉部的影像,則應該改為逐一查看陣列。

fmt.Println("Detectedfacein("+singleImageName+")withID(s):") fmt.Println(dFaces[0].FaceID) fmt.Println() //Find/displaytheageandgenderattributes for_,dFace:=rangedFaces{ fmt.Println("Faceattributes:") fmt.Printf("Age:%.0f",*dFace.FaceAttributes.Age) fmt.Println("\nGender:"+dFace.FaceAttributes.Gender) } //Get/displaytheemotionattribute emotionStruct:=*dFaces[0].FaceAttributes.Emotion //Convertstructtoamap varemotionMapmap[string]float64 result,_:=json.Marshal(emotionStruct) json.Unmarshal(result,&emotionMap) //Findtheemotionwiththehighestscore(confidencelevel).Rangeis0.0-1.0. varhighestfloat64 emotion:="" dScore:=-1.0 forname,value:=rangeemotionMap{ if(value>highest){ emotion,dScore=name,value highest=value } } fmt.Println("Emotion:"+emotion+"(score:"+strconv.FormatFloat(dScore,'f',3,64)+")") 識別臉部 識別作業會取用個人(或多人)的影像,並尋找影像中每個臉部的身分識別(臉部辨識搜尋)。

其會比較所偵測到的每個臉部與PersonGroup,該資料庫具有已知臉部特徵的不同Person物件。

取得人員影像 若要逐步執行此案例,您必須將下列影像儲存至專案的根目錄:https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images。

此影像群組包含三組對應至三個不同人員的單一臉部影像。

程式碼會定義三個PersonGroupPerson物件,並將它們與以、和開頭的影像檔產生關聯manchild。

建立PersonGroup 下載影像之後,將下列程式碼新增至main方法的底部。

此程式碼會驗證PersonGroupClient物件,然後將其用來定義新的PersonGroup。

//Getworkingdirectory root,rootErr:=os.Getwd() ifrootErr!=nil{log.Fatal(rootErr)} //Fullpathtoimagesfolder imagePathRoot:=path.Join(root+"\\images\\") //Authenticate-Needaspecialpersongroupclientforyourpersongroup personGroupClient:=face.NewPersonGroupClient(endpoint) personGroupClient.Authorizer=autorest.NewCognitiveServicesAuthorizer(subscriptionKey) //CreatethePersonGroup //CreateanemptyPersonGroup.PersonGroupIDmustbelowercase,alphanumeric,and/orwith'-','_'. personGroupID:="unique-person-group" fmt.Println("PersongroupID:"+personGroupID) metadata:=face.MetaDataContract{Name:&personGroupID} //Createthepersongroup personGroupClient.Create(faceContext,personGroupID,metadata) 建立PersonGroupPerson 下一個程式碼區塊會驗證PersonGroupPersonClient,然後將其用來定義三個新的PersonGroupPerson物件。

這些物件各自代表一組影像中的單一人員。

//Authenticate-Needaspecialpersongrouppersonclientforyourpersongroupperson personGroupPersonClient:=face.NewPersonGroupPersonClient(endpoint) personGroupPersonClient.Authorizer=autorest.NewCognitiveServicesAuthorizer(subscriptionKey) //Createeachpersongrouppersonforeachgroupofimages(woman,man,child) //Definewomanfriend w:="Woman" nameWoman:=face.NameAndUserDataContract{Name:&w} //ReturnsaPersontype womanPerson,wErr:=personGroupPersonClient.Create(faceContext,personGroupID,nameWoman) ifwErr!=nil{log.Fatal(wErr)} fmt.Print("WomanpersonID:") fmt.Println(womanPerson.PersonID) //Definemanfriend m:="Man" nameMan:=face.NameAndUserDataContract{Name:&m} //ReturnsaPersontype manPerson,wErr:=personGroupPersonClient.Create(faceContext,personGroupID,nameMan) ifwErr!=nil{log.Fatal(wErr)} fmt.Print("ManpersonID:") fmt.Println(manPerson.PersonID) //Definechildfriend ch:="Child" nameChild:=face.NameAndUserDataContract{Name:&ch} //ReturnsaPersontype childPerson,wErr:=personGroupPersonClient.Create(faceContext,personGroupID,nameChild) ifwErr!=nil{log.Fatal(wErr)} fmt.Print("ChildpersonID:") fmt.Println(childPerson.PersonID) 將臉部指派給人員 下列程式碼會排序影像(依影像的前置詞)、偵測臉部,以及根據影像檔案名稱,將臉部指派給各自的PersonGroupPerson物件。

//Detectfacesandregistertocorrectperson //Liststoholdalltheirpersonimages womanImages:=list.New() manImages:=list.New() childImages:=list.New() //Collectthelocalimagesforeachperson,addthemtotheirownpersongroupperson images,fErr:=ioutil.ReadDir(imagePathRoot) iffErr!=nil{log.Fatal(fErr)} for_,f:=rangeimages{ path:=(imagePathRoot+f.Name()) ifstrings.HasPrefix(f.Name(),"w"){ varwfileio.ReadCloser wfile,err:=os.Open(path) iferr!=nil{log.Fatal(err)} womanImages.PushBack(wfile) personGroupPersonClient.AddFaceFromStream(faceContext,personGroupID,*womanPerson.PersonID,wfile,"",nil,face.Detection03) } ifstrings.HasPrefix(f.Name(),"m"){ varmfileio.ReadCloser mfile,err:=os.Open(path) iferr!=nil{log.Fatal(err)} manImages.PushBack(mfile) personGroupPersonClient.AddFaceFromStream(faceContext,personGroupID,*manPerson.PersonID,mfile,"",nil,face.Detection03) } ifstrings.HasPrefix(f.Name(),"ch"){ varchfileio.ReadCloser chfile,err:=os.Open(path) iferr!=nil{log.Fatal(err)} childImages.PushBack(chfile) personGroupPersonClient.AddFaceFromStream(faceContext,personGroupID,*childPerson.PersonID,chfile,"",nil,face.Detection03) } } 提示 您也可以從URL所參考的遠端影像,建立PersonGroup。

請參閱PersonGroupPersonClient方法,例如AddFaceFromURL。

訓練PersonGroup 指派臉部之後,您會訓練PersonGroup,使其能夠識別與其每個Person物件相關聯的視覺功能。

下列程式碼會呼叫非同步訓練方法並輪詢結果,以將狀態列印到主控台。

//Trainthepersongroup personGroupClient.Train(faceContext,personGroupID) //Waitforittosucceedintraining for{ trainingStatus,tErr:=personGroupClient.GetTrainingStatus(faceContext,personGroupID) iftErr!=nil{log.Fatal(tErr)} iftrainingStatus.Status=="succeeded"{ fmt.Println("Trainingstatus:",trainingStatus.Status) break } time.Sleep(2) } 提示 臉部API會在一組本質為靜態的預建模型上執行(模型的效能不會在服務執行時衰退或改善)。

如果Microsoft更新模型的後端,而未遷移到全新的模型版本,則模型產生的結果可能會變更。

若要利用較新版本的模型,您可以使用相同的註冊映像來重新訓練PersonGroup,進而將較新的模型指定為參數。

取得測試影像 下列程式碼會在專案的根目錄中尋找test-image-person-group.jpg影像,並將其載入到程式記憶體中。

您可以在與用來建立PersonGroup的映射相同的存放庫中找到此映射:。

personGroupTestImageName:="test-image-person-group.jpg" //Useimagepathrootfromtheonecreatedinpersongroup personGroupTestImagePath:=imagePathRoot varpersonGroupTestImageio.ReadCloser //ReturnsaReaderCloser personGroupTestImage,identErr:=os.Open(personGroupTestImagePath+personGroupTestImageName) ifidentErr!=nil{log.Fatal(identErr)} 偵測測試影像中的來源臉部 下一個程式碼區塊會在測試影像上進行一般的臉部偵測,以擷取所有的臉部並將其儲存至陣列。

//Detectfacesingrouptestimage,usingrecognitionmodel1(default) returnIdentifyFaceID:=true //ReturnsaListDetectedFaces //Recognition04isnotcompatible. //Wespecifydetectionmodel3becausewearenotretrievingattributes. detectedTestImageFaces,dErr:=client.DetectWithStream(faceContext,personGroupTestImage,&returnIdentifyFaceID,nil,nil,face.Recognition01,nil,face.Detection03) ifdErr!=nil{log.Fatal(dErr)} //MakelistoffaceIDsfromthedetection. length:=len(*detectedTestImageFaces.Value) testImageFaceIDs:=make([]uuid.UUID,length) //ListDetectedFaceisastructwithaValuepropertythatreturnsa*[]DetectedFace fori,f:=range*detectedTestImageFaces.Value{ testImageFaceIDs[i]=*f.FaceID } 識別來源影像中的臉部 Identify方法會取得偵測到的臉部陣列,並將其與指定的PersonGroup(在先前章節中定義和訓練)進行比較。

如果所偵測到的臉部與群組中的某個Person相符,便會儲存結果。

//Identifythefacesinthetestimagewitheveryoneinthepersongroupasaquery identifyRequestBody:=face.IdentifyRequest{FaceIds:&testImageFaceIDs,PersonGroupID:&personGroupID} identifiedFaces,err:=client.Identify(faceContext,identifyRequestBody) iferr!=nil{log.Fatal(err)} 此程式碼接著會將詳細的比對結果列印到主控台。

//Gettheresultwhichperson(s)wereidentified iFaces:=*identifiedFaces.Value for_,person:=rangeiFaces{ fmt.Println("PersonforfaceID:") fmt.Print(person.FaceID) fmt.Println("isidentifiedin"+personGroupTestImageName+".") } 驗證臉部 驗證作業會取得臉部識別碼,以及另一個臉部識別碼或Person物件,然後判斷這些項目是否屬於同一人。

驗證可以用來再次檢查識別作業所傳回的臉部相符。

下列程式碼會偵測兩個來源影像中的臉部,然後根據從目標影像中偵測到的臉部來對來源影像中的臉部進行驗證。

取得測試影像 下列程式碼區塊會宣告變數,以指向驗證作業的目標和來源影像。

//Createaslicelisttoholdthetargetphotosofthesameperson targetImageFileNames:=make([]string,2) targetImageFileNames[0]="Family1-Dad1.jpg" targetImageFileNames[1]="Family1-Dad2.jpg" //Thesourcephotoscontainthisperson,maybe sourceImageFileName1:="Family1-Dad3.jpg" sourceImageFileName2:="Family1-Son1.jpg" 偵測臉部以進行驗證 下列程式碼會偵測來源和目標影像中的臉部,並將其儲存至變數。

//DetectWithURLparameters urlSource1:=imageBaseURL+sourceImageFileName1 urlSource2:=imageBaseURL+sourceImageFileName2 url1:=face.ImageURL{URL:&urlSource1} url2:=face.ImageURL{URL:&urlSource2} returnFaceIDVerify:=true returnFaceLandmarksVerify:=false returnRecognitionModelVerify:=false //Detectface(s)fromsourceimage1,returnsaListDetectedFacestruct //Wespecifydetectionmodel3becausewearenotretrievingattributes. detectedVerifyFaces1,dErrV1:=client.DetectWithURL(faceContext,url1,&returnFaceIDVerify,&returnFaceLandmarksVerify,nil,face.Recognition04,&returnRecognitionModelVerify,face.Detection03) ifdErrV1!=nil{log.Fatal(dErrV1)} //Dereferencetheresult,beforegettingtheID dVFaceIds1:=*detectedVerifyFaces1.Value //GetIDofthedetectedface imageSource1Id:=dVFaceIds1[0].FaceID fmt.Println(fmt.Sprintf("%vface(s)detectedfromimage:%v",len(dVFaceIds1),sourceImageFileName1)) //Detectface(s)fromsourceimage2,returnsaListDetectedFacestruct //Wespecifydetectionmodel3becausewearenotretrievingattributes. detectedVerifyFaces2,dErrV2:=client.DetectWithURL(faceContext,url2,&returnFaceIDVerify,&returnFaceLandmarksVerify,nil,face.Recognition04,&returnRecognitionModelVerify,face.Detection03) ifdErrV2!=nil{log.Fatal(dErrV2)} //Dereferencetheresult,beforegettingtheID dVFaceIds2:=*detectedVerifyFaces2.Value //GetIDofthedetectedface imageSource2Id:=dVFaceIds2[0].FaceID fmt.Println(fmt.Sprintf("%vface(s)detectedfromimage:%v",len(dVFaceIds2),sourceImageFileName2)) //Detectfacesfromeachtargetimageurlinlist.DetectWithURLreturnsaVerifyResultwithValueoflist[DetectedFaces] //EmptyslicelistforthetargetfaceIDs(UUIDs) vardetectedVerifyFacesIds[2]uuid.UUID fori,imageFileName:=rangetargetImageFileNames{ urlSource:=imageBaseURL+imageFileName url:=face.ImageURL{URL:&urlSource} //Wespecifydetectionmodel3becausewearenotretrievingattributes. detectedVerifyFaces,dErrV:=client.DetectWithURL(faceContext,url,&returnFaceIDVerify,&returnFaceLandmarksVerify,nil,face.Recognition04,&returnRecognitionModelVerify,face.Detection03) ifdErrV!=nil{log.Fatal(dErrV)} //Dereference*[]DetectedFacefromValueinordertoloopthroughit. dVFaces:=*detectedVerifyFaces.Value //Addthereturnedface'sfaceID detectedVerifyFacesIds[i]=*dVFaces[0].FaceID fmt.Println(fmt.Sprintf("%vface(s)detectedfromimage:%v",len(dVFaces),imageFileName)) } 取得驗證結果 下列程式碼會將每個來源影像與目標影像進行比較,並列印訊息來指出這些影像是否屬於同一人。

//Verificationexampleforfacesofthesameperson.Thehighertheconfidence,themoreidenticalthefacesintheimagesare. //Sincetargetfacesarethesameperson,inthisexample,wecanusethe1stIDinthedetectedVerifyFacesIdslisttocompare. verifyRequestBody1:=face.VerifyFaceToFaceRequest{FaceID1:imageSource1Id,FaceID2:&detectedVerifyFacesIds[0]} verifyResultSame,vErrSame:=client.VerifyFaceToFace(faceContext,verifyRequestBody1) ifvErrSame!=nil{log.Fatal(vErrSame)} fmt.Println() //Checkifthefacesarefromthesameperson. if(*verifyResultSame.IsIdentical){ fmt.Println(fmt.Sprintf("Facesfrom%v&%vareofthesameperson,withconfidence%v", sourceImageFileName1,targetImageFileNames[0],strconv.FormatFloat(*verifyResultSame.Confidence,'f',3,64))) }else{ //Lowconfidencemeanstheyaremoredifferantthansame. fmt.Println(fmt.Sprintf("Facesfrom%v&%vareofadifferentperson,withconfidence%v", sourceImageFileName1,targetImageFileNames[0],strconv.FormatFloat(*verifyResultSame.Confidence,'f',3,64))) } //Verificationexampleforfacesofdifferentpersons. //Sincetargetfacesaresameperson,inthisexample,wecanusethe1stIDinthedetectedVerifyFacesIdslisttocompare. verifyRequestBody2:=face.VerifyFaceToFaceRequest{FaceID1:imageSource2Id,FaceID2:&detectedVerifyFacesIds[0]} verifyResultDiff,vErrDiff:=client.VerifyFaceToFace(faceContext,verifyRequestBody2) ifvErrDiff!=nil{log.Fatal(vErrDiff)} //Checkifthefacesarefromthesameperson. if(*verifyResultDiff.IsIdentical){ fmt.Println(fmt.Sprintf("Facesfrom%v&%vareofthesameperson,withconfidence%v", sourceImageFileName2,targetImageFileNames[0],strconv.FormatFloat(*verifyResultDiff.Confidence,'f',3,64))) }else{ //Lowconfidencemeanstheyaremoredifferantthansame. fmt.Println(fmt.Sprintf("Facesfrom%v&%vareofadifferentperson,withconfidence%v", sourceImageFileName2,targetImageFileNames[0],strconv.FormatFloat(*verifyResultDiff.Confidence,'f',3,64))) } 尋找類似臉部 下列程式碼會取得一個偵測到的臉部(來源),並搜尋一組其他臉部(目標)來尋找相符臉部(依影像進行臉部搜尋)。

若找到相符的臉部,便會將相符臉部的識別碼列印到主控台。

偵測臉部以進行比較 首先,將參考儲存在[偵測並分析]區段中所偵測到的臉部。

此臉部會是來源。

//SelectanIDinsingle-facedimageforcomparisontofacesdetectedingroupimage.UsedinFindSimilar. firstImageFaceID:=dFaces[0].FaceID 然後輸入下列程式碼,以偵測不同影像中的一組臉部。

這些臉部會是目標。

//Detectthefacesinanimagethatcontainsmultiplefaces groupImageURL:="http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg" groupImageName:=path.Base(groupImageURL) groupImage:=face.ImageURL{URL:&groupImageURL} //APIcalltodetectfacesingroupimage,usingrecognitionmodel4.ThisreturnsaListDetectedFacestruct. //Wespecifydetectionmodel3becausewearenotretrievingattributes. detectedGroupFaces,dgErr:=client.DetectWithURL(faceContext,groupImage,&returnFaceID,&returnFaceLandmarks,nil,face.Recognition04,&returnRecognitionModel,face.Detection03) ifdgErr!=nil{log.Fatal(dgErr)} fmt.Println() //Detectfacesinthegroupimage. //Dereference*[]DetectedFace,inordertoloopthroughit. dFaces2:=*detectedGroupFaces.Value //MakeslicelistofUUIDs faceIDs:=make([]uuid.UUID,len(dFaces2)) fmt.Print("Detectedfacesin("+groupImageName+")withID(s):\n") fori,face:=rangedFaces2{ faceIDs[i]=*face.FaceID//DereferenceDetectedFace.FaceID fmt.Println(*face.FaceID) } 尋找相符臉部 下列程式碼會使用FindSimilar方法,尋找符合來源臉部的所有目標臉部。

//Addsingle-facedimageIDtostruct findSimilarBody:=face.FindSimilarRequest{FaceID:firstImageFaceID,FaceIds:&faceIDs} //Getthelistofsimilarfacesfoundinthegroupimageofpreviouslydetectedfaces listSimilarFaces,sErr:=client.FindSimilar(faceContext,findSimilarBody) ifsErr!=nil{log.Fatal(sErr)} //The*[]SimilarFace simFaces:=*listSimilarFaces.Value 列印相符臉部 下列程式碼會將相符臉部的詳細資料列印到主控台。

//Printthedetailsofthesimilarfacesdetected fmt.Print("Similarfacesfoundin("+groupImageName+")withID(s):\n") varsScorefloat64 for_,face:=rangesimFaces{ fmt.Println(face.FaceID) //Confidenceofthefoundfacewithrange0.0to1.0. sScore=*face.Confidence fmt.Println("Thesimilarityconfidence:",strconv.FormatFloat(sScore,'f',3,64)) } 執行應用程式 使用gorun命令,從應用程式目錄執行臉部辨識應用程式。

gorunsample-app.go 清除資源 如果您想要清除和移除認知服務訂用帳戶,則可以刪除資源或資源群組。

刪除資源群組也會刪除其關聯的任何其他資源。

入口網站 AzureCLI 如果您在本快速入門中建立了PersonGroup,但想要將其刪除,請呼叫Delete方法。

後續步驟 在本快速入門中,您已了解如何使用適用於Go的臉部用戶端程式庫來執行基本臉部辨識工作。

接下來,瞭解不同的臉部偵測模型,以及如何為您的使用案例指定正確的模型。

指定臉部偵測模型版本 什麼是臉部辨識服務? 此範例的原始程式碼可以在GitHub上找到。

快速入門:適用于JavaScript的臉部用戶端程式庫 開始使用適用于JavaScript的臉部用戶端程式庫進行臉部辨識。

請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用適用于JavaScript的臉部用戶端程式庫: 偵測並分析臉部 識別臉部 尋找類似臉部 參考檔連結庫來源程式碼封裝(npm)樣品 必要條件 Azure訂用帳戶-建立免費帳戶 Node.js的最新版本 您的Azure帳戶必須具有已指派的認知服務參與者角色,才能同意負責任AI條款並建立資源。

請洽詢您的管理員,以將此角色指派給您的帳戶。

擁有Azure訂用帳戶之後,請在Azure入口網站中建立臉部資源,以取得您的金鑰和端點。

在其部署後,按一下[前往資源]。

您需要來自所建立資源的金鑰和端點,以將應用程式連線至FaceAPI。

您稍後會在快速入門中將金鑰和端點貼到下列程式碼中。

您可以使用免費定價層(F0)來試用服務,之後可升級至付費層以用於實際執行環境。

設定 建立新的Node.js應用程式 在主控台視窗(例如cmd、PowerShell或Bash)中,為您的應用程式建立新的目錄,並瀏覽至該目錄。

mkdirmyapp&&cdmyapp 執行命令npminit,以使用package.json檔案建立節點應用程式。

npminit 安裝用戶端程式庫 安裝ms-rest-azure和azure-cognitiveservices-faceNPM套件: npminstall@azure/cognitiveservices-face@azure/ms-rest-js 您應用程式的package.json檔案會隨著相依性而更新。

建立名為index.js的檔案,並匯入下列程式庫: 提示 想要立刻檢視整個快速入門程式碼檔案嗎?您可以在GitHub上找到該檔案,其中包含本快速入門中的程式碼範例。

constmsRest=require("@azure/ms-rest-js"); constFace=require("@azure/cognitiveservices-face"); constuuid=require("uuid/v4"); 為資源的Azure端點和金鑰建立變數。

重要 移至Azure入口網站。

如果您在[必要條件]區段中建立的臉部資源已成功部署,請按一下[下一步]下的[移至資源]按鈕。

您可以在[資源管理]底下的[金鑰和端點]頁面中找到金鑰和端點。

完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。

在生產環境中,請考慮使用安全的方式來儲存及存取您的認證。

如需詳細資訊,請參閱認知服務安全性一文。

key="" endpoint="" 物件模型 下列類別和介面會處理臉部.NET用戶端程式庫的一些主要功能: 名稱 描述 FaceClient 此類別代表可使用臉部服務的授權,需要有此授權才能執行所有臉部功能。

您可以使用訂用帳戶資訊來具現化此類別,並用其來產生其他類別的執行個體。

臉部 此類別會處理可使用人臉來執行的基本偵測和辨識工作。

DetectedFace 此類別代表從影像中單一臉部所偵測到的所有資料。

您可以用此資料來取出該臉部的詳細資訊。

FaceList 此類別會管理儲存於雲端的FaceList建構,而這些建構會儲存一組混合的臉部。

PersonGroupPerson 此類別會管理儲存於雲端的Person建構,而這些建構會儲存一組屬於單一人員的臉部。

PersonGroup 此類別會管理儲存於雲端的PersonGroup建構,而這些建構會儲存一組混合的Person物件。

程式碼範例 下列程式碼片段說明如何使用適用於.NET的臉部用戶端程式庫來執行下列工作: 驗證用戶端 偵測並分析臉部 識別臉部 尋找類似臉部 提示 想要立刻檢視整個快速入門程式碼檔案嗎?您可以在GitHub上找到該檔案,其中包含本快速入門中的程式碼範例。

驗證用戶端 使用端點和金鑰來具現化用戶端。

使用您的金鑰建立ApiKeyCredentials物件,並將它與您的端點搭配使用,以建立FaceClient物件。

constcredentials=newmsRest.ApiKeyCredentials({inHeader:{'Ocp-Apim-Subscription-Key':key}}); constclient=newFace.FaceClient(credentials,endpoint); 宣告全域值和helper函數 您稍後將新增的數個臉部作業需要下列全域值。

URL會指向範例影像的資料夾。

UUID將作為您將建立之PersonGroup的名稱和識別碼。

constimage_base_url="https://csdx.blob.core.windows.net/resources/Face/Images/"; constperson_group_id=uuid(); 您將使用下列函式來等候定型PersonGroup完成。

functionsleep(ms){ returnnewPromise(resolve=>setTimeout(resolve,ms)); } 偵測並分析臉部 需要臉部偵測作為臉部分析和身分識別驗證的第一個步驟。

本節說明如何傳回額外的臉部屬性資料。

如果您只想要偵測臉部識別或驗證的臉部,請跳至稍後的章節。

取得偵測到的臉部物件 建立新方法來偵測臉部。

DetectFaceExtract方法會處理指定URL上的三個影像,並在程式記憶體中建立DetectFaceExtract物件的清單。

FaceAttributeType值的清單會指定要擷取的特徵。

DetectFaceExtract方法接著會針對每個偵測到的臉部剖析並列印屬性資料。

每個屬性必須在原始的臉部偵測API呼叫中個別指定(在FaceAttributeType清單中)。

下列程式碼會處理每個屬性,但您可能只需要使用一個或幾個屬性。

asyncfunctionDetectFaceExtract(){ console.log("========DETECTFACES========"); console.log(); //Createalistofimages constimage_file_names=[ "detection1.jpg",//singlefemalewithglasses //"detection2.jpg",//(optional:singleman) //"detection3.jpg",//(optional:singlemaleconstructionworker) //"detection4.jpg",//(optional:3peopleatcafe,1isblurred) "detection5.jpg",//family,womanchildman "detection6.jpg"//elderlycouple,malefemale ]; //NOTEawaitdoesnotworkproperlyinfor,forEach,andwhileloops.UseArray.mapandPromise.allinstead. awaitPromise.all(image_file_names.map(asyncfunction(image_file_name){ letdetected_faces=awaitclient.face.detectWithUrl(image_base_url+image_file_name, { returnFaceAttributes:["Accessories","Age","Blur","Emotion","Exposure","FacialHair","Gender","Glasses","Hair","HeadPose","Makeup","Noise","Occlusion","Smile"], //Wespecifydetectionmodel1becauseweareretrievingattributes. detectionModel:"detection_01" }); console.log(detected_faces.length+"face(s)detectedfromimage"+image_file_name+"."); console.log("Faceattributesforface(s)in"+image_file_name+":"); //Parseandprintallattributesofeachdetectedface. detected_faces.forEach(asyncfunction(face){ //Gettheboundingboxoftheface console.log("Boundingbox:\nLeft:"+face.faceRectangle.left+"\nTop:"+face.faceRectangle.top+"\nWidth:"+face.faceRectangle.width+"\nHeight:"+face.faceRectangle.height); //Gettheaccessoriesoftheface letaccessories=face.faceAttributes.accessories.join(); if(0===accessories.length){ console.log("Noaccessoriesdetected."); } else{ console.log("Accessories:"+accessories); } //Getfaceotherattributes console.log("Age:"+face.faceAttributes.age); console.log("Blur:"+face.faceAttributes.blur.blurLevel); //Getemotionontheface letemotions=""; letemotion_threshold=0.0; if(face.faceAttributes.emotion.anger>emotion_threshold){emotions+="anger,";} if(face.faceAttributes.emotion.contempt>emotion_threshold){emotions+="contempt,";} if(face.faceAttributes.emotion.disgust>emotion_threshold){emotions+="disgust,";} if(face.faceAttributes.emotion.fear>emotion_threshold){emotions+="fear,";} if(face.faceAttributes.emotion.happiness>emotion_threshold){emotions+="happiness,";} if(face.faceAttributes.emotion.neutral>emotion_threshold){emotions+="neutral,";} if(face.faceAttributes.emotion.sadness>emotion_threshold){emotions+="sadness,";} if(face.faceAttributes.emotion.surprise>emotion_threshold){emotions+="surprise,";} if(emotions.length>0){ console.log("Emotions:"+emotions.slice(0,-2)); } else{ console.log("Noemotionsdetected."); } //Getmorefaceattributes console.log("Exposure:"+face.faceAttributes.exposure.exposureLevel); if(face.faceAttributes.facialHair.moustache+face.faceAttributes.facialHair.beard+face.faceAttributes.facialHair.sideburns>0){ console.log("FacialHair:Yes"); } else{ console.log("FacialHair:No"); } console.log("Gender:"+face.faceAttributes.gender); console.log("Glasses:"+face.faceAttributes.glasses); //Gethaircolor varcolor=""; if(face.faceAttributes.hair.hairColor.length===0){ if(face.faceAttributes.hair.invisible){color="Invisible";}else{color="Bald";} } else{ color="Unknown"; varhighest_confidence=0.0; face.faceAttributes.hair.hairColor.forEach(function(hair_color){ if(hair_color.confidence>highest_confidence){ highest_confidence=hair_color.confidence; color=hair_color.color; } }); } console.log("Hair:"+color); //Getmoreattributes console.log("Headpose:"); console.log("Pitch:"+face.faceAttributes.headPose.pitch); console.log("Roll:"+face.faceAttributes.headPose.roll); console.log("Yaw:"+face.faceAttributes.headPose.yaw); console.log("Makeup:"+((face.faceAttributes.makeup.eyeMakeup||face.faceAttributes.makeup.lipMakeup)?"Yes":"No")); console.log("Noise:"+face.faceAttributes.noise.noiseLevel); console.log("Occlusion:"); console.log("Eyeoccluded:"+(face.faceAttributes.occlusion.eyeOccluded?"Yes":"No")); console.log("Foreheadoccluded:"+(face.faceAttributes.occlusion.foreheadOccluded?"Yes":"No")); console.log("Mouthoccluded:"+(face.faceAttributes.occlusion.mouthOccluded?"Yes":"No")); console.log("Smile:"+face.faceAttributes.smile); console.log(); }); })); } 提示 您也可以偵測本機影像中的臉部。

請參閱臉部方法,例如>faceclient.face.detectwithstreamasync。

識別臉部 「識別」作業會取得個人(或多人)的影像,並尋找與影像中每個臉部相關聯的已儲存person物件(臉部辨識搜尋)。

其會比較所偵測到的每個臉部與PersonGroup,該資料庫具有已知臉部特徵的不同Person物件。

為了進行識別作業,您必須先建立並定型PersonGroup。

將臉部新增至PersonGroup 建立下列函式,以將臉部新增至PersonGroup。

asyncfunctionAddFacesToPersonGroup(person_dictionary,person_group_id){ console.log("Addingfacestopersongroup..."); //Thesimilarfaceswillbegroupedintoasinglepersongroupperson. awaitPromise.all(Object.keys(person_dictionary).map(asyncfunction(key){ constvalue=person_dictionary[key]; //Waitbrieflysowedonotexceedratelimits. awaitsleep(1000); letperson=awaitclient.personGroupPerson.create(person_group_id,{name:key}); console.log("Createapersongroupperson:"+key+"."); //Addfacestothepersongroupperson. awaitPromise.all(value.map(asyncfunction(similar_image){ console.log("Addfacetothepersongroupperson:("+key+")fromimage:"+similar_image+"."); awaitclient.personGroupPerson.addFaceFromUrl(person_group_id,person.personId,image_base_url+similar_image); })); })); console.log("Doneaddingfacestopersongroup."); } 等待訓練PersonGroup 建立下列helper函式以等候PersonGroup完成定型。

asyncfunctionWaitForPersonGroupTraining(person_group_id){ //Waitsowedonotexceedratelimits. console.log("Waiting10seconds..."); awaitsleep(10000); letresult=awaitclient.personGroup.getTrainingStatus(person_group_id); console.log("Trainingstatus:"+result.status+"."); if(result.status!=="succeeded"){ awaitWaitForPersonGroupTraining(person_group_id); } } 建立PersonGroup 下列程式碼: 建立PersonGroup 藉由呼叫您先前定義的來將臉部新增至PersonGroup。

訓練PersonGroup。

識別PersonGroup中的臉部。

此PersonGroup及其相關聯的人員物件現在已準備好用於驗證、識別或群組作業。

asyncfunctionIdentifyInPersonGroup(){ console.log("========IDENTIFYFACES========"); console.log(); //Createadictionaryforallyourimages,groupingsimilaronesunderthesamekey. constperson_dictionary={ "Family1-Dad":["Family1-Dad1.jpg","Family1-Dad2.jpg"], "Family1-Mom":["Family1-Mom1.jpg","Family1-Mom2.jpg"], "Family1-Son":["Family1-Son1.jpg","Family1-Son2.jpg"], "Family1-Daughter":["Family1-Daughter1.jpg","Family1-Daughter2.jpg"], "Family2-Lady":["Family2-Lady1.jpg","Family2-Lady2.jpg"], "Family2-Man":["Family2-Man1.jpg","Family2-Man2.jpg"] }; //Agroupphotothatincludessomeofthepersonsyouseektoidentifyfromyourdictionary. letsource_image_file_name="identification1.jpg"; //Createapersongroup. console.log("CreatingapersongroupwithID:"+person_group_id); awaitclient.personGroup.create(person_group_id,{name:person_group_id,recognitionModel:"recognition_04"}); awaitAddFacesToPersonGroup(person_dictionary,person_group_id); //Starttotrainthepersongroup. console.log(); console.log("Trainingpersongroup:"+person_group_id+"."); awaitclient.personGroup.train(person_group_id); awaitWaitForPersonGroupTraining(person_group_id); console.log(); //Detectfacesfromsourceimageurl. letface_ids=(awaitDetectFaceRecognize(image_base_url+source_image_file_name)).map(face=>face.faceId); //Identifythefacesinapersongroup. letresults=awaitclient.face.identify(face_ids,{personGroupId:person_group_id}); awaitPromise.all(results.map(asyncfunction(result){ letperson=awaitclient.personGroupPerson.get(person_group_id,result.candidates[0].personId); console.log("Person:"+person.name+"isidentifiedforfacein:"+source_image_file_name+"withID:"+result.faceId+".Confidence:"+result.candidates[0].confidence+"."); })); console.log(); } 提示 您也可以從本機影像建立PersonGroup。

請參閱AddFaceFromStream等PersonGroupPerson方法。

尋找類似臉部 下列程式碼會取得一個偵測到的臉部(來源),並搜尋一組其他臉部(目標)來尋找相符臉部(依影像進行臉部搜尋)。

若找到相符的臉部,便會將相符臉部的識別碼列印到主控台。

偵測臉部以進行比較 首先,定義第二個臉部偵測方法。

您必須先偵測影像中的臉部,才能進行比較,而此偵測方法已針對比較作業進行最佳化。

該方法不會擷取詳細的臉部特性(如上節中所述),而是會使用不同的辨識模型。

asyncfunctionDetectFaceRecognize(url){ //DetectfacesfromimageURL.Sinceonlyrecognizing,usetherecognitionmodel4. //Weusedetectionmodel3becausewearenotretrievingattributes. letdetected_faces=awaitclient.face.detectWithUrl(url, { detectionModel:"detection_03", recognitionModel:"recognition_04" }); returndetected_faces; } 尋找相符臉部 下列方法會在一組目標影像和單一來源影像中偵測臉部。

然後,該方法會比較這些影像,並尋找與來源影像類似的所有目標影像。

最後,它會將相符的詳細資料列印到主控台。

asyncfunctionFindSimilar(){ console.log("========FINDSIMILAR========"); console.log(); constsource_image_file_name="findsimilar.jpg"; consttarget_image_file_names=[ "Family1-Dad1.jpg", "Family1-Daughter1.jpg", "Family1-Mom1.jpg", "Family1-Son1.jpg", "Family2-Lady1.jpg", "Family2-Man1.jpg", "Family3-Lady1.jpg", "Family3-Man1.jpg" ]; lettarget_face_ids=(awaitPromise.all(target_image_file_names.map(asyncfunction(target_image_file_name){ //Detectfacesfromtargetimageurl. varfaces=awaitDetectFaceRecognize(image_base_url+target_image_file_name); console.log(faces.length+"face(s)detectedfromimage:"+target_image_file_name+"."); returnfaces.map(function(face){returnface.faceId});; }))).flat(); //Detectfacesfromsourceimageurl. letdetected_faces=awaitDetectFaceRecognize(image_base_url+source_image_file_name); //Findasimilarface(s)inthelistofIDs.Comapringonlythefirstinlistfortestingpurposes. letresults=awaitclient.face.findSimilar(detected_faces[0].faceId,{faceIds:target_face_ids}); results.forEach(function(result){ console.log("Facesfrom:"+source_image_file_name+"andID:"+result.faceId+"aresimilarwithconfidence:"+result.confidence+"."); }); console.log(); } 主要區段 最後,建立main並呼叫函數。

asyncfunctionmain(){ awaitDetectFaceExtract(); awaitFindSimilar(); awaitIdentifyInPersonGroup(); console.log("Done."); } main(); 執行應用程式 使用快速入門檔案上使用node命令執行應用程式。

nodeindex.js 清除資源 如果您想要清除和移除認知服務訂用帳戶,則可以刪除資源或資源群組。

刪除資源群組也會刪除其關聯的任何其他資源。

入口網站 AzureCLI 後續步驟 在本快速入門中,您已瞭解如何使用適用于JavaScript的臉部用戶端程式庫來進行臉部辨識工作。

接下來,瞭解不同的臉部偵測模型,以及如何為您的使用案例指定正確的模型。

指定臉部偵測模型版本 什麼是臉部辨識服務? 此範例的原始程式碼可以在GitHub上找到。

開始使用適用於Python的臉部用戶端程式庫進行臉部辨識。

請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用適用於Python的臉部用戶端程式庫來: 偵測並分析臉部 識別臉部 驗證臉部 尋找類似臉部 參考檔連結庫來源程式碼封裝(PiPy)樣品 必要條件 Azure訂用帳戶-建立免費帳戶 Python3.x 您的Python安裝應包含pip。

您可以pip--version在命令列上執行來檢查是否已安裝pip。

安裝最新版本的Python以取得pip。

您的Azure帳戶必須具有已指派的認知服務參與者角色,才能同意負責任AI條款並建立資源。

請洽詢您的管理員,以將此角色指派給您的帳戶。

擁有Azure訂用帳戶之後,請,在Azure入口網站中建立臉部資源,以取得您的金鑰和端點。

在其部署後,按一下[前往資源]。

您需要來自所建立資源的金鑰和端點,以將應用程式連線至FaceAPI。

您稍後會在快速入門中將金鑰和端點貼到下列程式碼中。

您可以使用免費定價層(F0)來試用服務,之後可升級至付費層以用於實際執行環境。

設定 安裝用戶端程式庫 安裝Python之後,您可以透過以下項目安裝用戶端程式庫: pipinstall--upgradeazure-cognitiveservices-vision-face 建立新的Python應用程式 建立新的Python腳本-例如quickstart-file.py。

在您慣用的編輯器或IDE中開啟該檔案,並匯入下列程式庫。

importasyncio importio importglob importos importsys importtime importuuid importrequests fromurllib.parseimporturlparse fromioimportBytesIO #Toinstallthismodule,run: #python-mpipinstallPillow fromPILimportImage,ImageDraw fromazure.cognitiveservices.vision.faceimportFaceClient frommsrest.authenticationimportCognitiveServicesCredentials fromazure.cognitiveservices.vision.face.modelsimportTrainingStatusType,Person 提示 想要立刻檢視整個快速入門程式碼檔案嗎?您可以在GitHub上找到該檔案,其中包含本快速入門中的程式碼範例。

然後,為資源的Azure端點和金鑰建立變數。

#Thiskeywillserveallexamplesinthisdocument. KEY="PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE" #Thisendpointwillbeusedinallexamplesinthisquickstart. ENDPOINT="PASTE_YOUR_FACE_ENDPOINT_HERE" 重要 移至Azure入口網站。

如果您在[必要條件]區段中建立的臉部資源已成功部署,請按一下[下一步]下的[移至資源]按鈕。

您可以在[資源管理]底下的[金鑰和端點]頁面中找到金鑰和端點。

完成時,請記得從程式碼中移除金鑰,且不要公開張貼金鑰。

在生產環境中,請考慮使用安全的方式來儲存及存取您的認證。

例如,Azure金鑰保存庫。

物件模型 下列類別和介面會處理臉部Python用戶端程式庫的一些主要功能。

名稱 描述 FaceClient 此類別代表可使用臉部服務的授權,需要有此授權才能執行所有臉部功能。

您可以使用訂用帳戶資訊來具現化此類別,並用其來產生其他類別的執行個體。

FaceOperations 此類別會處理可使用人臉來執行的基本偵測和辨識工作。

DetectedFace 此類別代表從影像中單一臉部所偵測到的所有資料。

您可以用此資料來取出該臉部的詳細資訊。

FaceListOperations 此類別會管理儲存於雲端的FaceList建構,而這些建構會儲存一組混合的臉部。

PersonGroupPersonOperations 此類別會管理儲存於雲端的Person建構,而這些建構會儲存一組屬於單一人員的臉部。

PersonGroupOperations 此類別會管理儲存於雲端的PersonGroup建構,而這些建構會儲存一組混合的Person物件。

ShapshotOperations 此類別會管理快照集功能;您可以用此類別來暫時儲存所有的雲端式臉部資料,並將該資料遷移至新的Azure訂用帳戶。

程式碼範例 這些程式碼片段說明如何使用適用於Python的臉部用戶端程式庫來執行下列工作: 驗證用戶端 偵測並分析臉部 識別臉部 驗證臉部 尋找類似臉部 驗證用戶端 使用端點和金鑰來具現化用戶端。

使用金鑰建立CognitiveServicesCredentials物件,並使用該物件與您的端點建立FaceClient物件。

#CreateanauthenticatedFaceClient. face_client=FaceClient(ENDPOINT,CognitiveServicesCredentials(KEY)) 偵測並分析臉部 臉部分析和身分識別驗證都需要臉部偵測。

本節說明如何傳回額外的臉部屬性資料。

如果您只想要偵測臉部識別或驗證的臉部,請跳至稍後的章節。

下列程式碼會偵測遠端影像中的臉部。

其會將偵測到的臉部識別碼列印到主控台,同時並儲存在程式記憶體中。

然後,其會偵測多人影像中的臉部,同時並將其識別碼列印到主控台。

藉由變更detect_with_url方法中的參數,您可以使用每個DetectedFace物件傳回不同的資訊。

#Detectafaceinanimagethatcontainsasingleface single_face_image_url='https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg' single_image_name=os.path.basename(single_face_image_url) #Weusedetectionmodel3togetbetterperformance. detected_faces=face_client.face.detect_with_url(url=single_face_image_url,detection_model='detection_03') ifnotdetected_faces: raiseException('Nofacedetectedfromimage{}'.format(single_image_name)) #DisplaythedetectedfaceIDinthefirstsingle-faceimage. #FaceIDsareusedforcomparisontofaces(theirIDs)detectedinotherimages. print('DetectedfaceIDfrom',single_image_name,':') forfaceindetected_faces:print(face.face_id) print() #SavethisIDforuseinFindSimilar first_image_face_ID=detected_faces[0].face_id 提示 您也可以偵測本機影像中的臉部。

請參閱FaceOperations方法,例如detect_with_stream。

顯示和框出臉部 下列程式碼會將指定的影像輸出到顯示器,並使用DetectedFace.faceRectangle屬性在臉部周圍繪製矩形。

#Detectafaceinanimagethatcontainsasingleface single_face_image_url='https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg' single_image_name=os.path.basename(single_face_image_url) #Weusedetectionmodel3togetbetterperformance. detected_faces=face_client.face.detect_with_url(url=single_face_image_url,detection_model='detection_03') ifnotdetected_faces: raiseException('Nofacedetectedfromimage{}'.format(single_image_name)) #Convertwidthheighttoapointinarectangle defgetRectangle(faceDictionary): rect=faceDictionary.face_rectangle left=rect.left top=rect.top right=left+rect.width bottom=top+rect.height return((left,top),(right,bottom)) defdrawFaceRectangles(): #Downloadtheimagefromtheurl response=requests.get(single_face_image_url) img=Image.open(BytesIO(response.content)) #Foreachfacereturnedusethefacerectangleanddrawaredbox. print('Drawingrectanglearoundface...seepopupforresults.') draw=ImageDraw.Draw(img) forfaceindetected_faces: draw.rectangle(getRectangle(face),outline='red') #Displaytheimageinthedefaultimagebrowser. img.show() #Uncommentthistoshowthefacerectangles. #drawFaceRectangles() 識別臉部 識別作業會取用個人(或多人)的影像,並尋找影像中每個臉部的身分識別(臉部辨識搜尋)。

其會比較所偵測到的每個臉部與PersonGroup,該資料庫具有已知臉部特徵的不同Person物件。

建立PersonGroup 下列程式碼會建立有三個不同Person物件的PersonGroup。

其會將每個Person與一組影像範例產生關聯,然後進行訓練以辨識每個人。

若要逐步執行此案例,您必須將下列影像儲存至專案的根目錄:https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images。

此影像群組包含三組對應至三個不同人員的臉部影像。

程式碼會定義三個Person物件,並將其與開頭為、和的影像檔產生關聯manchild。

在設定好影像後,請在指令碼頂端為您要建立的PersonGroup物件定義標籤。

#UsedinthePersonGroupOperationsandDeletePersonGroupexamples. #Youcancalllist_person_groupstoprintalistofpreexistingPersonGroups. #SOURCE_PERSON_GROUP_IDshouldbealllowercaseandalphanumeric.Forexample,'mygroupname'(dashesareOK). PERSON_GROUP_ID=str(uuid.uuid4())#assignarandomID(ornameitanything) #UsedfortheDeletePersonGroupexample. TARGET_PERSON_GROUP_ID=str(uuid.uuid4())#assignarandomID(ornameitanything) 然後將下列程式碼新增到指令碼底部。

此程式碼會建立一個PersongGroup和三個Person物件。

''' CreatethePersonGroup ''' #CreateemptyPersonGroup.PersonGroupIDmustbelowercase,alphanumeric,and/orwith'-','_'. print('Persongroup:',PERSON_GROUP_ID) face_client.person_group.create(person_group_id=PERSON_GROUP_ID,name=PERSON_GROUP_ID) #Definewomanfriend woman=face_client.person_group_person.create(PERSON_GROUP_ID,"Woman") #Definemanfriend man=face_client.person_group_person.create(PERSON_GROUP_ID,"Man") #Definechildfriend child=face_client.person_group_person.create(PERSON_GROUP_ID,"Child") 將臉部指派給人員 下列程式碼會排序影像(依影像的前置詞)、偵測臉部,然後將臉部指派給每個Person物件。

''' Detectfacesandregistertocorrectperson ''' #Findalljpegimagesoffriendsinworkingdirectory woman_images=[fileforfileinglob.glob('*.jpg')iffile.startswith("w")] man_images=[fileforfileinglob.glob('*.jpg')iffile.startswith("m")] child_images=[fileforfileinglob.glob('*.jpg')iffile.startswith("ch")] #Addtoawomanperson forimageinwoman_images: w=open(image,'r+b') face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID,woman.person_id,w) #Addtoamanperson forimageinman_images: m=open(image,'r+b') face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID,man.person_id,m) #Addtoachildperson forimageinchild_images: ch=open(image,'r+b') face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID,child.person_id,ch) 提示 您也可以從URL所參考的遠端影像,建立PersonGroup。

請參閱PersonGroupPersonOperations方法,例如add_face_from_url。

訓練PersonGroup 指派臉部之後,您必須訓練PersonGroup,使其能夠識別與其每個Person物件相關聯的視覺功能。

下列程式碼會呼叫非同步訓練方法並輪詢結果,以將狀態列印到主控台。

''' TrainPersonGroup ''' print() print('Trainingthepersongroup...') #Trainthepersongroup face_client.person_group.train(PERSON_GROUP_ID) while(True): training_status=face_client.person_group.get_training_status(PERSON_GROUP_ID) print("Trainingstatus:{}.".format(training_status.status)) print() if(training_status.statusisTrainingStatusType.succeeded): break elif(training_status.statusisTrainingStatusType.failed): face_client.person_group.delete(person_group_id=PERSON_GROUP_ID) sys.exit('Trainingthepersongrouphasfailed.') time.sleep(5) 提示 臉部API會在一組本質為靜態的預建模型上執行(模型的效能不會在服務執行時衰退或改善)。

如果Microsoft更新模型的後端,而未遷移到全新的模型版本,則模型產生的結果可能會變更。

若要利用較新版本的模型,您可以使用相同的註冊映像來重新訓練PersonGroup,進而將較新的模型指定為參數。

取得測試影像 下列程式碼會在專案的根目錄中尋找test-image-person-group.jpg影像,並偵測該影像中的臉部。

您可以使用用於PersonGroup管理的映射來尋找此映射:。

''' IdentifyafaceagainstadefinedPersonGroup ''' #Groupimagefortestingagainst test_image_array=glob.glob('test-image-person-group.jpg') image=open(test_image_array[0],'r+b') print('Pausingfor60secondstoavoidtriggeringratelimitonfreeaccount...') time.sleep(60) #Detectfaces face_ids=[] #Weusedetectionmodel3togetbetterperformance. faces=face_client.face.detect_with_stream(image,detection_model='detection_03') forfaceinfaces: face_ids.append(face.face_id) 輸出識別的臉部識別碼 識別方法會取得所偵測到臉部的陣列,並將這些臉部與PersonGroup進行比較。

如果所偵測到的臉部與某個Person相符,便會儲存結果。

此程式碼會將詳細的比對結果列印到主控台。

#Identifyfaces results=face_client.face.identify(face_ids,PERSON_GROUP_ID) print('Identifyingfacesin{}'.format(os.path.basename(image.name))) ifnotresults: print('Nopersonidentifiedinthepersongroupforfacesfrom{}.'.format(os.path.basename(image.name))) forpersoninresults: iflen(person.candidates)>0: print('PersonforfaceID{}isidentifiedin{}withaconfidenceof{}.'.format(person.face_id,os.path.basename(image.name),person.candidates[0].confidence))#Gettopmostconfidencescore else: print('NopersonidentifiedforfaceID{}in{}.'.format(person.face_id,os.path.basename(image.name))) 驗證臉部 驗證作業會取得臉部識別碼,以及另一個臉部識別碼或Person物件,然後判斷這些項目是否屬於同一人。

驗證可以用來再次檢查識別作業所傳回的臉部相符。

下列程式碼會偵測兩個來源影像中的臉部,然後根據從目標影像中偵測到的臉部來對來源影像中的臉部進行驗證。

取得測試影像 下列程式碼區塊會宣告變數,以指向驗證作業的來源和目標影像。

#BaseurlfortheVerifyandFacelist/LargeFacelistoperations IMAGE_BASE_URL='https://csdx.blob.core.windows.net/resources/Face/Images/' #Createalisttoholdthetargetphotosofthesameperson target_image_file_names=['Family1-Dad1.jpg','Family1-Dad2.jpg'] #Thesourcephotoscontainthisperson source_image_file_name1='Family1-Dad3.jpg' source_image_file_name2='Family1-Son1.jpg' 偵測臉部以進行驗證 下列程式碼會偵測來源和目標影像中的臉部,並將其儲存至變數。

#Detectface(s)fromsourceimage1,returnsalist[DetectedFaces] #Weusedetectionmodel3togetbetterperformance. detected_faces1=face_client.face.detect_with_url(IMAGE_BASE_URL+source_image_file_name1,detection_model='detection_03') #Addthereturnedface'sfaceID source_image1_id=detected_faces1[0].face_id print('{}face(s)detectedfromimage{}.'.format(len(detected_faces1),source_image_file_name1)) #Detectface(s)fromsourceimage2,returnsalist[DetectedFaces] detected_faces2=face_client.face.detect_with_url(IMAGE_BASE_URL+source_image_file_name2,detection_model='detection_03') #Addthereturnedface'sfaceID source_image2_id=detected_faces2[0].face_id print('{}face(s)detectedfromimage{}.'.format(len(detected_faces2),source_image_file_name2)) #ListforthetargetfaceIDs(uuids) detected_faces_ids=[] #Detectfacesfromtargetimageurllist,returnsalist[DetectedFaces] forimage_file_nameintarget_image_file_names: #Weusedetectionmodel3togetbetterperformance. detected_faces=face_client.face.detect_with_url(IMAGE_BASE_URL+image_file_name,detection_model='detection_03') #Addthereturnedface'sfaceID detected_faces_ids.append(detected_faces[0].face_id) print('{}face(s)detectedfromimage{}.'.format(len(detected_faces),image_file_name)) 取得驗證結果 下列程式碼會將每個來源影像與目標影像進行比較,並列印訊息來指出這些影像是否屬於同一人。

#Verificationexampleforfacesofthesameperson.Thehighertheconfidence,themoreidenticalthefacesintheimagesare. #Sincetargetfacesarethesameperson,inthisexample,wecanusethe1stIDinthedetected_faces_idslisttocompare. verify_result_same=face_client.face.verify_face_to_face(source_image1_id,detected_faces_ids[0]) print('Facesfrom{}&{}areofthesameperson,withconfidence:{}' .format(source_image_file_name1,target_image_file_names[0],verify_result_same.confidence) ifverify_result_same.is_identical else'Facesfrom{}&{}areofadifferentperson,withconfidence:{}' .format(source_image_file_name1,target_image_file_names[0],verify_result_same.confidence)) #Verificationexampleforfacesofdifferentpersons. #Sincetargetfacesaresameperson,inthisexample,wecanusethe1stIDinthedetected_faces_idslisttocompare. verify_result_diff=face_client.face.verify_face_to_face(source_image2_id,detected_faces_ids[0]) print('Facesfrom{}&{}areofthesameperson,withconfidence:{}' .format(source_image_file_name2,target_image_file_names[0],verify_result_diff.confidence) ifverify_result_diff.is_identical else'Facesfrom{}&{}areofadifferentperson,withconfidence:{}' .format(source_image_file_name2,target_image_file_names[0],verify_result_diff.confidence)) 尋找類似臉部 下列程式碼會取得一個偵測到的臉部(來源),並搜尋一組其他臉部(目標)來尋找相符臉部(依影像進行臉部搜尋)。

若找到相符的臉部,便會將相符臉部的識別碼列印到主控台。

尋找相符臉部 首先,執行上一節中的程式碼(偵測並分析臉部)以儲存單一臉部的參考。

然後執行下列程式碼,來取得群組影像中數個臉部的參考。

#Detectthefacesinanimagethatcontainsmultiplefaces #EachdetectedfacegetsassignedanewID multi_face_image_url="http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg" multi_image_name=os.path.basename(multi_face_image_url) #Weusedetectionmodel3togetbetterperformance. detected_faces2=face_client.face.detect_with_url(url=multi_face_image_url,detection_model='detection_03') 然後新增下列程式碼區塊,以尋找群組中第一個臉部的實例。

若要了解如何修改此行為,請參閱find_similar方法。

#Searchthroughfacesdetectedingroupimageforthesinglefacefromfirstimage. #First,createalistofthefaceIDsfoundinthesecondimage. second_image_face_IDs=list(map(lambdax:x.face_id,detected_faces2)) #Next,findsimilarfaceIDsliketheonedetectedinthefirstimage. similar_faces=face_client.face.find_similar(face_id=first_image_face_ID,face_ids=second_image_face_IDs) ifnotsimilar_faces: print('Nosimilarfacesfoundin',multi_image_name,'.') 列印相符臉部 使用下列程式碼將相符臉部的詳細資料列印到主控台。

#Printthedetailsofthesimilarfacesdetected else: print('Similarfacesfoundin',multi_image_name+':') forfaceinsimilar_faces: first_image_face_ID=face.face_id #ThesimilarfaceIDsofthesinglefaceimageandthegroupimagedonotneedtomatch, #theyareonlyusedforidentificationpurposesineachimage. #ThesimilarfacesarematchedusingtheCognitiveServicesalgorithminfind_similar(). face_info=next(xforxindetected_faces2ifx.face_id==first_image_face_ID) ifface_info: print('FaceID:',first_image_face_ID) print('Facerectangle:') print('Left:',str(face_info.face_rectangle.left)) print('Top:',str(face_info.face_rectangle.top)) print('Width:',str(face_info.face_rectangle.width)) print('Height:',str(face_info.face_rectangle.height)) 執行應用程式 使用python命令,從應用程式目錄執行臉部辨識應用程式。

pythonquickstart-file.py 清除資源 如果您想要清除和移除認知服務訂用帳戶,則可以刪除資源或資源群組。

刪除資源群組也會刪除其關聯的任何其他資源。

入口網站 AzureCLI 如果您在本快速入門中建立了PersonGroup,但想要將其刪除,請在指令碼中執行下列程式碼: #Deletethemainpersongroup. face_client.person_group.delete(person_group_id=PERSON_GROUP_ID) print("Deletedthepersongroup{}fromthesourcelocation.".format(PERSON_GROUP_ID)) print() 後續步驟 在本快速入門中,您已了解如何使用適用於Python的臉部用戶端程式庫來執行基本臉部辨識工作。

接下來,瞭解不同的臉部偵測模型,以及如何為您的使用案例指定正確的模型。

指定臉部偵測模型版本 什麼是臉部辨識服務? 此範例的原始程式碼可以在GitHub上找到。

開始使用臉部RESTAPI進行臉部辨識。

臉部服務可讓您存取先進的演算法,以偵測和辨識影像中的人臉。

使用臉部RESTAPI來: 偵測並分析臉部 尋找類似臉部 注意 本快速入門會使用cURL命令來呼叫RESTAPI。

您也可以使用程式設計語言來呼叫RESTAPI。

如需C#、Python、Java、JavaScript和Go的範例,請參閱GitHub範例。

必要條件 Azure訂用帳戶-建立免費帳戶 您的Azure帳戶必須具有已指派的認知服務參與者角色,才能同意負責任AI條款並建立資源。

請洽詢您的管理員,以將此角色指派給您的帳戶。

擁有Azure訂用帳戶之後,請,在Azure入口網站中建立臉部資源,以取得您的金鑰和端點。

在其部署後,按一下[前往資源]。

您需要來自所建立資源的金鑰和端點,以將應用程式連線至FaceAPI。

您稍後會在快速入門中將金鑰和端點貼到下列程式碼中。

您可以使用免費定價層(F0)來試用服務,之後可升級至付費層以用於實際執行環境。

PowerShell6.0版+或類似的命令列應用程式。

偵測並分析臉部 您將會使用類似下列的命令來呼叫臉部API,並從影像中取得臉部屬性資料。

首先,將程式碼複製到文字編輯器中,您必須先變更命令的特定部分,才能執行它。

curl-H"Ocp-Apim-Subscription-Key:TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE""TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false"-H"Content-Type:application/json"--data-ascii"{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}" 進行下列變更: 將Ocp-Apim-Subscription-Key指派至您的有效臉部訂用帳戶金鑰。

變更查詢URL的第一個部分,以符合與您訂用帳戶金鑰對應的端點。

注意 2019年7月1日之後建立的新資源會使用自訂的子網域名稱。

如需詳細資訊和完整的區域端點清單,請參閱認知服務的自訂子網域名稱。

選擇性地將要求主體中的URL變更為指向不同的映像。

完成變更之後,請開啟命令提示字元並輸入新的命令。

檢查結果 您應該會在主控台視窗中看到顯示為JSON資料的臉部資訊。

例如: [ { "faceId":"49d55c17-e018-4a42-ba7b-8cbbdfae7c6f", "faceRectangle":{ "top":131, "left":177, "width":162, "height":162 } } ] 取得臉部屬性 若要擷取臉部屬性,請再次呼叫偵測API,但將detectionModel設定為detection_01。

也請新增returnFaceAttributes查詢參數。

此命令現在看起來應該如下所示。

如同前面,插入您的臉部訂用帳戶金鑰和端點。

curl-H"Ocp-Apim-Subscription-Key:TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE""TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_01&returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise"-H"Content-Type:application/json"--data-ascii"{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}" 檢查結果 傳回的臉部資訊現在包含臉部屬性。

例如: [ { "faceId":"49d55c17-e018-4a42-ba7b-8cbbdfae7c6f", "faceRectangle":{ "top":131, "left":177, "width":162, "height":162 }, "faceAttributes":{ "smile":0, "headPose":{ "pitch":0, "roll":0.1, "yaw":-32.9 }, "gender":"female", "age":22.9, "facialHair":{ "moustache":0, "beard":0, "sideburns":0 }, "glasses":"NoGlasses", "emotion":{ "anger":0, "contempt":0, "disgust":0, "fear":0, "happiness":0, "neutral":0.986, "sadness":0.009, "surprise":0.005 }, "blur":{ "blurLevel":"low", "value":0.06 }, "exposure":{ "exposureLevel":"goodExposure", "value":0.67 }, "noise":{ "noiseLevel":"low", "value":0 }, "makeup":{ "eyeMakeup":true, "lipMakeup":true }, "accessories":[], "occlusion":{ "foreheadOccluded":false, "eyeOccluded":false, "mouthOccluded":false }, "hair":{ "bald":0, "invisible":false, "hairColor":[ { "color":"brown", "confidence":1 }, { "color":"black", "confidence":0.87 }, { "color":"other", "confidence":0.51 }, { "color":"blond", "confidence":0.08 }, { "color":"red", "confidence":0.08 }, { "color":"gray", "confidence":0.02 } ] } } } ] 尋找類似臉部 此作業會取得一個偵測到的臉部(來源),並搜尋一組其他臉部(目標)來尋找相符臉部(依影像進行臉部搜尋)。

若找到相符的臉部,便會將相符臉部的識別碼列印到主控台。

偵測臉部以進行比較 首先,您必須先偵測影像中的臉部,才能進行比較。

如同您在[偵測和分析]區段中所做的一樣執行此命令。

此偵測方法已針對比較作業最佳化。

該方法不會擷取詳細的臉部特性(如上節中所述),而是會使用不同的偵測模型。

curl-H"Ocp-Apim-Subscription-Key:TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE""TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false"-H"Content-Type:application/json"--data-ascii"{\"url\":\"https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Dad1.jpg\"}" 尋找JSON回應中的"faceId"值,並儲存到暫存位置。

然後,再次針對其他影像URL呼叫上述命令,並儲存其臉部識別碼。

您會使用這些識別碼作為要從中尋找相似臉部的目標臉部群組。

https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Daughter1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Mom1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Son1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Lady1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Man1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Lady1.jpg https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Man1.jpg 最後,偵測您將用來比對的單一來源臉部,並儲存其識別碼。

將此識別碼與其他識別碼分開。

https://csdx.blob.core.windows.net/resources/Face/Images/findsimilar.jpg 尋找相符臉部 將下列命令複製到文字編輯器。

curl-v-XPOST"https://westus.api.cognitive.microsoft.com/face/v1.0/findsimilars"-H"Content-Type:application/json"-H"Ocp-Apim-Subscription-Key:{subscriptionkey}"--data-ascii"{body}" 接著進行下列變更: 將Ocp-Apim-Subscription-Key指派至您的有效臉部訂用帳戶金鑰。

變更查詢URL的第一個部分,以符合與您訂用帳戶金鑰對應的端點。

針對body值使用下列JSON內容: { "faceId":"", "faceIds":[], "maxNumOfCandidatesReturned":10, "mode":"matchPerson" } 使用"faceId"的來源臉部識別碼。

將其他臉部識別碼貼入"faceIds"陣列中作為條件。

檢查結果 您會收到JSON回應,其中列出符合查詢項目的臉部識別碼。

[ { "persistedFaceId":"015839fb-fbd9-4f79-ace9-7675fc2f1dd9", "confidence":0.82 }, ... ] 清除資源 如果您想要清除和移除認知服務訂用帳戶,則可以刪除資源或資源群組。

刪除資源群組也會刪除其關聯的任何其他資源。

入口網站 AzureCLI 後續步驟 在本快速入門中,您已了解如何使用臉部RESTAPI執行基本臉部辨識工作。

接下來,瞭解不同的臉部偵測模型,以及如何為您的使用案例指定正確的模型。

指定臉部偵測模型版本 什麼是臉部辨識服務? 本文內容



請為這篇文章評分?