人脸识别实战教程

news2024/11/19 1:24:25

人脸识别实战教程

本教程介绍如何使用Alibaba Cloud SDK for Java进行人体属性识别、人体计数和人脸搜索任务。

背景信息

人脸人体识别技术是基于阿里云深度学习算法,结合图像或视频的人脸检测、分析、比对以及人体检测等技术,为您提供人脸人体的检测定位、人脸属性识别和人脸比对等能力。可以为开发者和企业提供高性能的在线API服务,应用于人脸AR、人脸识别和认证、大规模人脸检索、照片管理等各种场景。

前提条件

在开始之前,请确保完成以下步骤:

  1. 开通人脸人体能力,请参见上述开发前准备。
  2. 在您的Java工程中添加人脸人体能力的pom依赖:
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-facebody -->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-facebody</artifactId>
    <version>1.0.8</version>
</dependency>

人脸属性识别

RecognizeFace可以识别检测人脸的性别、年龄、表情、眼镜四种属性。返回人脸的1024维深度学习特征,基于这个特征并按照特征比较规则,您可实现高性能的人脸识别。
例如需要识别以下图片中的人脸属性。


示例代码如下:

import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.RecognizeFaceRequest;
import com.aliyuncs.facebody.model.v20191230.RecognizeFaceResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;

public class RecognizeFaceDemo {
    private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<access key id>", "<access key secret>");
    private static IAcsClient client = new DefaultAcsClient(profile);

    public static void main(String[] args) {
        String recognizeFaceURL = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/recognize_1.jpg";
        recognizeFace(recognizeFaceURL);
    }
    /**
     * 人脸属性识别
     * @param imageURL 图片URL地址
     */
    private static void recognizeFace(String imageURL)
    {
        RecognizeFaceRequest recognizeFaceRequest = new RecognizeFaceRequest();
        recognizeFaceRequest.setImageURL(imageURL);

        try {
            RecognizeFaceResponse recognizeFaceResponse = client.getAcsResponse(recognizeFaceRequest);
            System.out.println("人脸属性识别:");
            System.out.println(new Gson().toJson(recognizeFaceResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }
}

代码返回结果类似如下:

{
    "requestId": "9E461AFC-B125-4B04-8644-4D39C495B61A",
    "data": {
        "faceCount": 1,
        "landmarkCount": 105,
        "denseFeatureLength": 1024,
        "faceRectangles": [
            604,
            124,
            128,
            160
        ],
        "faceProbabilityList": [
            55.0
        ],
        "poseList": [
            -8.399615,
            -10.90538,
            14.451606
        ],
        "landmarks": [
            614.1295,
            161.77643,
            647.84894,
            ...
        ],
        "pupils": [
            637.25793,
            177.63129,
            5.2395487,
            689.71075,
            192.1905,
            5.2395487
        ],
        "genderList": [
            0
        ],
        "ageList": [
            24
        ],
        "expressions": [
            1
        ],
        "glasses": [
            1
        ],
        "denseFeatures": [
            "-0.0080740926787257195",
            "0.011421392671763897",
            "-0.027754634618759155",
            ...
        ]
    }
}

从返回结果中得到的该图片人脸属性识别结果如下:

  • 人脸个数:1
  • 性别:女性
  • 年龄:24
  • 是否微笑:微笑
  • 是否戴眼镜:有眼镜

人体计数

待检测图片如下:



示例代码如下:

 

import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.DetectBodyCountRequest;
import com.aliyuncs.facebody.model.v20191230.DetectBodyCountResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;

/**
 * 人体计数
 */
public class DetectBodyCountDemo {
    private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", "<access key id>", "<access key secret>");
    private static IAcsClient client = new DefaultAcsClient(profile);

    public static void main(String[] args) {
        String detectBodyCountURL = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/multiplayer.jpg";
        detectBodyCount(detectBodyCountURL);
    }

    /**
     * 人体计数
     * @param imageURL 图片URL地址
     */
    private static void detectBodyCount(String imageURL)
    {
        DetectBodyCountRequest detectBodyCountRequest = new DetectBodyCountRequest();
        detectBodyCountRequest.setImageURL(imageURL);

        try {
            DetectBodyCountResponse detectBodyCountResponse = client.getAcsResponse(detectBodyCountRequest);
            System.out.println("人体计数:");
            System.out.println(new Gson().toJson(detectBodyCountResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }
}

代码返回结果类似如下:

{
    "requestId": "15170328-DF69-4F24-900D-9915645A4237",
    "data": {
        "personNumber": 3
    }
}

从返回结果中得到该图片被检测到有3个人。

人脸搜索

人脸搜索可以根据输入图片,在数据库中搜索相似的人脸图片数据。
人脸搜索操作流程示意图如下:

例如我们有以下人脸数据:


将上面图片样本加入人脸库,使用下面人脸数据搜索人脸库。

示例代码如下:

import com.aliyun.CommonConfig;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.facebody.model.v20191230.*;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;

public class SearchFaceDemo {
    private static DefaultProfile profile = DefaultProfile.getProfile("cn-shanghai", CommonConfig.ACCESSKEY_ID, CommonConfig.ACCESSKEY_SECRET);
    private static IAcsClient client = new DefaultAcsClient(profile);

    public static void main(String[] args) throws InterruptedException {

        String dbName = "default";

        String human1_1 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_11.jpg";
        String human1_2 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_12.jpg";
        String human2_1 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_21.jpg";
        String human2_2 = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/human_22.jpg";
        String sample = "https://visionapi-test.oss-cn-shanghai.aliyuncs.com/sample.jpg";

        String entityId1 = "human1";
        String entityId2 = "human2";

        // 1.创建人脸样本
        addFaceEntity(dbName, entityId1);
        addFaceEntity(dbName, entityId2);

        // 2.向人脸样本中加入人脸,每个样本人脸上限为5
        addFace(dbName,entityId1,human1_1);
        addFace(dbName,entityId1,human1_2);
        addFace(dbName,entityId2,human2_1);
        addFace(dbName,entityId2,human2_2);

        Thread.currentThread().sleep(3000);

        // 3.到人脸库中查找
        searchFace(dbName,sample,1);
    }

    /**
     * 添加人脸样本
     * @param dbName 数据库名称
     * @param entityId 实体ID
     */
    private static void addFaceEntity(String dbName, String entityId)
    {
        AddFaceEntityRequest addFaceEntityRequest = new AddFaceEntityRequest();
        addFaceEntityRequest.setDbName(dbName);
        addFaceEntityRequest.setEntityId(entityId);
        try{
            AddFaceEntityResponse addFaceEntityResponse = client.getAcsResponse(addFaceEntityRequest);
            System.out.println("添加人脸样本:");
            System.out.println(new Gson().toJson(addFaceEntityResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * 添加人脸数据
     * @param dbName 数据库名称
     * @param entityId 实体ID
     * @param imageUrl 人脸图片地址,必须是同Region的OSS的图片地址。人脸必须是正面无遮挡单人人脸。
     */
    private static void addFace(String dbName, String entityId, String imageUrl)
    {
        AddFaceRequest addFaceRequest = new AddFaceRequest();
        addFaceRequest.setDbName(dbName);
        addFaceRequest.setEntityId(entityId);
        addFaceRequest.setImageUrl(imageUrl);

        try{
            AddFaceResponse addFaceResponse = client.getAcsResponse(addFaceRequest);
            System.out.println("添加人脸数据:");
            System.out.println(new Gson().toJson(addFaceResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }

    /**
     * 搜索人脸
     * @param dbName 数据库名称
     * @param imageUrl 图片URL地址。必须是同Region的OSS地址。
     */
    private static void searchFace(String dbName, String imageUrl, Integer limit)
    {
        SearchFaceRequest searchFaceRequest = new SearchFaceRequest();
        searchFaceRequest.setDbName(dbName);
        searchFaceRequest.setImageUrl(imageUrl);
        searchFaceRequest.setLimit(limit);
        try{
            SearchFaceResponse searchFaceResponse = client.getAcsResponse(searchFaceRequest);
            System.out.println("搜索人脸:");
            System.out.println(new Gson().toJson(searchFaceResponse));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
    }
}        

 

返回结果类似如下:

添加人脸样本:
{"requestId":"718AE1B9-F1B3-4720-98FA-69E2A41F4C31"}
添加人脸样本:
{"requestId":"9CE55AD1-1E21-49F0-BB2C-B3C07A015EAE"}
添加人脸数据:
{"requestId":"9551C7C7-8027-4E82-82FB-15FEC0EB8161","data":{"faceId":"1589791311965000"}}
添加人脸数据:
{"requestId":"C193A2E0-F22A-4418-AAD3-F28749BDDC17","data":{"faceId":"1589791312203000"}}
添加人脸数据:
{"requestId":"687D9D8B-5EDE-4774-B377-C1CB4E0FB855","data":{"faceId":"1589791312433000"}}
添加人脸数据:
{"requestId":"1E0948E3-7D75-4709-A624-073B4CB54874","data":{"faceId":"1589791312679000"}}
搜索人脸:
{
    "requestId": "F0543F2A-216F-495A-8B4D-20CA06B605A7",
    "data": {
        "matchList": [
            {
                "faceItems": [
                    {
                        "faceId": "1589791312203000",
                        "score": 0.86908734,
                        "extraData": "",
                        "entityId": "human1"
                    }
                ],
                "location": {
                    "x": 592,
                    "y": 132,
                    "width": 152,
                    "height": 204
                }
            }
        ]
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java语言】— 运算符、案例:键盘录入

目录运算符1.算术运算符案例&#xff1a;数值拆分2.“”做连接符3.自增自减运算符自增自减的使用事项自增自减的案列4.赋值运算符基本赋值运算符&#xff1a;“”扩展赋值运算符&#xff1a;“”、“-”、“*”、“/”5.关系运算符6.逻辑运算符短路逻辑运算符总结7.三元运算符三…

DAS和NAS

对于有大量数据存储需求的人群可能都听过NAS或者DAS&#xff0c;由两者演化出来的产品也各有不同&#xff0c;但是两者的真正的区别是什么、各有哪些优势和劣势、分别适用哪些人群一直以来也是困扰大家的问题。 DAS全称为直接附加存储(Direct Attached Storage&#xff0c;DAS…

安全用电守护卫士,同为(TOWE)带漏电保护功能桌面PDU插座

随着人民生活水平的提高&#xff0c;人们日常对电的需求量越来越高&#xff0c;尤其是在隆冬季节&#xff0c;很多居民冬季采用电炉、电热毯和空调等取暖&#xff0c;用电负荷较大&#xff0c;一旦出现漏电、过载、短路等问题&#xff0c;很容易引发火灾。据了解&#xff0c;大…

【机器学习】特征工程:时间特征构造以及时间序列特征构造(含源代码理解)

目录&#xff1a;特征工程—时间特征构造以及时间序列特征构造一、前言二、特征构造介绍三、时间特征构造3.1 连续值时间特征3.2 离散值时间特征3.2.1 时间特征拆解3.2.2 时间特征判断3.2.3 结合时间维度的聚合特征四、时间序列特征构造4.1 时间序列聚合特征4.2 时间序列历史特…

PoolFormer实战:使用PoolFormer实现图像分类任务(一)

摘要 论文&#xff1a;https://arxiv.org/abs/2111.11418 论文翻译&#xff1a;https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/128281326 官方源码&#xff1a;https://github.com/sail-sg/poolformer 模型代码解析&#xff1a;https://blog.csdn.net/hhhhhhhh…

超店有数给新手Tik Tok选品的三个建议

给新手Tik Tok选品的三个建议 1)避开饱和的红海类目 比如食品类、美妆个护类的产品&#xff0c;因为竞争过于激烈&#xff0c;一般都是有经验的大卖家操作运营&#xff0c;因为他们会有稳定的供应链、以及足够的成本去支撑&#xff0c;短期盈利比较难&#xff0c;也就是为什么…

企业电子招投标采购系统源码之登录页面

信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…

(八)大白话MySQL通过配置多个Buffer Pool来优化数据库的并发性能

文章目录1、多线程在访问Buffer Pool的时候需要加锁吗&#xff1f;2、多线程并发访问会加锁&#xff0c;数据库的性能还能好吗&#xff1f;3、MySQL的生产优化经验&#xff1a;多个Buffer Pool优化并发能力100、创作不易&#xff0c;更多章节&#xff0c;请扫码关注&#xff0c…

学而不固,择善固之-杰克教诲

学而不固,择善固之 我也是第一次知道这个词&#xff0c;是受“杰克”大佬教诲。2022-12-30 解释一 学习有时候不是为了马上用起来&#xff0c;有时候只是让我们不再固执&#xff0c;通过学习知道原来世界上还有这么一说&#xff0c;对很多事情保有好奇心。 不持成见地学习&…

spring中为什么要三级缓存?二级不行吗

这是我看过视频中最能解释的文字表达了 先说bean的创建过程&#xff1a;实例化->依赖注入->初始化 实例化之后会提前暴露到缓存&#xff0c;用于解决循环依赖问题。 以下的解释保证你能看懂&#xff1a; 为什么需要一级缓存ioc容器 总得有个地方放那些单例吧 为什么需…

【决策树】简单介绍+个人理解(一)

∙\bullet∙ 分类模型中除了贝叶斯决策规则&#xff0c;SVM&#xff0c;最近邻分类器&#xff0c;还有决策树 ∙\bullet∙ 决策树就是选一个属性&#xff0c;根据属性的不同取值&#xff0c;将样本划分为不同的类&#xff0c;不断重复下去&#xff0c;直到终止。在叶子节点处&a…

支持图文公式混排的题库软件,Word试卷直接入库

试卷电子化的难题是入库难&#xff0c;只有试卷入库&#xff0c;才能做到后续的监督&#xff0c;复习&#xff0c;错题本等功能。 目前题库软件众多&#xff0c;但大多数题库软件仅支持纯文本题库&#xff0c;而很多试卷都是包括公式&#xff0c;图形&#xff0c;排版复杂。 …

中国外文局文化传播中心借力vLive虚拟直播,打造国际汉文化云讲堂

文明因多样而交流&#xff0c;因交流而互鉴&#xff0c;因互鉴而发展。 近日&#xff0c;中国外文局文化传播中心组织的“中华文化国际传播云讲堂”活动成功举办&#xff0c;本次云讲堂以“世界汉学家看中国文化”为主题&#xff0c;邀请世界汉学家共同探讨汉文化&#xff0c;…

【Git】一文带你入门Git分布式版本控制系统(创建合并分支、解决冲突)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Kyligence 客户浦发银行、招商银行荣获金融业科技赋能业务创新突出贡献奖

近日&#xff0c;由《金融电子化》杂志社主办的“2022中国金融科技年会暨第十三届金融科技应用创新奖颁奖典礼”成功举办。Kyligence 服务客户上海浦东发展银行股份公司&#xff08;以下简称浦发银行&#xff09;项目「客户旅程万花筒」、招商银行股份有限公司&#xff08;以下…

户外运动如何安全享受音乐、专业户外运动耳机推荐

想采摘成熟的柿子、苹果、冰糕或栗子吗&#xff1f;出去运动吧在这个不冷不热的金秋季节里&#xff0c;大自然的一切都在等着我们出户外去探险&#xff0c;要说今年的哪一个户外运动最引人注目&#xff0c;露营和登山总是不相上下&#xff0c;但是运动怎么能少了音乐的陪伴呢&a…

智慧楼宇数字孪生应用方案

智慧楼宇也称智能建筑、智能楼宇&#xff0c;是将建筑、物联网感知和控制及结构、系统、管理和服务等各方面的先进科技相互交融结合&#xff0c;是现代化新型建筑发展的必经阶段。通过数字孪生技术&#xff0c;可将楼宇设备之间、系统之间融合数据互通&#xff0c;为组成智慧楼…

PyTorch学习笔记 7.TextCNN文本分类

PyTorch学习笔记 7.TextCNN文本分类一、模型结构二、文本分词与编码1. 分词与编码器2. 数据加载器二、模型定义1. 卷积层2. 池化层3. 全连接层三、训练过程四、测试过程五、预测过程一、模型结构 2014年&#xff0c;Yoon Kim针对CNN的输入层做了一些变形&#xff0c;提出了文本…

Redis事件循环

Redis事件循环文件事件时间事件事件调度和执行客户端部分关于客户端输出缓冲区限制ServerCron周期函数服务器启动流程小结Redis服务器是一个事件驱动程序, 主要处理两类事件: 文件事件 (File Event) : 对套接字操作的抽象&#xff0c;服务器与客户端的通信过程会产生相应的文件…

Java 中的继承和多态

面向对象的三大特性&#xff1a;封装、继承、多态。在这三个特性中&#xff0c;如果没有封装和继承&#xff0c;也不会有多态。 那么多态实现的途径和必要条件是什么呢&#xff1f;以及多态中的重写和重载在JVM中的表现是怎么样&#xff1f;在Java中是如何展现继承的特性呢&am…