您现在的位置是:首页 > 文章详情

使用智能媒体管理(IMM)快速搭建人脸搜索服务

日期:2019-01-21点击:369

概述

在服务构建中,我们经常需要对用户的图片做进一步分析。本文利用 智能媒体管理(IMM) 提供的图片索引功能,快速搭建一个人脸搜索的功能,示例使用 Python 2.7 实现。

我们以学生点名场景为例。首先构造学生照片集合,再对现场拍摄的照片进行检测。操作流程如下:

  1. 将所有学生图片传入 OSS 存储中。
  2. 创建一个媒体集 Set,用于存储这些图片的 元数据,本文将利用其中的 人脸特征 数据。
  3. 将所有学生图片预置至 Set 内。
  4. 传入一张待测图片,查找和该照片匹配的人物。

如下图:

routemap

下面我们分步操作一下。

创建 IMM 项目

开通 IMM 服务后,访问 控制台 ,在左侧点击加号创建一个新项目。

左上方地域我们选择 华东1(杭州),右侧的项目名称命名为 RollCallDemo ,所属地域选择 华东1(杭州) ,类型选择 图片标准型QPS 填入 1 ,点击下一步。

截止本文发表时,图片标准型的 1 QPS 是免费的,可以放心测试。参考 计费说明

RollCallDemo_CreateProject

准备测试图片

我们准备了3张学生图片,用于构建学生集:

oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun.jpg oss://imm-user-wmt-cn-hangzhou/roll-call-demo/caichongxin.jpg oss://imm-user-wmt-cn-hangzhou/roll-call-demo/zhangyong.jpg

以及一张待检测图片

oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun-test.jpg

您可以将地址改为 http 路径以在浏览器打开查看。如

https://imm-user-wmt-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/roll-call-demo/mayun.jpg

您也可以自己准备图片。请将图片上传至 OSS 中,并确保 OSS 的 Bucket 桶和第一步创建的 IMM 项目在同一个地域。

开始使用

安装最新版本 阿里云 Python SDK 。可以使用 pip 进行安装

 # Install the core library pip install aliyun-python-sdk-core # Install the ECS management library pip install aliyun-python-sdk-imm

随后复制如下代码,并填入您的 AccessKeyAccessSecret 。您可以在 阿里云用户控制台 获取。

若您使用和本文不同的项目名称、地域、图片等,请修改示例代码中的对应部分。

# -*- coding: utf8 -*- import time import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkimm.request.v20170906 import CreateSetRequest from aliyunsdkimm.request.v20170906 import IndexImageRequest from aliyunsdkimm.request.v20170906 import FindSimilarFacesRequest # 请更换为您自己的 AccessKey 和 AccessSecret AccessKey = "" AccessSecret = "" # 服务开通地域 Region = "cn-hangzhou" # 在 IMM 控制台创建的项目名称 Project = "RollCallDemo" # 用于存储媒体元信息的 Set 的 ID SetId = "roll-call-demo" # 所有学生的照片 OSS URI 和姓名 Students = [ "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun.jpg", "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/caichongxin.jpg", "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/zhangyong.jpg", ] # 待测试的学生照片的 OSS URI CameraPhoto = "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun-test.jpg" # 初始化 AcsClient 客户端,用于调用 API 接口 client = AcsClient( AccessKey, AccessSecret, Region ) # 创建一个媒体集 Set try: request = CreateSetRequest.CreateSetRequest() request.set_Project(Project) request.set_SetId(SetId) response = client.do_action_with_exception(request) print response except ServerException, e: print ("ServerException: ", e.message) # 将学生照片添加至媒体集 Set 中 for URI in Students: # 由于创建项目的 QPS 为 1,在循环中加入 sleep 来避免超过限制 time.sleep(1) request = IndexImageRequest.IndexImageRequest() request.set_Project(Project) request.set_SetId(SetId) # 传入图片路径 request.set_ImageUri(URI) response = client.do_action_with_exception(request) print response # 等待一段时间,确保图像元数据处理完成 time.sleep(8) # 根据传入的照片,在媒体集 Set 中搜索照片中的学生 request = FindSimilarFacesRequest.FindSimilarFacesRequest() request.set_Project(Project) request.set_SetId(SetId) # 指定传入图片路径 request.set_ImageUri(CameraPhoto) # 我们要寻找相似度最高的图片,故返回值限制为 1 个 request.set_Limit(1) response = client.do_action_with_exception(request) faces = json.loads(response, encoding="utf-8") print faces[u'Faces'][0][u'ImageUri'] print faces[u'Faces'][0][u'Similarity'] 

随后运行该文件,即可看到返回结果。

代码解析

该段代码主要分为三步操作。

创建媒体集 Set

这一步帮助我们在 IMM 的项目中,新建了一个媒体集 Set 。这个 Set 用于保存我们接下来要索引的图片的 元数据 ,即标签、人脸、OCR 等等信息。

# 创建一个媒体集 Set try: request = CreateSetRequest.CreateSetRequest() request.set_Project(Project) request.set_SetId(SetId) response = client.do_action_with_exception(request) print response except ServerException, e: print ("ServerException: ", e.message)

这一步正确的输出如下。我们可以看到成功创建了一个叫做 roll-call-demo 的 Set。

CreateSet API 官方文档

{ "CreateTime": "2019-01-18T03:37:16.768Z", "RequestId": "8E074565-A896-4CB6-B171-7F87237A687F", "SetName": "", "ModifyTime": "2019-01-18T03:37:16.768Z", "SetId": "roll-call-demo" }

将图片索引至媒体集 Set

这一步将所有学生的图片添加至媒体集。

# 将学生照片添加至媒体集 Set 中 for URI in Students: # 由于创建项目的 QPS 为 1,在循环中加入 sleep 来避免超过限制 time.sleep(1) request = IndexImageRequest.IndexImageRequest() request.set_Project(Project) request.set_SetId(SetId) # 传入图片路径 request.set_ImageUri(URI) response = client.do_action_with_exception(request) print response

正确输出如下,仅用一张图片的输出示例。

IndexImage API 官方文档

{ "RequestId": "EC90B8F9-E40B-45BB-B02A-3C22FD116B91", "CreateTime": "2019-01-18T03:44:22.672Z", "ModifyTime": "2019-01-18T03:44:22.672Z", "SetId": "roll-call-demo", "RemarksA": "", "ImageUri": "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun.jpg", "RemarksB": "" }

至此我们已经准备好学生媒体集。但还需要稍等几秒来确保 AI 相关检测完成。

根据待测图片搜索人物

接下来,我们传入一张待检测图片,看看和集合中的哪个人物相符。

# 待测试的学生照片的 OSS URI CameraPhoto = "oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun-test.jpg" # 根据传入的照片,在媒体集 Set 中搜索照片中的学生 request = FindSimilarFacesRequest.FindSimilarFacesRequest() request.set_Project(Project) request.set_SetId(SetId) # 指定传入图片路径 request.set_ImageUri(CameraPhoto) # 我们要寻找相似度最高的图片,故返回值限制为 1 个 request.set_Limit(1) response = client.do_action_with_exception(request) faces = json.loads(response, encoding="utf-8") print faces[u'Faces'][0][u'ImageUri'] print faces[u'Faces'][0][u'Similarity']

正常返回值如下。成功找到了同一人物,并且我们看到相似度约为 0.96 。通常我们认为相似度超过 0.8 即可基本确认为同一人物。

FindSimilarFaces API 官方文档

oss://imm-user-wmt-cn-hangzhou/roll-call-demo/mayun.jpg 0.953676342964

以上就是利用 智能媒体管理(IMM) 快速实现了一个人脸搜索的 DEMO 。

原文链接:https://yq.aliyun.com/articles/688556
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章