iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 3
0

上一篇我們介紹了讓電腦看圖說故事,那這篇我們就要來介紹更需要具體細節的部分:Face API。

Cognitive Service 針對臉部辨識的部分提供了以下的功能

  • 臉部驗證
    檢查兩張臉部是屬於同一個人的可能性。API 會傳回信心分數,顯示兩張臉部是屬於同一個人的可能性。
  • 臉部偵測
    偵測影像中的一或多張人臉,並取得影像臉部位置所在的臉部矩形及臉部屬性,該屬性內含以機器學習為基礎的臉部特徵預測。可用的臉部屬性功能 包括:年齡、表情、性別、姿勢、微笑及鬍子,以及影像中每張臉部的 27 個地標。
  • 表情辨識
    臉部 API 現在與表情辨識整合,並傳回影像中每個臉部之一組表情的信心分數,例如生氣、藐視、厭惡、恐懼、快樂、不表意見、憂傷及驚奇。這些表情已知可跨文化普遍地與特定臉部表情溝通。

範例網站介紹
Face API 可以分成兩大部分,第一個是針對單一臉部做偵測,可以得知這些臉部的相關資訊,甚至是情緒的部分;另一個則是針對多個臉部,用來比對這多的臉部是否為相同人,簡單來說就是認臉。

我們先來看一下官網的範例,後面再來實際用程式動手做

  • 偵測影像中的臉部

    這邊就用是大家的老婆:新垣結衣,來做為範例一下;這是一張「逃避可恥但有用」的劇照,可以看出它辨識出新垣結衣是女生,年紀只有 20 歲!不虧是大家的老婆;甚至還有是否有戴眼鏡以表情等資訊。

  • 辨識影像中的情感

    在這個範例中就可以看到這是完全針對情緒的參數去做顯示,Cognitive Service 會給每個情緒都有一個分數,最高的分數通常就是結果;以這張來說,新垣結衣被判斷為目前表情情緒是中立。

  • 影像中類似臉部的辨識與分組

    這邊我特地找了「周杰倫」不同時期的照片來測試一下,左邊那張是近期的照片,右邊則是周杰倫超年輕時候的照片。

可以看到其實還是辨識的出來,只是信心程度沒有很高

沒有說信心程度很低就為不可能,有可能正解的信心程度為 0.4,但是其他選項的信心程度只有 0.1,所以最佳解仍為正解。


實際動手做

介紹完範例後,又到了動手做時間,廢話已經說很多,就直接進入 Coding 階段吧

在 Azure Portal 上建立 API Key 與新增專案的部分已於上一篇講解過,所以這邊就不騙篇幅了

這次要新增:人臉辨識 API Key

新增完專案後,首先先來安裝 Nuget 套件:Microsoft.Azure.CognitiveServices.Vision.Face

此 Nuget 套件已經有實作 .NET Standard 所以 .NET Core 也可以使用

現在只有 Preview 版本,所以後面要指定版本號

dotnet add package Microsoft.Azure.CognitiveServices.Vision.Face -v 2.2.0-preview

如果是使用 Package Explorer

Install-Package Microsoft.Azure.CognitiveServices.Vision.Face -Version 2.2.0-preview

示範臉部偵測與表情辨識

我這邊程式就直接使用從 Url 方式來拿到圖片的方式,這邊照片就使用剛剛的範例照片

先把相關變數設定好,像是 API Key 跟 ImageUrl,我把 apiKey 放在 appsettings.json 裡

string apiKey = configuration.GetSection("apiKey").Value;
string imageUrl = "https://cdn-images-1.medium.com/max/1200/0*WVev4lO0ZXp6tDed";

接下來我們就把 FaceClient 給 New 起來,並根據 Azure Portal 上之資訊設定 Endpoint 

FaceClient faceClient = new FaceClient(
    new ApiKeyServiceClientCredentials(apiKey),
    new System.Net.Http.DelegatingHandler[] {});
faceClient.Endpoint = "https://southeastasia.api.cognitive.microsoft.com/";

因為這次安裝的 SDK 為 Preview 狀態,所以 EndPoint 不能這定成跟 Azure Portal 上顯示的一樣,要設為: https://[location].api.cognitive.microsoft.com/;參考:https://github.com/Azure/azure-sdk-for-net/issues/4534

設定完後,在把圖片送出去之前還有最後一步,就是設定你要取得那些資訊欄位,我在這邊就把所有的欄位加進來

private static readonly FaceAttributeType[] faceAttributes =
{
    FaceAttributeType.Age, FaceAttributeType.Gender, FaceAttributeType.Accessories, FaceAttributeType.Blur,
    FaceAttributeType.Emotion, FaceAttributeType.Exposure, FaceAttributeType.FacialHair,
    FaceAttributeType.Glasses, FaceAttributeType.Hair, FaceAttributeType.HeadPose, FaceAttributeType.Makeup,
    FaceAttributeType.Noise, FaceAttributeType.Occlusion, FaceAttributeType.Smile
};

都設定完成後,我們就可以把圖片送出去做辨識啦

Console.WriteLine("Faces being detected ...");
IList<DetectedFace> faceList =
        await faceClient.Face.DetectWithUrlAsync(
            imageUrl, true, false, faceAttributes);

var face = faceList[0];
Console.WriteLine($"FaceId: {face.FaceId}");
Console.WriteLine($"Age: {face.FaceAttributes.Age}");
Console.WriteLine($"Blur: {face.FaceAttributes.Blur.BlurLevel}, {face.FaceAttributes.Blur.Value}");
Console.WriteLine($"Emotion: {{Anger: {face.FaceAttributes.Emotion.Anger}, Contempt: {face.FaceAttributes.Emotion.Contempt}, Disgust: {face.FaceAttributes.Emotion.Disgust}, Fear: {face.FaceAttributes.Emotion.Fear}, Happiness: {face.FaceAttributes.Emotion.Happiness}, Neutral: {face.FaceAttributes.Emotion.Neutral}, Sadness: {face.FaceAttributes.Emotion.Sadness}, Surprise: {face.FaceAttributes.Emotion.Surprise}}}");
Console.WriteLine($"Exposure: {face.FaceAttributes.Exposure.ExposureLevel}, {face.FaceAttributes.Exposure.Value}");
Console.WriteLine($"FacialHair: {{Beard: {face.FaceAttributes.FacialHair.Beard}, Moustache: {face.FaceAttributes.FacialHair.Moustache}, Sideburns: {face.FaceAttributes.FacialHair.Sideburns}}}");
Console.WriteLine($"Gender: {face.FaceAttributes.Gender}");
Console.WriteLine($"Glasses: {face.FaceAttributes.Glasses}");
Console.WriteLine($"Hair: {{HairColor: {face.FaceAttributes.Hair.HairColor[0].Color}:{face.FaceAttributes.Hair.HairColor[0].Confidence}, Bald:{face.FaceAttributes.Hair.Bald}, Invisible:{face.FaceAttributes.Hair.Invisible}}}");
Console.WriteLine($"HeadPose: {{ Pitch: {face.FaceAttributes.HeadPose.Pitch}, Roll: {face.FaceAttributes.HeadPose.Roll}, Yaw:{face.FaceAttributes.HeadPose.Yaw}}}");
Console.WriteLine($"Makeup: {{ EyeMakeup: {face.FaceAttributes.Makeup.EyeMakeup}, LipMakeup: {face.FaceAttributes.Makeup.LipMakeup}}}");
Console.WriteLine($"Noise: {{ NoiseLevel: {face.FaceAttributes.Noise.NoiseLevel}, Value: {face.FaceAttributes.Noise.Value}}}");
Console.WriteLine($"Occlusion: {{ EyeOccluded: {face.FaceAttributes.Occlusion.EyeOccluded}, ForeheadOccluded: {face.FaceAttributes.Occlusion.ForeheadOccluded}, MouthOccluded: {face.FaceAttributes.Occlusion.MouthOccluded}}}");
Console.WriteLine($"Smile: {face.FaceAttributes.Smile}");

結果如下

完整範例程式:https://github.com/MoneyYu/2019ItHelpData


下一篇來講影片索引器


上一篇
Day 02 - Cognitive Service - 辨識 - Computer Vision
下一篇
Day 04 - Cognitive Service - 辨識 - Video Indexer
系列文
Azure Data Service 相關服務基本操作手冊5

尚未有邦友留言

立即登入留言