用Azure上Cognitive Service的Face API识别人脸

Azure在China已经发布了Cognitive Service,包括人脸识别、计算机视觉识别和情绪识别等服务。

本文将介绍如何用Face API识别本地或URL的人脸。

一 创建Cognitive Service

1 在Azure上创建Cognitive Service的Face服务:

2 获取服务的链接和key:

创建成功后,在overview的页面上可以看到服务链接,已经Key:

有了这些信息后,就可以开始进入coding的阶段了。

二 Python code

1 通过URL链接实现人脸识别

关于Azure 人脸识别的API内容可以参考:

https://docs.microsoft.com/en-us/azure/cognitive-services/Face/APIReference

中的:

https://eastasia.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236/console

部分。

具体python的实现如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#导入相关模块
import httplib, urllib, json

#Face API相关的Key和Endpoint
subscription_key = ‘30a236e53b924f2c943892711d8d0e45‘
uri_base = ‘api.cognitive.azure.cn‘

#定义html的header,这里Content-type决定了body中的类型,是URL还是文件类型的,这里的Json支持URL模式
headers = {
    ‘Content-Type‘: ‘application/json‘,
    ‘Ocp-Apim-Subscription-Key‘: subscription_key,
}
#定义返回的内容,包括FaceId,年龄、性别等等
params = urllib.urlencode({
    ‘returnFaceId‘: ‘true‘,
    ‘returnFaceLandmarks‘: ‘false‘,
    ‘returnFaceAttributes‘: ‘age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise‘,
})
#图片的URL
body = "{‘url‘:‘http://www.bidmc.org/~/media/Images/Research_NotDepartmentResearch/ResearchCenters/Cancer%20Research%20Institute/Wenyi%20Wei%20250.jpg‘}"

#Call Face API,进行人脸识别
try:
    conn = httplib.HTTPSConnection(‘api.cognitive.azure.cn‘)
    conn.request("POST", "/face/v1.0/detect?%s" % params, body, headers)
    response = conn.getresponse()
    data = response.read()
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

输出结果如下:

[
    {
    "faceAttributes": {
        "age": 45.5,
        ...
        "gender": "male",
        "faceId": "b15284c9-ce1c-40eb-a76b-99d5ce381081",
        "faceRectangle": {
            "height": 56,
            "left": 155,
            "top": 50,
            "width": 56
            }
        }
    }
]

可以看到是一个Json的输出,里面包含有FaceId,年龄,性别等各种信息。

2 用本地文件作为源文件进行图片识别

具体的代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#导入相关模块
import httplib, urllib, json
from os.path import expanduser

#Face API相关的Key和Endpoint
subscription_key = ‘30a236e53b924f2c943892711d8d0e45‘
uri_base = ‘api.cognitive.azure.cn‘

#定义html的header,这里Content-type决定了body中的类型,是URL还是文件类型的,这里的Json支持URL模式
headers = {
    ‘Content-Type‘: ‘application/octet-stream‘,
    ‘Ocp-Apim-Subscription-Key‘: subscription_key,
}
#定义返回的内容,包括FaceId,年龄、性别等等
params = urllib.urlencode({
    ‘returnFaceId‘: ‘true‘,
    ‘returnFaceLandmarks‘: ‘false‘,
    ‘returnFaceAttributes‘: ‘age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise‘,
})
#打开本地图片
img = open(expanduser(‘D:\\Heng\\Pictures\\100EOS5D\\C5D_5131.JPG‘), ‘rb‘)
#Call Face API,进行人脸识别
try:
    conn = httplib.HTTPSConnection(‘api.cognitive.azure.cn‘)
    conn.request("POST", "/face/v1.0/detect?%s" % params, img, headers)
    response = conn.getresponse()
    data = response.read()
    parsed = json.loads(data)
    print ("Response:")
    print (json.dumps(parsed, sort_keys=True, indent=2))
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))

输出和前面的类似。

3 给图片中的人脸打框,并表示年龄

根据前面的人脸识别,可以根据返回值,对人脸进行打框,并标识其返回的年龄,具体Python程序如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

#导入相关模块
import httplib, urllib, json
from os.path import expanduser
from PIL import Image, ImageDraw, ImageFont

def getRectangle(mydata):
    left = mydata[u‘left‘]
    top = mydata[u‘top‘]
    bottom = left + mydata[u‘height‘]
    right = top + mydata[u‘width‘]
    return ((left, top), (bottom, right))

#Face API相关的Key和Endpoint
subscription_key = ‘30a236e53b924f2c943892711d8d0e45‘
uri_base = ‘api.cognitive.azure.cn‘

#定义html的header,这里Content-type决定了body中的类型,是URL还是文件类型的,这里的Json支持URL模式
headers = {
    ‘Content-Type‘: ‘application/octet-stream‘,
    ‘Ocp-Apim-Subscription-Key‘: subscription_key,
}
#定义返回的内容,包括FaceId,年龄、性别等等
params = urllib.urlencode({
    ‘returnFaceId‘: ‘true‘,
    ‘returnFaceLandmarks‘: ‘false‘,
    ‘returnFaceAttributes‘: ‘age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise‘,
})
#打开本地图片
#imgfile = ‘D:\\Heng\\Pictures\\C5D_3966.JPG‘
imgfile = ‘D:\\Heng\\desktop\\face.JPG‘

img = open(expanduser(imgfile), ‘rb‘)
#Call Face API,进行人脸识别
try:
    conn = httplib.HTTPSConnection(‘api.cognitive.azure.cn‘)
    conn.request("POST", "/face/v1.0/detect?%s" % params, img, headers)
    response = conn.getresponse()
    data = response.read()
    parsed = json.loads(data)
    conn.close()

except Exception as e:
    print("[Errno {0}] {1}".format(e.errno, e.strerror))
#新建一个文件
newimg = Image.open(imgfile)
draw = ImageDraw.Draw(newimg)
#判断其大小
size = len(str(newimg.size[0]))
#根据大小分配字体大小和字的位置
if size>= 4:
    fs = 50
    ps = 130
else:
    fs = 10
    ps = 13
#图片的字体和颜色
font = ImageFont.truetype("consola.ttf", fs)
draw.ink = 255 + 0 * 256 + 0 * 256 * 256
#给每个识别出的人脸画框、并标识年龄
for a in parsed:
    b = a[u‘faceRectangle‘]
    c = getRectangle(b)
    draw.rectangle(c, outline=‘red‘)
    draw.text([c[0][0],c[0][1]-ps],"Age="+str(a[u‘faceAttributes‘][u‘age‘]),font=font)
newimg.show()
 

其输出是一张如下d 照片:

总结:

通过Azure的Cognitive Service的Face API可以非常方便的进行人脸识别的工作。

时间: 2024-10-08 00:29:59

用Azure上Cognitive Service的Face API识别人脸的相关文章

Azure Cognitive Service 访问优化

目前 MSFT 很多 Cognitive Service 在 China Azure 还没有落地,所以很多小伙伴只能使用国际版的 Azure 提供的 Cognitive 服务.但是这样存在两个问题,1. 使用体验,因为需要通过 Internet 进行调用,访问延迟及质量得不到保证.2. 有些 Cognitive 服务并不是所有 Global Azure 的 Region 都有落地,使得优化空间受限.今天咱们一起来分享一个优化结构的方案,通过将 API 网关前置放在 China Azure 的 R

如何通过Azure Service Management REST API管理Azure服务

通过本文你将了解: 什么是Azure Service Management REST API 如何获取微软Azure 订阅号 如何获取Azure管理证书 如何调用Azure Service Management REST API 什么是Azure Service Management REST API Azure Service Management REST API(之后简称为Azure REST API)是微软开放的一组REST API,它使得Azure用户不仅可以从Azure门户网站上对运

Azure上CentOS上安装LIS (Linux Integration Service)

Azure上虚拟化技术都是采用的Hyper-v,每台Linux虚拟机都安装了LIS(Linux Integration Service).LIS的功能是为VM提供各种虚拟设备的驱动.所以LIS直接影响到VM和底层硬件运行的性能. 在客户有VM各种高性能的处理需求的时候,LIS保证最新版本是非常重要的.本文将介绍如何在CentOS上正确的安装LIS. 1 安装LIS 在以下网站查看最新版的LIS: https://technet.microsoft.com/en-us/windows-server

【我的Microsoft Azure学习之旅】Azure Java SDK - Service Bus的认证问题

最近在研究Microsoft Azure,在分布式消息传递上,Amazon的AWS有SQS,而在Microsoft Azure上与之对应的是Service Bus Queue. Service Bus队列(Queue)的作用是,在分布式应用程序的组件通信时,组件间不会直接相互通信,而是通过充当中介的队列交换消息.这样可以更好地向外扩展应用程序,并增强体系结构的恢复能力,因为消息会被可靠的保存在队列中,不会因一方崩溃而丢失消息. 值得注意的是,Azure还有另外一种Queue,属于存储Storag

Azure上A/D系列虚拟机到DS系列迁移(1)

有一些用户在刚开始的时候创建了A7,D14等虚拟机来跑一些IO要求比较高的应用,比如Oracle数据库,MySQL数据库,等到用户量上来之后,性能不够,需要升级数据磁盘到SSD固态硬盘,但是问题是: Azure的固态硬盘SSD磁盘属于高级存储Premium Storage A系列,D系列的虚拟机无法使用高级存储作为数据磁盘 只有DS,DSv2,GS系列的虚拟机才可以使用SSD作为数据磁盘 A系列,D系列虚拟机无法直接升级为DS/GS系列 GS系列暂时在中国没有上线 那么在这种情况下,除了创建高级

在Azure上实现Linux Server故障转移

要充分利用公有云的弹性扩展和高可用, 首先要在应用系统层面支持横向扩展(scale out),这个说起来很容易,或者说对新开发的应用系统而言已经成为标配.但是对已有的.老旧的应用系统来说,这就比较困难了,不是每个应用系统都能实现/支持横向扩展的.从客户的角度来说,基本上很难接受为了把应用系统迁移到公有云上而去额外投入修改应用系统代码.虽然我们都心知肚明,本质上这是在“偿还技术债”,修改应用系统代码也是为了更好地利用公有云的优势... 对于应用系统的横向扩展而言,“状态”是最大的拦路虎,要支持横向

在 Azure 上使用 Docker运行 Mono

Docker 是最近相当热门的一个名词,它是一个基于 Linux Container 的轻量化的虚拟技术,而微软也相当积极与 Docker 合作,在 Azure 上支持这个火热的技术,并且提供简单的方式来建立 Docker Host,本文将会介绍如何在 Azure 上使用 Docker. Docker 简介 Docker 是一个开源的项目,主要的特点是能将应用程序包装在一个 LXC (Linux Container) 容器中,当这些应用被包装进容器后,部署.迁移都变得更为简单.与传统的虚拟化技术

gRPC helloworld service, RESTful JSON API gateway and swagger UI

概述 本篇博文完整讲述了如果通过 protocol buffers 定义并启动一个 gRPC 服务,然后在 gRPC 服务上提供一个 RESTful JSON API 的反向代理 gateway,最后通过 swagger ui 来提供 RESTful JSON API 的说明,完整代码 helloworld_restful_swagger. Helloworld gRPC Service 参考 gRPC Quick Start for Python. Install gRPC 安装 gRPC 运

Azure上七层负载均衡APP Gateway

Azure的SLB和ILB是最常用的4层负载均衡工具.但有些场景是7层的负载均衡,SLB和ILB就无能为力了. Azure上已经推出了APP Gateway的服务,就是7层负载均衡的负载均衡器. 如上图,APP Gateway实现用户HTTPS网站的SSL Offload,还可以实现多个VM的负载均衡.而且可以实现Cookie Affinity功能,这也是7层负载均衡的一种功能. 通过App Gateway.SLB.Traffic Manager综合使用,可以实现对应用系统的高扩展性: 可以通过