
能力说明:
了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。
阿里云技能认证
详细说明目标能力 为用户创建智能云相册 支持人脸检测,获取包括人脸位置、表情、年龄等信息 支持人脸分组,可以根据人物搜索、展示照片 支持照片标签检测,可以根据标签对照片进行分类 支持地理位置检测,获取照片拍摄的具体位置、时间,并且可以进行搜索 开始之前 首先需要准备好以下内容: 准备阿里云账号,申请好调用 API 使用的 AccessKeyId / AccessKeySecret 。 开通 OSS 服务,用于存储用户照片。在 Demo 中,由我们为您准备好照片,您可以在 这里下载压缩包 ,并通过 工具 上传到位于 华东 2(上海) 的 Bucket 中。 在 Demo 中,我们统一上传到 oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/ 目录下。 开通 IMM 服务,并创建一个项目。参考 这里 。注意: 项目类型选择 图片标准型 QPS 可以选择 1 QPS,目前为 免费 提供。若您需要在线上环境使用,可以根据需要增加 QPS 限额。 项目名称可以自定义,后面的代码以 cloud-photo-album-demo 为例。 地域选择 华东 2(上海)。 关于地域选择,请确保 IMM 的项目地域和您照片存储的 OSS 的地域保持一致。在 Demo 中均以 华东 2(上海) 为例,您可以自由选择其他已开放 IMM 服务到地域进行测试。 关于计费,请参考 计费说明。后续我们还会提供更多样的计费模型,如按使用量计费等,敬请期待。 关于 Demo 的语言。我们使用 Python 3.7 作为 Demo 的语言。如果您使用其他语言,可以使用 API Explorer 生成您需要的语言的示例代码。参考 Demo 进行简单替换即可。我们支持 Java / Node.js / Go / PHP / Python / .Net / Ruby 。 创建相册 相册是一系列照片的集合,在 IMM 中对应 媒体集Set 这个概念。用户可以在一个相册中进行搜索、人物分组等操作,但不允许跨相册Set进行搜索、人物分组等操作。我们推荐,对每个使用相册对 C 端用户,创建一个相册,即 Set。 #!/usr/bin/env python #coding=utf-8 from aliyunsdkcore.client import AcsClient from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkimm.request.v20170906.CreateSetRequest import CreateSetRequest # 填入您的 AccessKeyId 和 AccessKeySecret client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-shanghai') # 后续代码 Demo 省略以上内容 request = CreateSetRequest() request.set_accept_format('json') request.set_Project("cloud-photo-album-demo") request.set_SetId("user-uid-0001") response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) 运行后,返回结果类似: { "RequestId": "4CF93317-6730-44AE-AEB2-30DF2D12A296", "CreateTime": "2020-02-19T09:32:31.836Z", "SetName": "", "ModifyTime": "2020-02-19T09:32:31.836Z", "SetId": "user-uid-0001" } 至此我们为 0001 号用户创建了相册。 我们这里在调用 API 时指定了非必选参数 SetId 为 user-uid-0001 ,这是为了能够在实际应用场景时,能够将相册 SetId 和用户 ID 进行名称绑定。方便后续通过诸如 GetSet 接口获取 / 修改这个相册的信息。 Set 的创建数量没有限制,但一个 Set 内的照片、人脸数量是有限制的。请参考 用户限额。 添加照片 照片文件实际存储的位置是 OSS 上,我们需要将这些照片索引到 IMM 的 Set 中。在这个过程中,IMM 会对照片的内容进行读取、检测,将其中的元数据(如人脸、标签等)提取出来进行索引。IMM 不会存储、修改 OSS 上的照片文件本身。 每个请求只索引一张照片,因此我们通过一个循环将所有照片添加到相册中。 image_list = [ # 请注意替换为您自己的 OSS Bucket 和其对应路径。 # 以下三张为带 EXIF 信息(GPS、拍摄时间等)的照片,在武汉拍摄。 # 文件名供开发者快速识别,和 AI 对元数据提取能力无关。 "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-food.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-river-sunset.jpg", # 以下八张为人物照片,两个人物各四张,用于展示人脸分组能力 "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-01.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-02.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-03.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-04.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-01.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-02.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-03.jpg", "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-04.jpg" ] for image_uri in image_list: request = IndexImageRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_ImageUri(image_uri) response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) # 因为我们开通的 QPS 限制为 1,因此这里休眠一段时间来避免触发流量控制 time.sleep(1.5) 控制台输出的结果应该类似 {"RemarksD":"","RemarksC":"","ExternalId":"","CreateTime":"2020-02-20T07:32:38.918Z","RequestId":"1D4CF498-2851-4490-BA65-456C48B101E6","ModifyTime":"2020-02-20T07:32:38.918Z","RemarksA":"","SetId":"user-uid-0001","RemarksB":"","ImageUri":"oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg"} ... 此时照片已经被添加至相册中。一般来说,每张照片在添加后 10 秒左右,即可完成其信息提取。在提取完成后,我们即可进行后续分组、搜索等操作。 如果您需要确切的知道一张照片完成索引的时间,可以参考 IndexImage API 文档中的 MNS 通知相关字段,来订阅索引结果。 获取照片信息 下面我们看看 IMM 能检测哪些信息。我们先用一张食物照片举例。使用 GetImage 接口获取其信息。 request = GetImageRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_ImageUri( "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg") response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) 结果如: { "Celebrity": [], "FacesModifyTime": "2020-02-20T07:32:45.027Z", "OCR": [], "CelebrityFailReason": "", "Faces": [], "OCRStatus": "NotProcessed", "Exif": "...此处略...", "ImageUri": "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg", "AddressStatus": "Success", "ImageWidth": 3024, "RemarksD": "", "ImageFormat": "jpg", "RemarksC": "", "AddressModifyTime": "2020-02-20T07:32:48.078Z", "Orientation": "6", "CelebrityModifyTime": "", "ExternalId": "", "SourceType": "image", "CelebrityStatus": "NotProcessed", "AddressFailReason": "", "TagsModifyTime": "2020-02-20T07:32:48.042Z", "Location": "30.546285,114.298899", "ModifyTime": "2020-02-20T07:32:38.918Z", "FileSize": 10940531, "Tags": [ { "TagConfidence": 0.9955320954322815, "TagLevel": 1, "TagName": "植物" }, { "TagConfidence": 0.9955320954322815, "TagLevel": 2, "ParentTagName": "植物", "TagName": "花" } ], "ImageTime": "2019-07-13T01:39:32Z", "SourceUri": "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg", "Address": { "District": "武昌区", "Township": "中华路街街道", "AddressLine": "湖北省武汉市武昌区中华路街街道民主路92号", "Province": "湖北省", "Country": "中国", "City": "武汉市" }, "CreateTime": "2020-02-20T07:32:38.918Z", "RequestId": "33B676B0-5299-4F85-B961-25F2E7DE642D", "FacesStatus": "Success", "TagsStatus": "Success", "RemarksA": "", "SetId": "user-uid-0001", "ImageHeight": 4032, "RemarksB": "" } 我们能看到一些核心信息: - 照片信息相关:图片大小、格式、尺寸。照片拍摄时间 `2019-07-13T01:39:32Z` 。 - 标签相关:植物 -> 花。 - 地理位置相关:GPS 经纬度坐标 `30.546285,114.298899` ,位置在 `湖北省武汉市武昌区中华路街街道民主路92号` 。 我们再来看一个有人物的照片的检测结果。仅需修改上面代码的 ImageUri 中文件名为 zhangyong-02.jpg 。看一下结果: { "Faces": [ { "FaceQuality": 0.8648459911346436, "Age": 38, "GenderConfidence": 1, "Attractive": 0.82, "EmotionDetails": { "SAD": 1.4997523622301001E-12, "SCARED": 1.3939771646015453E-13, "CALM": 3.39213018785145E-10, "ANGRY": 3.840853281039322E-14, "HAPPY": 1, "DISGUSTED": 5.754174670384235E-14, "SURPRISED": 9.682720120487986E-13 }, "Gender": "MALE", "FaceConfidence": 0.9699456095695496, "Emotion": "HAPPY", "GroupId": "group-not-grouped", "FaceId": "2c476fa26dd795a6bbe9f3a781c50a5a8393e7e3e9fec40fcdf0058a6c2cb158", "FaceAttributes": { "GlassesConfidence": 1, "Glasses": "GLASSES", "HeadPose": { "Roll": 5.295282363891602, "Yaw": 0.23102417588233948, "Pitch": 10.299762725830078 }, "RaceConfidence": 1, "Beard": "NONE", "MaskConfidence": 1, "Race": "YELLOW", "BeardConfidence": 1, "FaceBoundary": { "Top": 50, "Height": 69, "Width": 67, "Left": 206 }, "Mask": "NONE" } } ], ...其他略... } 可以得到一些人脸相关核心信息: - 基础信息:年龄 38 岁、性别 男、人脸质量 `0.86` - 心情:开心 - 人脸属性: - 戴眼镜 - 头部朝向:正脸 - 无胡须 - 黄种人 - 无口罩 - 人脸矩形框的位置 人脸分组 接下来我们对相册中的照片按人物进行分组。我们 IndexImage 调用完成后,需要等待至少 15 秒,确保图片的索引、检测均完成。接下来调用人脸聚类 API CreateGroupFacesJob 。这个接口会将 Set 内的照片的人脸按照人物进行分组,并将组的 GroupId 写回到索引信息中。 request = CreateGroupFacesJobRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) 结果类似: { "JobType": "GroupImageFacesJob", "RequestId": "075D76F7-4AD1-4129-BD95-DD6D53581D0B", "JobId": "GroupImageFacesJob-113a8759-0483-4ad4-9a81-f7bd402c6b40", "SetId": "user-uid-0001" } 此时分组人物还在进行中,我们等待 30 秒左右任务即可完成。 聚类遇到的常见问题,可以参考 [人脸聚类相关 FAQ](https://help.aliyun.com/knowledge_detail/153359.html) 。 人脸搜索 首先我们要列出所有的人脸分组,即看看这个 Set 内有几个人物。 request = ListFaceGroupsRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) 返回结果类似: { "FaceGroups": [ { "GroupName": "", "CreateTime": "2020-02-20T08:12:29.949Z", "ModifyTime": "2020-02-20T08:12:29.949Z", "FaceCount": 4, "GroupId": "Group-714ca168-5a86-4cc7-b4b1-c7f27ca1eb41", "GroupCoverFace": { "FaceBoundary": { "Top": 60, "Height": 105, "Width": 127, "Left": 207 }, "FaceId": "1d2ee16ee556bbce093be0b3e83c508d5c7da05bea32fa6306670befe85671de", "ImageUri": "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-03.jpg" } }, { "GroupName": "", "CreateTime": "2020-02-20T08:12:29.945Z", "ModifyTime": "2020-02-20T08:12:29.945Z", "FaceCount": 4, "GroupId": "Group-c4474af0-c268-4753-b984-1496cd3bcf7a", "GroupCoverFace": { "FaceBoundary": { "Top": 50, "Height": 69, "Width": 67, "Left": 206 }, "FaceId": "2c476fa26dd795a6bbe9f3a781c50a5a8393e7e3e9fec40fcdf0058a6c2cb158", "ImageUri": "oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-02.jpg" } } ], "RequestId": "D6202A11-20AC-49D8-B0B0-C3743DA252D0", "NextMarker":" 从这个 JSON 中我们可以看到,出现了两个人物分组,和我们的预期一致。其中几个关键的字段: FaceCount 指出这个分组内的人脸数量。 GroupId 是这个分组的唯一 ID,用于搜索该人物。 GroupCoverFace 是自动选取出来,用作该组封面图的人脸。您可以通过其 ImageUri 和 FaceBoundary 指示的人脸框,快速截取出人脸部分的图片作为该分组头像,用于给用户展示。 我们以 GroupId 为 Group-714ca168-5a86-4cc7-b4b1-c7f27ca1eb41 的人物为例,搜索出该人物在 Set 内的其他照片。 request = FindImagesRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_GroupId("Group-714ca168-5a86-4cc7-b4b1-c7f27ca1eb41") response = client.do_action_with_exception(request) for image in json.loads(response)["Images"]: print(image["ImageUri"]) 输出结果类似: oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-01.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-02.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-03.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/mayun-04.jpg 因为我们命名了图片,因此这里可以很容易看到,所搜索到的图片均为同一人物照片。 按内容分组照片 添加到 Set 内的照片,会默认进行 1600 类标签的检测。我们可以通过 ListSetTags 接口看看这个相册内都有哪些内容分组。 request = ListSetTagsRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") response = client.do_action_with_exception(request) # python2: print(response) print(str(response, encoding='utf-8')) 结果如: { "Tags": [ { "TagCount": 7, "TagLevel": 2, "TagName": "人物特写" }, { "TagCount": 7, "TagLevel": 1, "TagName": "其他场景" }, ... { "TagCount": 1, "TagLevel": 1, "TagName": "饮食" } ], "RequestId": "F1E51BFA-34DB-4D64-9F2E-AB5E215C888E", "SetId": "user-uid-0001" } 可以看到这个相册中有若干标签,返回的结果按标签出现的次数降序排列。这可以用于展示用户的相册中有哪些照片类别。并结合后面关于图片搜索能力的介绍,搜索对应标签的照片。 使用各种方式搜索照片 根据地理位置搜索 request = FindImagesRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_AddressLineContentsMatch("武汉") response = client.do_action_with_exception(request) for image in json.loads(response)["Images"]: print(image["ImageUri"]) 结果如: oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-food.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-river-sunset.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg 根据照片内容搜索 request = FindImagesRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_TagNames('["食物"]') response = client.do_action_with_exception(request) for image in json.loads(response)["Images"]: print(image["ImageUri"]) 结果如: oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-food.jpg 根据照片拍摄时间搜索 request = FindImagesRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_ImageTimeRange( '{"Start":"2019-07-13T00:00:00.0Z","End":"2019-07-14T00:00:00.0Z"}') response = client.do_action_with_exception(request) for image in json.loads(response)["Images"]: print(image["ImageUri"]) 结果如: oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-food.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-river-sunset.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/wuhan-flower.jpg 组合搜索 例如我们搜索特定人物开心的照片 request = FindImagesRequest() request.set_accept_format('json') request.set_SetId("user-uid-0001") request.set_Project("cloud-photo-album-demo") request.set_GroupId("Group-c4474af0-c268-4753-b984-1496cd3bcf7a") request.set_Emotion("HAPPY") response = client.do_action_with_exception(request) for image in json.loads(response)["Images"]: print(image["ImageUri"]) 可以看到,根据两个条件同时过滤出了对应照片。 oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-03.jpg oss://imm-user-wmt-cn-shanghai/cloud-photo-album-demo/zhangyong-02.jpg 列出所有照片 当然,最常见的情况是按照一定顺序将所有照片展示给用户,我们使用 ListImages 接口即可。这里不做代码示例。 其他功能 增删改查 IMM 对照片、相册 Set 均提供了增删改查对应接口,您可以参考我们的 API 文档 进行使用。 外部 ID 绑定 我们可以帮助您将每一张照片和您自己的系统的 ID 进行绑定。也可以在照片中额外存储一些信息供您搜索。如照片的权限,照片在您系统内的目录结构等等。请参考 IndexImage 的 ExternalId 字段和 Remarks 字段。 视频索引 我们支持将视频索引入相册,并且对视频进行截帧,检测每一帧视频的人脸、标签信息,以便用户进行搜索。请参考 IndexVideo 接口。 结语 以上就是使用智能媒体管理服务 (IMM) 搭建一个智能云相册的方式。可以看出,IMM 可以提供大部分云相册所需要的能力,您可以很方便的在服务中集成该能力,而无需担心数据存储相关问题。 如果您有其他问题,请进入 钉钉用户群 实时交流。
简介 随着存储团队的产品愈加丰富,我们发现处理对文件、内容本身的高性能、稳定、安全存储之外,用户更多的对挖掘存储内容对价值提出了要求。对于多媒体文件(如图片、视频、音频、文档等),其包含的信息量是非常丰富的。如何将这些信息激活,有效的进行管理和检索,是 智能媒体管理(IMM) 尝试解决的问题。 媒体集 Set 为此,IMM 设计了 媒体集 ( Set ) 的概念,表示媒体 元信息 的集合。 在图中我们看到,Set 实际上是元数据的集合,记录了媒体文件(来自 OSS)和其元数据的绑定关系,以及所有元数据本身。 实际开发时,可以通过 CreateSet 来创建一个 Set 。 如何界定 Set 呢?我们认为 Set 为 一组 元数据,它可以对应一个用户,一个文件夹,一个公司的所有媒体文件等。一个 Set 内应当存放内聚的媒体文件,可以尽量缩小 Set 对应的文件范围。Set 创建数量没有限制,Set 内文件数量越少,整体管理性能越好。 同时需要注意,Set 是内聚的,因此不同 Set 之间的数据是隔离的,不能在不同 Set 间进行操作。 我们分具体场景看: 云相册场景 对云相册来说,一个显然的方案是根据用户来划分。每个用户独享一个 Set 。如果云相册产品的设计逻辑中,区分了媒体类型,如视频相册、照片相册等,也可以每个相册一个 Set 。 用户照片 Feed 流 这类应用有两个分类方式。一种是依然按照用户来划分。但对于一些兴趣社区场景,则可以考虑按照社区进行分类。如 健身社区 和 足球社区 这个维度区分 Set 。这样用户可以搜索所有健身社区的图片。 如何解决社区内按用户搜索的问题呢?对 Set 内的媒体文件,IMM 提供了 Remarks 字段( RemarksA 和 RemarksB 两个)作为应用的标记位。对于这个场景,我们可以如下方式分配: RemarksA:用户ID RemarksB:可见度:private / public 这样我们在搜索时,可以满足如下场景(后文会介绍 数据搜索): 足球社区内图片:FindImages API,限定 SetId = soccer 用户查看自己社区内的图片:FindImages API,同时限定 SetId = soccer, RemarksA = {UserID} 其他用户查看某用户社区内的图片:FindImages API ,同时限定 SetId = soccer, RemarksA = {UserID}, RemarksA = public 如果仍有疑问,或需要更复杂的筛选,可以 联系我们 Indexing 索引 我们创建好 Set 后。接下来就是向 Set 中添加媒体文件。Set 内的引擎会自动将文件的元数据检测出来并格式化保存,用于后续管理、检索。 目前 IMM 提供了 IndexImage 用于索引图片,IndexVideo 用于索引视频。我们以 IndexImage 为例详细介绍。 当 IndexImage 被调用时,IMM 首先检查图片的合法性,并且将图片的基础 Meta 信息存入 Set 中。包括 图片格式 图片尺寸 图片 EXIF 信息 图片旋转信息 图片拍摄时间 图片地理位置信息 图片文件大小 创建时间 等等。这一步在 IndexImage 接口返回值之前全部处理完成。即用户看到该接口的返回值时,上述信息已经被格式化好并存储了。 随后是一个异步过程。IMM 会对该图进行 AI 检测,包括: OCR 人脸检测分析,包括表情、年龄、特征等等 标签检测 名人检测 等等。这些信息会在接下来的几秒内处理完成,并更新到该图片的 Meta 信息中。即完成了图像元数据的分析储存。 元数据管理 当 Set 内已有元数据后,接下来就是对这些元数据进行获取。IMM 主要通过搜索、分析接口,供应用端获取、筛选元数据。针对图片举例,我们可以获取: 搜索 体育运动 的照片 搜索 人物表情为高兴 的照片 搜索 夏天拍摄 的照片 搜索 包含特定文字 的照片 搜索 有小孩儿 的照片 搜索 在杭州西湖拍摄 的照片 等等,且以上条件可以任意组合。我们具体展开一些例子。 搜索 体育运动 的照片 使用 FindImages 接口: POST https://imm.cn-shanghai.aliyuncs.com ?Action=FindImages &Project=test-project &SetId=test-set &TagNames=["体育运动"] ... 搜索 人物表情为高兴 的照片 使用 FindImages 接口: POST https://imm.cn-shanghai.aliyuncs.com ?Action=FindImages &Project=test-project &SetId=test-set &Emotion=HAPPY ... 搜索 在杭州西湖拍摄 的照片 首先我们找到杭州西湖的地理位置坐标。这一步可以使用高德等地图 API 获取。 例如西湖的大致坐标左上角为:120.137446,30.252502,右下角为120.154697,30.233854 使用 FindImages 接口: POST https://imm.cn-shanghai.aliyuncs.com ?Action=FindImages &Project=test-project &SetId=test-set &LocationBoundary={"TopLeft":"120.137446,30.252502","BottomRight":"120.154697,30.233854"} ... 搜索 去年夏天拍摄 的照片 使用 FindImages 接口: POST https://imm.cn-shanghai.aliyuncs.com ?Action=FindImages &Project=test-project &SetId=test-set &ImageTimeRange={"Start":"2018-06-01T00:00:00.0Z","End":"2018-09-01T00:00:00.0"} ... 当然,上述搜索条件均可自由组合,进行联合搜索。同时可以配合 Remarks 进行自定义过滤。 如果有其他搜索需求,或当前的方式无法满足您的业务需求,您可以 联系我们 以上就是 IMM 元信息管理的设计方式介绍。IMM 是一个比较年轻的产品,对外提供的能力也在不断扩展。希望能够帮助客户便捷地管理媒体文件,挖掘媒体文件背后的价值。
概述 在服务构建中,我们经常需要对用户的图片做进一步分析。本文利用 智能媒体管理(IMM) 提供的图片索引功能,快速搭建一个人脸搜索的功能,示例使用 Python 2.7 实现。 我们以学生点名场景为例。首先构造学生照片集合,再对现场拍摄的照片进行检测。操作流程如下: 将所有学生图片传入 OSS 存储中。 创建一个媒体集 Set,用于存储这些图片的 元数据,本文将利用其中的 人脸特征 数据。 将所有学生图片预置至 Set 内。 传入一张待测图片,查找和该照片匹配的人物。 如下图: 下面我们分步操作一下。 创建 IMM 项目 开通 IMM 服务后,访问 控制台 ,在左侧点击加号创建一个新项目。 左上方地域我们选择 华东1(杭州),右侧的项目名称命名为 RollCallDemo ,所属地域选择 华东1(杭州) ,类型选择 图片标准型 ,QPS 填入 1 ,点击下一步。 截止本文发表时,图片标准型的 1 QPS 是免费的,可以放心测试。参考 计费说明 准备测试图片 我们准备了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 随后复制如下代码,并填入您的 AccessKey 和 AccessSecret 。您可以在 阿里云用户控制台 获取。 若您使用和本文不同的项目名称、地域、图片等,请修改示例代码中的对应部分。 # -*- 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 。
概述 在服务构建中,我们经常需要对用户的图片做进一步分析。本文利用 智能媒体管理(IMM) 提供的图片索引功能,快速搭建一个图片分类的功能,示例使用 PHP 语言实现。 我们以新闻场景为例。用户上传了若干体育运动相关图片,我们需要按照运动的类别进行分类管理。操作流程如下: 将图片传入 OSS 存储中。 创建一个媒体集 Set,用于存储这些图片的 元数据。 将图片索引至 Set 内。 按照标签进行搜索。 如下图: 下面我们分步操作一下。 创建 IMM 项目 开通 IMM 服务后,访问 控制台 ,在左侧点击加号创建一个新项目。 左上方地域我们选择 华东1(杭州),右侧的项目名称命名为 ImageClassifyDemo ,所属地域选择 华东1(杭州) ,类型选择 图片标准型 ,QPS 填入 1 ,点击下一步。 截止本文发表时,图片标准型的 1 QPS 是免费的,可以放心测试。参考 计费说明 准备测试图片 我们准备了6张测试图片: oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-00.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-01.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-02.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-00.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-01.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-02.jpg 您可以将地址改为 http 路径以在浏览器打开查看。如 https://imm-user-wmt-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/image-classify-demo/soccer-02.jpg 您也可以自己准备图片。请将图片上传至 OSS 中,并确保 OSS 的 Bucket 桶和第一步创建的 IMM 项目在同一个地域。 开始使用 下载并安装最新版本 阿里云 PHP SDK 。 复制如下代码,并填入您的 AccessKey 和 AccessSecret 。您可以在 阿里云用户控制台 获取。 若您使用和本文不同的项目名称、地域、图片等,请修改示例代码中的对应部分。 <?php // 将本文件置入 SDK 的同目录下 include_once './aliyun-php-sdk-core/Config.php'; use imm\Request\V20170906 as Imm; // 填入您的阿里云 AccessKey 和 AccessSecret const AccessKey = ""; const AccessSecret = ""; // 填入服务开通地域,这里以杭州区域为例 const Region = "cn-hangzhou"; // 填入创建好的 Project 名称 const Project = "ImageClassifyDemo"; // 填入刚上传好的图片 URL,注意替换为自己的 bucket const Images = [ "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-00.jpg", "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-01.jpg", "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-02.jpg", "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-00.jpg", "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-01.jpg", "oss://imm-user-wmt-cn-hangzhou/image-classify-demo/soccer-02.jpg", ]; //初始化客户端 $iClientProfile = DefaultProfile::getProfile( Region, AccessKey, AccessSecret ); $client = new DefaultAcsClient($iClientProfile); //创建媒体集 Set $setId = "image-classify-demo"; $request = new Imm\CreateSetRequest(); $request->setProject(Project); $request->setSetId($setId); try { $response = $client->getAcsResponse($request); print_r("Create set response:\n"); print_r($response); } catch (ServerException $e){ print_r("Create set failed:\n"); print_r($e); } //将图片添加到媒体集 foreach (Images as $OSSURI) { //由于我们开通 Project 时选择的是限时免费的 1 CU //因此在循环时增加 sleep 来避免超过请求频率限制 sleep(1); $request = new Imm\IndexImageRequest(); $request->setProject(Project); $request->setSetId($setId); $request->setImageUri($OSSURI); $response = $client->getAcsResponse($request); print_r("Index image $OSSURI response:\n" ); print_r($response); } //等待索引完成 sleep(5); //统计下媒体集内的标签数量 $request = new Imm\ListSetTagsRequest(); $request->setProject(Project); $request->setSetId($setId); $response = $client->getAcsResponse($request); print_r("List tags in set response:\n" ); print_r($response); //获取所有标签为 打篮球 的图片 $request = new Imm\FindImagesByTagNamesRequest(); $request->setProject(Project); $request->setSetId($setId); $request->setTagNames(json_encode(["打篮球"])); $response = $client->getAcsResponse($request); print_r("Images with tag \"打篮球\" response:\n" ); foreach ($response->Images as $image) { // 这里仅把搜索到的图片 URI 输出 print_r($image->ImageUri . "\n"); } //如果想看到更详细的图片信息,可以直接打印 $response //print_r($response); 随后运行该文件,即可看到返回结果。 代码解析 该段代码主要分为 4 步操作。 创建媒体集 Set 这一步帮助我们在 IMM 的项目中,新建了一个媒体集 Set 。这个 Set 用于保存我们接下来要索引的图片的 元数据 ,即标签、人脸、OCR 等等信息。 这一步正确的输出如下。我们可以看到成功创建了一个叫做 image-classify-demo 的 Set。 CreateSet API 官方文档 Create set response: stdClass Object ( [RequestId] => 6B49F679-9ABF-460B-93F3-1941CD5E29E3 [CreateTime] => 2019-01-16T11:09:23.658Z [SetName] => [ModifyTime] => 2019-01-16T11:09:23.658Z [SetId] => image-classify-demo ) 将图片索引至媒体集 Set 这一步将我们的图片添加至媒体集。 正确输出如下,仅用一张图片的输出示例。 IndexImage API 官方文档 Index image oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-00.jpg response: stdClass Object ( [RequestId] => 79F320DB-1985-45F5-A1F6-FBAB4B1726F2 [CreateTime] => 2019-01-16T11:09:24.706Z [ModifyTime] => 2019-01-16T11:09:24.706Z [SetId] => image-classify-demo [RemarksA] => [ImageUri] => oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-00.jpg [RemarksB] => ) 至此我们的智能媒体集的元数据已经构建完毕了。后面是如何利用元数据进行查询。 获取媒体集 Set 内的标签列表 这一步可以获取到媒体集 Set 内图片的标签列表,及其计数。 正常返回值如下。我们注意到结果是按标签出现次数降序排序的。出现的最多的标签是“体育运动”,出现了 6 次。 ListSetTags API 官方文档 List tags in set response: stdClass Object ( [Tags] => Array ( [0] => stdClass Object ( [TagCount] => 6 [TagName] => 体育运动 ) [1] => stdClass Object ( [TagCount] => 6 [TagName] => 球类 ) [2] => stdClass Object ( [TagCount] => 3 [TagName] => 打篮球 ) [3] => stdClass Object ( [TagCount] => 3 [TagName] => 踢足球 ) ) [RequestId] => 6D5294A6-2B77-4C86-8857-EAF8EF57D361 [SetId] => image-classify-demo ) 根据标签筛选图片 最后一步我们筛选所有“打篮球”的图片。 正常返回值如下。正确筛选出了 3 张图片。 FindImagesByTagNames API 官方文档 Images with tag "打篮球" response: oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-02.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-01.jpg oss://imm-user-wmt-cn-hangzhou/image-classify-demo/basketball-00.jpg 当然 元数据 不止有标签,还有人脸等更多信息。可以取消上述代码最后一行的注释来查看全部结果。 以上就是利用 智能媒体管理(IMM) 快速实现了一个图片分类的 DEMO 。如有任何问题可以联系 服务同学 。
智能媒体管理(IMM)提供了高效、准确的人脸识别、人脸分组等相关功能。通过简单的API调用即可实现。以下给出一个PHP的DEMO供参考。 引入SDK 首先,从Github上获取阿里云OpenAPI的PHP版本SDK,引入相关类库,并初始化客户端。 include_once './aliyun-php-sdk-core/Config.php'; use imm\Request\V20170906 as Imm; //初始化客户端 $iClientProfile = DefaultProfile::getProfile( "cn-beijing", //服务区域Region,根据需要修改 "xxxxxxx", //您的AccessKey "xxxxxxxxxxxx" //您的AccessSecret ); $client = new DefaultAcsClient($iClientProfile); 创建Project 接下来需要创建一个Project,随后的操作均归属于该Project。Project的CU需要配置为>0的数字,CU的意义为每秒钟允许请求API的次数,即QPS。同时也是计费用的标准。具体计费详情可以参考这里。 //设置您的项目名称 $projectName = "face-group-demo-project"; $request = new Imm\PutProjectRequest(); $request->setProject($projectName); //设置为图片专业型,以便使用人脸聚类功能 $request->setType("PhotoProfessional"); //需要设置CU为大于1的值以便使用接口 $request->setCU(1); $response = $client->getAcsResponse($request); print_r($response); 打出的内容应类似 stdClass Object ( [CU] => 1 [Type] => PhotoProfessional [CreateTime] => 2018-10-10T02:31:18Z [RequestId] => 0B1917D5-DB51-4430-91E7-7DA727171BCF [ModifyTime] => 2018-10-10T03:02:43Z [Project] => face-group-demo-project [Endpoint] => imm.cn-beijing.aliyuncs.com [ServiceRole] => ) 创建FaceSet 接下来创建一个FaceSet。FaceSet即人脸集合。人脸分组的操作是以FaceSet集合为单元进行分组的。不同FaceSet之间的分组是隔离的。 //创建Set $request = new Imm\CreateFaceSetRequest(); $request->setProject($projectName); $response = $client->getAcsResponse($request); print_r($response); //获取SetId $setId = $response->SetId; 打出的内容如下。其中SetId即当前创建的FaceSet的SetId。 stdClass Object ( [Status] => Running [Photos] => 0 [CreateTime] => 2018-10-10T03:02:44.184Z [RequestId] => 8A396F02-87B5-4440-B5CD-5AD7CB64F5C4 [Faces] => 0 [ModifyTime] => 2018-10-10T03:02:44.184Z [SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b ) 进行IndexFace人脸检测 随后即可使用IndexFace人脸检测接口,添加照片到该FaceSet集合中。我们上一步已经通过$setId记录了该FaceSet的SetId。 //调用IndexFace接口,进行人脸检测 for($i=0;$i<5;$i++){ $request = new Imm\IndexFaceRequest(); $request->setProject($projectName); $request->setSetId($setId); //您可以替换为您所需要图片的OSS路径 $request->setSrcUris(json_encode(["oss://imm-user-wmt-cn-beijing/faces/".$i.".bmp"])); $response = $client->getAcsResponse($request); print_r($response); } 每一次IndexFace都会返回该照片的检测信息,字段意义请参考官方文档,您可以根据需要取用。举例如下。 stdClass Object ( [SrcUris] => Array ( [0] => oss://imm-user-wmt-cn-beijing/faces/0.bmp ) [RequestId] => AC8D2509-5C40-454C-813D-34986563D857 [SuccessDetails] => Array ( [0] => stdClass Object ( [SrcUri] => oss://imm-user-wmt-cn-beijing/faces/0.bmp [Faces] => Array ( [0] => stdClass Object ( [FaceAttribute] => stdClass Object ( [Blur] => stdClass Object ( [Blurness] => stdClass Object ( [Value] => 12.217 [Threshold] => 50 ) ) [FaceQuality] => stdClass Object ( [Value] => 100 [Threshold] => 70.1 ) [HeadPose] => stdClass Object ( [RollAngle] => 2.934 [PitchAngle] => 10.529 [YawAngle] => -3.145 ) [Age] => stdClass Object ( [Value] => 21 ) [EyeStatus] => stdClass Object ( [RightEyeStatus] => stdClass Object ( [DarkGlasses] => 0 [NoGlassEyeClose] => 0.001 [Occlusion] => 0.049 [NormalGlassEyeOpen] => 0.106 [NormalGlassEyeClose] => 0.001 [NoGlassEyeOpen] => 99.842 ) [LeftEyeStatus] => stdClass Object ( [DarkGlasses] => 0.014 [NoGlassEyeClose] => 0.006 [Occlusion] => 0.504 [NormalGlassEyeOpen] => 4.954 [NormalGlassEyeClose] => 0.004 [NoGlassEyeOpen] => 94.517 ) ) [Gender] => stdClass Object ( [Value] => Male ) ) [FaceRectangle] => stdClass Object ( [Top] => 17 [Height] => 89 [Width] => 89 [Left] => 4 ) [FaceId] => 66690675bd0bc2599170fc63e7f8dbd8 ) ) [PhotoId] => 77f6e9ce630b83956192e8bd4af3cf39 ) ) [FailDetails] => Array ( ) [SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b ) 进行GroupFace人脸分组 检测完毕后,可以对该FaceSet进行GroupFace操作,即人脸分组。该步可将当前FaceSet中相似的人脸归位一类。 //进行人脸分组操作 $request = new Imm\GroupFacesRequest(); $request->setProject($projectName); $request->setSetId($setId); $response = $client->getAcsResponse($request); print_r($response); 结果在下方打出。我们可以看出,数组中0和2号图片被分为1组,即我们推测为同一个人的不同照片。1号和3号图片暂时没有相似的人脸,因此GroupId为0。随着之后我们再添加更多的人脸,这两张图片可能会被归类到不同组中。 stdClass Object ( [Groups] => Array ( [0] => stdClass Object ( [UnGroupReason] => [GroupId] => 1 [FaceId] => dadddf6bdd41d02aadc9fc4f2b54ca2b ) [1] => stdClass Object ( [UnGroupReason] => FaceNoSimilar [GroupId] => 0 [FaceId] => 8342bcf23d66223048e10b287293754e ) [2] => stdClass Object ( [UnGroupReason] => [GroupId] => 1 [FaceId] => 7c551fd6aae5e09d58d52fee8bf72da1 ) [3] => stdClass Object ( [UnGroupReason] => FaceNoSimilar [GroupId] => 0 [FaceId] => 66690675bd0bc2599170fc63e7f8dbd8 ) ) [RequestId] => 3063F833-1C71-470B-B24A-CEF4F9C14A02 [HasMore] => 0 [SetId] => FACE-b8729472-d392-4667-8ad6-0b7f0a80945b ) 通过GetFaceSetDetail获取FaceSet信息 我们可以随时通过GetFaceSetDetail接口来获取当前FaceSet的分组详情,以及照片识别的详情。 //获取当前Set的信息 $request = new Imm\GetFaceSetDetailRequest(); $request->setProject($projectName); $request->setSetId($setId); $response = $client->getAcsResponse($request); print_r($response); 返回值包括GroupFace和IndexFace中的所有信息,在此不再列出。 完整代码 下面给出完整代码供复制。 <?php include_once './aliyun-php-sdk-core/Config.php'; use imm\Request\V20170906 as Imm; //初始化客户端 $iClientProfile = DefaultProfile::getProfile( "cn-beijing", //服务区域Region,根据需要修改 "xxxxxxx", //您的AccessKey "xxxxxxxxxxxx" //您的AccessSecret ); $client = new DefaultAcsClient($iClientProfile); //设置您的项目名称 $projectName = "face-group-demo-project"; $request = new Imm\PutProjectRequest(); $request->setProject($projectName); //设置为图片专业型,以便使用人脸聚类功能 $request->setType("PhotoProfessional"); //需要设置CU为大于1的值以便使用接口 $request->setCU(1); $response = $client->getAcsResponse($request); print_r($response); //创建Set $request = new Imm\CreateFaceSetRequest(); $request->setProject($projectName); $response = $client->getAcsResponse($request); print_r($response); //获取SetId $setId = $response->SetId; //调用IndexFace接口,进行人脸检测 for($i=0;$i<5;$i++){ $request = new Imm\IndexFaceRequest(); $request->setProject($projectName); $request->setSetId($setId); //您可以替换为您所需要图片的OSS路径 $request->setSrcUris(json_encode(["oss://imm-user-wmt-cn-beijing/faces/".$i.".bmp"])); $response = $client->getAcsResponse($request); print_r($response); } //进行人脸分组操作 $request = new Imm\GroupFacesRequest(); $request->setProject($projectName); $request->setSetId($setId); $response = $client->getAcsResponse($request); print_r($response); //获取当前Set的信息 $request = new Imm\GetFaceSetDetailRequest(); $request->setProject($projectName); $request->setSetId($setId); $response = $client->getAcsResponse($request); print_r($response); 如果您有任何问题,都可以联系 @宜和 @大邪 @刘杰 处理。