微软认知服务开发实践(4) - 情绪识别

来源:互联网 发布:mac上最好用的输入法 编辑:程序博客网 时间:2024/04/28 08:52

前言

情绪识别是在人脸识别的基础上的更深层次的人工智能的体现,功能即如同字面意义上一样,可以根据图像中人脸的细节自动识别出当前任务的情感信息。微软认知服务中的情绪识别,并非只是给出一种单一的情感,而是在一系列基础的情感上打分,并评价出复合的情感评估结果。

Emotion API

微软认知服务中的Emotion API,可以在输入的图像信息中识别人脸后,进而识别出感情信息,通过针对如下几种情感方向给出打分来给出评估结果。

  1. anger
  2. contempt
  3. disgust
  4. fear
  5. happiness
  6. neutral
  7. sadness
  8. surprise

微软认知服务中的Emotion API,目前支持图片以及视频两种源作为输入源,但是有如下几点限制,

  1. 图片所支持的格式有 JPEG,PNG,BMP以及GIF(第一帧),图片大小不能超过4MB
  2. 图片尺寸需要介于36*36到4096*4096之间
  3. 视频所支持的格式为MP4,MOV以及WMV,视频大小不能超过100MB
  4. 视频尺寸需要介于24*24到2048*2048
  5. 最多能同时识别64张人脸的表情信息
  6. 识别结果将会在保留24小时后删除

总体来说调用分为两种,一种是基于单张图片的识别

  1. 上传图片(可以选择指定脸部区域)
  2. 处理返回结果

另外一种是基于视频的识别:

  1. 上传视频
  2. 查询处理状态
  3. 处理返回结果

Emotion Recognition

情绪识别功能,可以识别照片中人脸的位置信息,以此为基础进而给出情绪评估结果。

首先是接口URL:

https://api.projectoxford.ai/emotion/v1.0/recognize?faceRectangles={faceRectangles}

URL中包含了1个可选参数faceRectangles,通过该参数可以通过形如left,top,width,height的形式给出一个用于识别面部的矩形区域,识别特定于该区域的面部情绪信息。该参数可以不指定,不指定时则会自动识别出图片中所有的面部信息并给出每个人脸识别结果的情绪评估结果。

和之前在计算机视觉中介绍的类似,微软认知服务每个API的调用,都需要在Header中包含Ocp-Apim-Subscription-Key来标示出服务订阅的Key,可以在自己的账户中找到。

这个API通过POST的方式进行调用,除了必要的之外Ocp-Apim-Subscription-Key,还可以设置Content-Type,

键 值 Content-Type(可选) 设定Content-Type信息,这个是可选的,不设定会根据Post过去的数据自动识别出来,可以设定为application/json、application/octet-stream

当设置为application/octet-stream时, POST中的数据直接就是Binary流。而当设置为application/json时,POST中的数据按如下格式实现,

{“url”:”http://example.com/images/test.jpg“}

最后介绍的是这个API的返回值,返回信息为一串JSON字符串。格式如下:

[  {    "faceRectangle": {      "left": 68,      "top": 97,      "width": 64,      "height": 97    },    "scores": {      "anger": 0.00300731952,      "contempt": 5.14648448E-08,      "disgust": 9.180124E-06,      "fear": 0.0001912825,      "happiness": 0.9875571,      "neutral": 0.0009861537,      "sadness": 1.889955E-05,      "surprise": 0.008229999    }  }]

返回的JSON数据中,人脸的数目不一定只有一个,每一个面部信息,都将会被阻止在JSON数据中的第一层中。

每条记录中,首先是faceRectangle,用于标记坐标以及范围,之后就是情绪识别的结果,通过anger、contempt 、disgust、fear 、happiness 、neutral 、sadness以及surprise这8中情感方向来给出复合的识别结果。

同样,如果请求(或调用)API的过程中,如果其中有异常抛出,则会在Response中返回异常的详细内容,类似格式如下:

{ "statusCode": 401, "message": "Access denied due to invalid subscription key. Make sure you are subscribed to an API you are trying to call and provide the right key." }

整个API的具体调用示例,C#可以参考如下:

static async void MakeRequest(){    var client = new HttpClient();    var queryString = HttpUtility.ParseQueryString(string.Empty);    // Request headers    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");    var uri = "https://api.projectoxford.ai/emotion/v1.0/recognize?faceRectangles={faceRectangles}&" + queryString;    HttpResponseMessage response;    // Request body    byte[] byteData = Encoding.UTF8.GetBytes("{body}");    using (var content = new ByteArrayContent(byteData))    {        content.Headers.ContentType = new MediaTypeHeaderValue("< your content type, i.e. application/json >");        response = await client.PostAsync(uri, content);    }}

Emotion Recognition in Video

情绪识别功能,也可以以Video作为输入源进行输入,但是由于处理需要一定时间,所以调用后不会立刻给出结果,而是给出一个Ticket的URL,然后通过这个URL查询处理结果。

Invoke Emotion Recognition in Video

该API通普通的基于图片的识别过程类似,只是输入源改变为了Video而已,同时限制条件也发生了些许变化。
首先是接口URL:

https://api.projectoxford.ai/emotion/v1.0/recognizeinvideo

和之前在计算机视觉中介绍的类似,微软认知服务每个API的调用,都需要在Header中包含Ocp-Apim-Subscription-Key来标示出服务订阅的Key,可以在自己的账户中找到。

该API通过POST方式进行调用,其中视频数据直接就是Binary流。

成功调用该API后,将会返回202响应(Response 202),在返回的Body中不会直接包含识别的结果,而是在Header中包含一个Operation-Location字段用于进行后续处理状态和处理结果的查询操作。

键 值 Operation-Location 用于执行后续处理状态以及处理结果查询用的Ticket的URL,例如: https://api.projectoxford.ai/emotion/v1.0/operations/EF217D0C-9085-45D7-AAE0-2B36471B89B5

整个API的具体调用示例,C#可以参考如下:

static async void MakeRequest(){    var client = new HttpClient();    var queryString = HttpUtility.ParseQueryString(string.Empty);    // Request headers    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");    var uri = "https://api.projectoxford.ai/emotion/v1.0/recognizeinvideo?" + queryString;    HttpResponseMessage response;    // Request body    byte[] byteData = Encoding.UTF8.GetBytes("{body}");    using (var content = new ByteArrayContent(byteData))    {        content.Headers.ContentType = new MediaTypeHeaderValue("< your content type, i.e. application/json >");        response = await client.PostAsync(uri, content);    }}

Get Recognition in Video Operation Result

该API作为基于视频的情绪识别API的延续,用于查询之前进行识别处理视频的状态和处理结果信息。
首先是接口URL:

https://api.projectoxford.ai/emotion/v1.0/operations/{oid}

其中,在请求的URL中包含了oid字段,该字段为一个GUID值,需要在之前所说的基于视频的情绪识别API的调用结果中获取。

和之前在计算机视觉中介绍的类似,微软认知服务每个API的调用,都需要在Header中包含Ocp-Apim-Subscription-Key来标示出服务订阅的Key,可以在自己的账户中找到。

该API在设定好URL后,直接通过GET方式进行调用。

成功调用该API后,可以通过在Body中的内容来了解当前视频处理的状态信息或者是处理结果,其返回的格式可能如下所示,

{    "status": "running",    "createdDateTime":  "2015-09-30T01:28:23Z",    "lastActionDateTime": "2015-09-30T01:32:23Z",}

其中status部分存在如下状态,

键 值 Not Started 视频已经被成功上传但是还未进行处理。 Uploading 视频正在上传过程中。. Running 正在处理中。 Failed 视频处理失败,具体的信息可以在message字段中找到。 Succeeded 视频处理成功,处理的结果存放于processingResult字段中。

整个API的具体调用示例,C#可以参考如下:

static async void MakeRequest(){    var client = new HttpClient();    var queryString = HttpUtility.ParseQueryString(string.Empty);    // Request headers    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");    var uri = "https://api.projectoxford.ai/emotion/v1.0/operations/{oid}?" + queryString;    var response = await client.GetAsync(uri);}

总结

本文针对微软认知服务中的情绪识别做了一些简单的介绍,希望能够对读者有些帮助。
情绪识别目前可以应用于众多领域,例如为失明人士提供便利,可以实现一套软件帮助失明人士了解对面的情绪信息。也可以将其应用在一些特定的场合,实时被测对象当前的状态,以连续跟踪并做出一些人类情感的实验。
任何一种可能侵犯被测对象的使用方式,请在合法范围内使用,视频识别领域很容易一不小心就侵犯了别人的隐私权,所以在实现某些功能时,请遵守当地法律法规。

1 0