百度AI人脸检测与对比

news2025/1/15 6:49:05

1.注册账号

打开网站 https://ai.baidu.com/ ,注册百度账号并登录

2.创建应用

 

 

 

 

 3.技术文档

https://ai.baidu.com/ai-doc/FACE/yk37c1u4t

4.Spring Boot简单集成测试

pom.xml 配置:
<!--百度AI-->
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.9.0</version>
</dependency>
人脸识别 java
下面的 APPID/AK/SK 改成你的,找 2 张人像图片就可简单测试。
package com.hz.test;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.hz.utils.FileUtil;
import org.apache.tomcat.util.codec.binary.Base64;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
/**
* @Author: LNH
* @Date: 2024-11-12-21:27
* @Description:
*/
public class FaceTest {
    // 设置APPID/AK/SK
    private static String APP_ID = "116216384";
    private static String API_KEY = "VYnavoYcxNRGnahgk50WaTSl";
    private static String SECRET_KEY = "qHhZBJIZSDfcrn830R05BkPyHoRLSqZ9";
    public static void main(String[] args) {
        try {
            // 初始化一个AipFace
            AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
            // 读本地图片
            byte[] bytes =
            FileUtil.readFileByBytes("C:\\Users\\Administrator\\Desktop\\a\\周杰伦1.jpg");
            byte[] bytes2 =
            FileUtil.readFileByBytes("C:\\Users\\Administrator\\Desktop\\a\\周杰伦1.jpg");
            // 将字节转base64
            String image1 = Base64.encodeBase64String(bytes);
            String image2 = Base64.encodeBase64String(bytes2);
            // 人脸对比
            MatchRequest req1 = new MatchRequest(image1, "BASE64");
            MatchRequest req2 = new MatchRequest(image2, "BASE64");
            ArrayList<MatchRequest> requests = new ArrayList<>();
            requests.add(req1);
            requests.add(req2);
            JSONObject res = client.match(requests);
            System.out.println("人脸对比结果:");
            System.out.println(res.toString(2));
            //调用处理函数
            handleMatchResult(res);
            // 人脸检测
            // 传入可选参数调用接口
            HashMap<String, String> options = new HashMap<>();
            options.put("face_field", "age");
            options.put("max_face_num", "2");
            options.put("face_type", "LIVE");
            options.put("liveness_control", "LOW");
            JSONObject res2 = client.detect(image1, "BASE64", options);
            System.out.println("人脸检测信息:");
            System.out.println(res2.toString(2));
            //调用处理函数
            handleDetectResult(res2);
          } catch (Exception e) {
            e.printStackTrace();
            System.err.println("文件读取失败: " + e.getMessage());
    }
}
    private static void handleMatchResult(JSONObject result) {
        int errorCode = result.getInt("error_code");
        if (errorCode == 0) { // 成功的情况
            double score = result.getJSONObject("result").getDouble("score");
            String isSamePerson = score > 80 ? "==>可能是同一个人" : "==>不是同一个
            人"; // 根据实际需求调整阈值
            System.out.println("------人脸对比结果: ------\n" + isSamePerson + "\n
            相似度:" + score + "\n");
        } else {
            System.out.println("人脸对比失败: " + result.getString("error_msg"));
        }
    }
    private static void handleDetectResult(JSONObject result) {
        int errorCode = result.getInt("error_code");
            if (errorCode == 0) { // 成功的情况
                int faceNum = result.getJSONObject("result").getInt("face_num");
                if (faceNum > 0) {
                    JSONObject faceInfo =
                        result.getJSONObject("result").getJSONArray("face_list").getJSONObject(0);
                    int age = faceInfo.getInt("age");
                       System.out.println("\n------人脸检测结果: ------ \n检测到人脸,年龄约
为 " + age + " 岁");
                } else {
                    System.out.println("人脸检测结果: 没有检测到人脸");
                }
                } else {
                    System.out.println("人脸检测失败: " + result.getString("error_msg"));
                }
        }
    }
测试所需的工具类
package com.hz.utils;
import java.io.*;
/**
* @Author: LNH
* @Date: 2024-11-12-21:32
* @Description:
*/
/**
* 文件读取工具类
*/
public class FileUtil{
    /**
    * 读取文件内容,作为字符串返回
    */
    public static String readFileAsString(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            throw new FileNotFoundException(filePath);
        }
        if (file.length() > 1024 * 1024 * 1024) {
            throw new IOException("File is too large");
        }
        StringBuilder sb = new StringBuilder((int) (file.length()));
        // 创建字节输入流
        FileInputStream fis = new FileInputStream(filePath);
        // 创建一个长度为10240的Buffer
        byte[] bbuf = new byte[10240];
        // 用于保存实际读取的字节数
        int hasRead = 0;
        while ( (hasRead = fis.read(bbuf)) > 0 ) {
            sb.append(new String(bbuf, 0, hasRead));
        }
        fis.close();
        return sb.toString();
    }
/**
* 根据文件路径读取byte[] 数组
*/
public static byte[] readFileByBytes(String filePath) throws IOException {
    File file = new File(filePath);
        if (!file.exists()) {
        throw new FileNotFoundException(filePath);
        } else {
            ByteArrayOutputStream bos = new ByteArrayOutputStream((int)
            file.length());
            BufferedInputStream in = null;
                try {
                    in = new BufferedInputStream(new FileInputStream(file));
                    short bufSize = 1024;
                    byte[] buffer = new byte[bufSize];
                    int len1;
                    while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
                        bos.write(buffer, 0, len1);
                    }
                    byte[] var7 = bos.toByteArray();
                    return var7;
                } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException var14) {
                    var14.printStackTrace();
                }
                bos.close();
            }
        }
    }
}
人脸检测 相关请求参数、返回参数解释
百度官网解释很清楚

5.Spring Boot接口测试

改写成 Controller 接口,加入前端页面测试
FaceController.java 文件
package com.hz.controller;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import org.apache.tomcat.util.codec.binary.Base64;
import org.json.JSONObject;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;/**
* @Author: LNH
* @Date: 2024-11-13-9:45
* @Description:
*/
@RestController
public class FaceController {
    // 设置APPID/AK/SK
    private static final String APP_ID = "116216384";
    private static final String API_KEY = "VYnavoYcxNRGnahgk50WaTSl";
    private static final String SECRET_KEY = "qHhZBJIZSDfcrn830R05BkPyHoRLSqZ9";
    //人脸对比
    @PostMapping(value = "/match-faces", produces = "application/json")
    public ResponseEntity<String> matchFaces(@RequestParam("image1")
                                                MultipartFile image1,
                                               @RequestParam("image2")
                                                MultipartFile image2)
    throws IOException {
        // 初始化一个AipFace
        AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
        // 读本地图片
        byte[] bytes1 = image1.getBytes();
        byte[] bytes2 = image2.getBytes();
        // 将字节转base64
        String imageStr1 = Base64.encodeBase64String(bytes1);
        String imageStr2 = Base64.encodeBase64String(bytes2);
        // 人脸对比
        MatchRequest req1 = new MatchRequest(imageStr1, "BASE64");
        MatchRequest req2 = new MatchRequest(imageStr2, "BASE64");
        ArrayList<MatchRequest> requests = new ArrayList<>();
        requests.add(req1);
        requests.add(req2);
        JSONObject res = client.match(requests);
        JSONObject result = handleMatchResult(res);
        // 返回 JSON 字符串
        return ResponseEntity.ok(result.toString());
}
//人脸检测
@PostMapping("/detect-face")
public ResponseEntity<String> detectFace(@RequestParam("image")
                                        MultipartFile image)
    throws
    IOException {
        // 初始化一个AipFace
        AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
        // 读本地图片
        byte[] bytes = image.getBytes();
        // 将字节转base64
        String imageStr = Base64.encodeBase64String(bytes);
        // 人脸检测
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<>();
        options.put("face_field", "age");
        options.put("max_face_num", "2");
        options.put("face_type", "LIVE");
        options.put("liveness_control", "LOW");
        JSONObject res = client.detect(imageStr, "BASE64", options);
        JSONObject result = handleDetectResult(res);
        // 返回 JSON 字符串
        return ResponseEntity.ok(result.toString());
}
        //对比判断是否为同一个人
        private JSONObject handleMatchResult(JSONObject result) {
            int errorCode = result.getInt("error_code");
            if (errorCode == 0) { // 成功的情况
                double score = result.getJSONObject("result").getDouble("score");
                String isSamePerson = score > 80 ? "可能是同一个人" : "不是同一个人"; //
根据实际需求调整阈值
                result.put("isSamePerson", isSamePerson);
                result.put("score", score);
            } else {
                result.put("error_msg", "人脸对比失败: " +
                result.getString("error_msg"));
            }
                return result;
        }
        //人脸检测信息
        private JSONObject handleDetectResult(JSONObject result) {
            int errorCode = result.getInt("error_code");
            if (errorCode == 0) { // 成功的情况
                int faceNum = result.getJSONObject("result").getInt("face_num");
                if (faceNum > 0) {
                    JSONObject faceInfo =
                result.getJSONObject("result").getJSONArray("face_list").getJSONObject(0);
                    int age = faceInfo.getInt("age");
                } else {
                    result.put("error_msg", "人脸检测结果: 没有检测到人脸");
                }
            } else {
                result.put("error_msg", "人脸检测失败: " +
                result.getString("error_msg"));
            }
        return result;
    }
}
result.put("age", age);
index.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>人脸对比与检测</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
h1 {
text-align: center;
color: #333;
}
form {
max-width: 600px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
input[type="file"] {
display: block;
margin-bottom: 10px;
}
button {
display: block;
width: 100%;
padding: 10px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: #0056b3;
}
#matchResult, #detectResult {
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
text-align: center;
font-size: 18px;
color: #333;
}
#matchResult p, #detectResult p {
margin: 0;
}
.success {
color: green;
}
.error {
color: red;
}
</style>
</head>
<body>
<h1>人脸对比与检测</h1>
<!-- 人脸对比表单 -->
<h2>人脸对比</h2>
<form id="matchForm">
<input type="file" name="image1" accept="image/*" required>
<input type="file" name="image2" accept="image/*" required>
<button type="submit">对比</button>
</form>
<div id="matchResult"></div>
<!-- 人脸检测表单 -->
<h2>人脸检测</h2>
<form id="detectForm">
<input type="file" name="image" accept="image/*" required>
<button type="submit">检测</button>
</form>
<div id="detectResult"></div>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script>
$(document).ready(function() {
$('#matchForm').on('submit', function(event) {
event.preventDefault();
var formData = new FormData(this);
$.ajax({
url: '/match-faces',
type: 'POST',
data: formData,
contentType: false,
processData: false,
headers: {
'Accept': 'application/json'
},
success: function(response) {
console.log("Match response:", response);
if (response.isSamePerson && response.score !== undefined) {
$('#matchResult').html('<p class="success">人脸对比结果: '
+ response.isSamePerson + ' (相似度:' + response.score + ')</p>');
} else {
$('#matchResult').html('<p class="error">人脸对比失败: ' +
response.error_msg + '</p>');
}
},
error: function(error) {
console.error("Match error:", error);
$('#matchResult').html('<p class="error">人脸对比失败: ' +
error.responseJSON.error_msg + '</p>');
}
});
});
$('#detectForm').on('submit', function(event) {
event.preventDefault();
var formData = new FormData(this);
$.ajax({
url: '/detect-face',
type: 'POST',
data: formData,
contentType: false,
processData: false,
headers: {
'Accept': 'application/json'
},
success: function(response) {
console.log("Detect response:", response);
if (response.age !== undefined) {
$('#detectResult').html('<p class="success">人脸检测结果:
检测到人脸,年龄约为 ' + response.age + ' 岁</p>');
} else {
$('#detectResult').html('<p class="error">人脸检测结果: ' +
response.error_msg + '</p>');
}
},
error: function(error) {
console.error("Detect error:", error);
$('#detectResult').html('<p class="error">人脸检测失败: ' +
error.responseJSON.error_msg + '</p>');
}
});
});
});
</script>
</body>
</html>

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

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

相关文章

A040-基于springboot的智能停车计费系统设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

力扣 LeetCode 222. 完全二叉树的节点个数(Day7:二叉树)

解题思路&#xff1a; 解法一&#xff1a;普通二叉树解法 使用后序遍历 有一行的精简版代码但不利于理解采用的哪一种遍历方式 解法二&#xff1a;利用上完全二叉树的特点 一个指针left&#xff0c;一个指针right left一直向左遍历&#xff0c;right一直向右遍历&#xff…

hhdb数据库介绍(9-21)

计算节点参数说明 checkClusterBeforeDnSwitch 参数说明&#xff1a; PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时&#xff0c;是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…

百度智能云千帆大模型平台引领企业创新增长

本文整理自百度世界大会 2024——「智能跃迁 产业加速」论坛的同名演讲。 更多大会演讲内容&#xff0c;请访问&#xff1a; https://baiduworld.baidu.com 首先&#xff0c;跟大家分享一张图&#xff0c;这个是我们目前大模型应用落地的场景分布。可以看到&#xff0c;大模型…

得物彩虹桥架构演进之路-负载均衡篇

文 / 新一 一、前言 一年一更的彩虹桥系列又来了&#xff0c;在前面两期我们分享了在稳定性和性能2个层面的一些演进&优化思路。近期我们针对彩虹桥 Proxy 负载均衡层面的架构做了一次升级&#xff0c;目前新架构已经部署完成&#xff0c;生产环境正在逐步升级中&#xf…

C++ lambda(匿名函数)捕获自己

今天写算法题时无意间遇到一种情况,我的深度优先遍历函数要在函数内调用自身,如果是普通函数没什么问题,但如果是 匿名函数 的话会有一些问题,甚至问ai,ai也没打上来,上网搜了半天,才找到这个的解答,故作此文 以费契那波数列为例 // 普通函数式 int fun(int pos) {if (pos …

解决Spring Boot整合Redis时的连接问题

前言 在使用Spring Boot整合Redis的过程中&#xff0c;经常会遇到连接问题&#xff0c;尤其是当Redis服务部署在远程服务器上时。 问题描述 当你尝试连接到Redis服务器时&#xff0c;可能会遇到以下错误&#xff1a; org.springframework.data.redis.connection.PoolExcept…

vue3 路由守卫

在Vue 3中&#xff0c;路由守卫是一种控制和管理路由跳转的机制。它允许你在执行导航前后进行一些逻辑处理&#xff0c;比如权限验证、数据预取等&#xff0c;从而增强应用的安全性和效率。路由守卫分为几种不同的类型&#xff0c;每种类型的守卫都有其特定的应用场景。 其实路…

向潜在安全信息和事件管理 SIEM 提供商提出的六个问题

收集和解读数据洞察以制定可用的解决方案是强大网络安全策略的基础。然而&#xff0c;组织正淹没在数据中&#xff0c;这使得这项任务变得复杂。 传统的安全信息和事件管理 ( SIEM ) 工具是组织尝试使用的一种方法&#xff0c;但由于成本、资源和可扩展性等几个原因&#xff0…

星海智算:Stable Diffusion3.5镜像教程

Stable Diffusion3.5 模型介绍 Stable Diffusion 3.5是由Stability AI推出的最新图像生成模型&#xff0c;它是Stable Diffusion系列中的一个重大升级。这个模型家族包括三个版本&#xff0c;分别是Stable Diffusion 3.5 Large、Stable Diffusion 3.5 Large Turbo和Stable Dif…

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分,这里用到的是代码库 GitHub 中part2。 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的内参矩阵…

【白话机器学习系列】白话 Softmax

文章目录 什么是 SoftmaxSoftmax 函数详解示例编程实现对矩阵应用 Softmax 函数 什么是 Softmax Softmax 函数&#xff0c;又称归一化指数函数&#xff0c;它使用指数函数将输入向量归一化为概率分布&#xff08;每一个元素的范围都在 ( 0 , 1 ) (0,1) (0,1) 之间&#xff0c;…

thinkphp6配置多应用项目及多域名访问路由app配置

这里写一写TP6下配置多应用。TP6默认是单应用模式&#xff08;单模块&#xff09;&#xff0c;而我们实际项目中往往是多应用的&#xff08;多个模块&#xff09;&#xff0c;所以在利用TP6是就需要进行配置&#xff0c;开启多应用模式。 1、安装ThinkPHP6 1.1安装ThinkPHP6.…

无人机航测技术算法概述!

一、核心技术 传感器技术&#xff1a; GPS/GLONASS&#xff1a;无人机通过卫星定位系统实现高精度的飞行控制和数据采集。 高清相机&#xff1a;用于拍摄地面图像&#xff0c;通过后续图像处理生成三维模型。 激光雷达&#xff08;LiDAR&#xff09;&#xff1a;通过激光扫…

Linux网络——套接字编程

目录 1. 网络通信基本脉络 2. 端口号 ① 什么是套接字编程&#xff1f; ② 端口号 port && 进程 PID 3. 网络字节序 4. 套接字编程 ① UDP版 ② TCP版 5. 改进方案与拓展 ①多进程版 ②多线程版 ③线程池版 ④守护进程化 1. 简单的重联 2. session &…

Excel如何把两列数据合并成一列,4种方法

Excel如何把两列数据合并成一列,4种方法 参考链接:https://baijiahao.baidu.com/s?id=1786337572531105925&wfr=spider&for=pc 在Excel中,有时候需要把两列或者多列数据合并到一列中,下面介绍4种常见方法,并且提示一些使用注意事项,总有一种方法符合你的要求:…

LabVIEW三针自动校准系统

基于LabVIEW的智能三针自动校准系统采用非接触式激光测径仪对标准三针进行精确测量。系统通过LabVIEW软件平台与硬件设备的协同工作&#xff0c;实现了数据自动采集、处理及报告生成&#xff0c;大幅提高了校准精度与效率&#xff0c;并有效降低了人为操作误差。 一、项目背景…

【Java】JDK集合类源码设计相关笔记

文章目录 前言1. Iterable2. RandomAccess2.1 RandomAccess 使用索引进行二分查找 3. Map3.1 HashMap3.2 IdentityHashMap 4. Collections 工具类4.1 Collections.shuffle() 洗牌 前言 目的: 收集JDK集合类的类图。记录一些有意思的设计。将之前写过的文章建立联系。 1. Ite…

macbook外接2k/1080p显示器调试经验

准备工具 电脑 满足电脑和显示器要求的hdmi线或者转接头或者扩展坞 betterdisplay软件 Dell P2419H的最佳显示信息如下 飞利浦 245Es 2K的最佳显示比例如下 首选1152