1 首先在Face++注册一个自己的账号
https://console.faceplusplus.com.cn/dashboard

人脸

人脸(Face)在人脸识别技术中特指图像中发现的人脸,当对一张图片进行人脸检测时,会将检测到的人脸记录下来,包括人脸在图片中的位置,用一个系统标识face_token来表示。注意:对同一张图片进行多次人脸检测,对同一个人脸会得到不同的face_token。

人脸集合

人脸集合(FaceSet)是用来存储检测到人脸的存储对象。一个FaceSet内face_token是不重复的

人脸比对/人脸搜索

计算机检测到图片中一个人脸之后,通过人脸判断人身份的过程被称为人脸比对/人脸搜索。
人脸比对指采集新的人脸,与一个已知身份用户的人脸进行比对,判断新的人脸是否属于该已知身份用户。人脸比对需要调用Compare API。
人脸搜索是指采集用户新的人脸,在多个已知身份用户的人脸集合中进行搜索,找出新的人脸属于哪一个已知身份用户。
人脸搜索需要调用Search API。

创建API Key

要调用 API,需要先创建一个 API Key(API 密钥),它是使用 API 和 SDK 的凭证。注册验证成功后,您可以在欢迎页面点击“创建我的第一个应用”,一个免费API Key会被自动生成,您可以直接使用。(注:免费API key 可依据免费规则调用API,如果您希望使用付费版服务,请按下面步骤创建正式API Key。)

完成 API Key 创建之后,您可以在控制台看到自己的账户余额和API调用量的统计。

postman调用API接口

人脸检测

人脸检测的API文档

执行下述步骤以后,看返回的结果

通过对比API参数可以看到 响应字段的意思

人脸对比

API文档


传两张不一样的照片,再看看置信度

创建faceSet

API文档
产生了一个faceset集合

添加face到faceset

api文档
成功添加到人脸集合里

根据outer_id得到faceset

api文档

可以看到有一张人脸

继续往faceset添加一张图片可以检测到数量已经变为2

删除人脸

api文档

可以看到删除后数量已经减少了

人脸识别实现刷脸登录

录入人脸信息,通过人脸检测接口得到face_token,存入outer_id=travel_faceset的faceset中当用户在登录的时候,得到用户当前登录图片,然后用人脸比对接口用当前登录图片和之前在faceset中保存的人脸信息进行比对。
比对后的返回信息有我们设置的阈值(thresholds),可以根据自身的需求选择其中一个阈值,当相似度(confidence)高于这个阈值时就可以认为是同一个人,即可以登录成功,反之,不能登录成功。

本项目是基于springboot项目的 。所以接下来的配置是在我的一个已有的springboot项目上进行人脸登录的

需要在配置文件中添加

face:config:api-key: JtGRv7lXpLK3wkip5KKIdDaOOKe1J-Cxapi-secret: 1zZ-eiAQiw7x-yG0gQ6ta0tmIB9GqLDgouter-id: faceset1

启动类中配置restTemplate

@SpringBootApplication
public class TravelApplication {@Bean
public RestTemplate restTemplate() {return new RestTemplate();
}
public static void main(String[] args) {SpringApplication.run(TravelApplication.class, args);
}
}

下面就是DAO层的业务,和上边的postman里边的请求是一样的

DAO层

package com.xxq.mapper;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.MultipartBodyBuilder;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@ConfigurationProperties("face.config")
@Component
@Getter
@Setter
public class FaceDao {@Autowiredprivate RestTemplate restTemplate;private String apiKey;private String apiSecret;private String outerId;/*** 人脸检测* @param filePath* @return* /* */public DetectResponseEntity detect(String filePath) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 多部件表单体MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();// ----------------- 表单 part  普通域multipartBodyBuilder.part("api_key", apiKey);multipartBodyBuilder.part("api_secret", apiSecret);// ----------------- 文件域 part// 从磁盘读取文件multipartBodyBuilder.part("image_file", new FileSystemResource(Paths.get(filePath)), MediaType.IMAGE_PNG);// build完整的消息体MultiValueMap<String, HttpEntity<?>> multipartBody =multipartBodyBuilder.build();ResponseEntity<DetectResponseEntity> responseEntity =restTemplate.postForEntity("https://api-cn.faceplusplus.com/facepp/v3/detect",multipartBody, DetectResponseEntity.class);return responseEntity.getBody();}/*** 创建用于登录的人脸faseSet*/public void faceSetCreate() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);//普通的表单请求MultiValueMap<String, String> map= new LinkedMultiValueMap<>();map.add("api_key", apiKey);map.add("api_secret", apiSecret);map.add("outer_id", outerId);HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);restTemplate.postForEntity("https://apicn.faceplusplus.com/facepp/v3/faceset/create", request, String.class);}/*** 得到登录人脸FaceSet详细信息*/public FaceSetResponseEntity getFaceSetDetail() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap<String, String> map= new LinkedMultiValueMap<>();map.add("api_key", apiKey);map.add("api_secret", apiSecret);map.add("outer_id", outerId);HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);ResponseEntity<FaceSetResponseEntity> responseEntity =restTemplate.postForEntity("https://api-cn.faceplusplus.com/facepp/v3/faceset/getdetail", request,FaceSetResponseEntity.class);return responseEntity.getBody();}/*** 添加faceToken到FaceSet* 人脸标识 faceTokens 组成的字符串,可以是一个或者多个,用逗号分隔。最多不超过5个face_token* @param faceTokens*/public void addFaceToFaceSet(String faceTokens) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap<String, String> map= new LinkedMultiValueMap<>();map.add("api_key", apiKey);map.add("api_secret", apiSecret);map.add("outer_id", outerId);map.add("face_tokens", faceTokens);HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<> (map, headers);restTemplate.postForEntity("https://api-cn.faceplusplus.com/facepp/v3/faceset/addface", request, String.class);}/*** 人脸比对* @param faceToken1* @param faceToken2* @return*/public boolean compareFace(String faceToken1, String faceToken2) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 多部件表单体MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();// ----------------- 表单 partmultipartBodyBuilder.part("api_key", apiKey);multipartBodyBuilder.part("api_secret", apiSecret);multipartBodyBuilder.part("face_token1", faceToken1);multipartBodyBuilder.part("face_token2", faceToken2);// ----------------- 文件 part// 从磁盘读取文件//multipartBodyBuilder.part("image_file", new FileSystemResource(Paths.get(filePath)), MediaType.IMAGE_PNG);MultiValueMap<String, HttpEntity<?>> multipartBody =multipartBodyBuilder.build();ResponseEntity<CompareResponseEntity> responseEntity =restTemplate.postForEntity("https://api-cn.faceplusplus.com/facepp/v3/compare",multipartBody, CompareResponseEntity.class);System.out.println(responseEntity);CompareResponseEntity e = responseEntity.getBody();if (e.getConfidence() >= e.getThresholds().e5) {return true;} else {return false;}}/*** 人脸比对返回实体类*/@Datapublic static class CompareResponseEntity {private Double confidence;private ThresholdsResponseEntity thresholds;}/*** 人脸对比置信度阈值返回实体类*/@Datapublic static class ThresholdsResponseEntity {@JsonProperty("1e-5")private Double e5;}/*** FaceSet返回实体类*/@Datapublic static class FaceSetResponseEntity{private String faceset_token;private String outer_id;private Integer face_count;private List<String> face_tokens;}@Data
/*** 人脸检测返回数据实体类*/public static class DetectResponseEntity {private String request_id;private Integer face_num;private List<FaceEntity> faces;}@Data
/*** 人脸实体类*/public static class FaceEntity {private String face_token;}
}

测试类

package com.xxq.mapper;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest
@RunWith(SpringRunner.class)public class FaceDaoTest {@Autowiredprivate  FaceDao faceDao;@Testpublic void detect() {FaceDao.DetectResponseEntity entity=faceDao.detect("C:\\Users\\ly\\Desktop\\photo\\向.jpg");System.out.println(entity);}@Testpublic void getFaceSetDetail() {FaceDao.FaceSetResponseEntity e = faceDao.getFaceSetDetail();System.out.println(e);}// 这个方法只适用于没有outerID的faceset,有的话就创建不了,报错了。@Testpublic void createFaceSet() {faceDao.faceSetCreate();}@Testpublic void addFaceToFaceSet() {faceDao.addFaceToFaceSet("af1f0bd2054dfe2aa1ce06c3be7116fa");}@Testpublic void campareFace() {boolean b = faceDao.compareFace("04aeead26262cea830b63ec0c0a92507","af1f0bd2054dfe2aa1ce06c3be7116fa");System.out.println(b);}}

**

报错 java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
添加下面的构件

**

<dependency><groupId>org.reactivestreams</groupId><artifactId>reactive-streams</artifactId><version>1.0.3</version>
</dependency>

Service层

接口层

public interface FaceService {/** 录入人脸* */public  void  addFace(String filePath);/** 登录比对人脸* */public boolean loginByFace(String filePath);
}

实现层

package com.xxq.service.impl;import com.xxq.service.FaceService;
import com.xxq.mapper.FaceDao;
import com.xxq.service.FaceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;@Service
public class FaceServiceImpl implements FaceService {@Autowiredprivate FaceDao faceDao;@Overridepublic void addFace(String filePath) {FaceDao.FaceSetResponseEntity fs = null;try {fs = faceDao.getFaceSetDetail();} catch (Exception e) {//单纯捕获一下,不做任何处理}if (fs == null) { //faceset不存在faceDao.faceSetCreate();}FaceDao.DetectResponseEntity dr = faceDao.detect(filePath); //检视人脸for (FaceDao.FaceEntity f : dr.getFaces()) {faceDao.addFaceToFaceSet(f.getFace_token());}}@Overridepublic boolean loginByFace(String filePath) {boolean result = false;FaceDao.FaceSetResponseEntity fs = null;try {fs = faceDao.getFaceSetDetail();} catch (Exception e) {}if (fs == null) { //faceset不存在faceDao.faceSetCreate();fs = faceDao.getFaceSetDetail();}FaceDao.DetectResponseEntity dr = faceDao.detect(filePath); //检视人脸String ft1 = null;if (dr.getFace_num() >=1) {ft1 = dr.getFaces().get(0).getFace_token();} else {return false;}for (String ft2: fs.getFace_tokens()) {if (faceDao.compareFace(ft1, ft2)) {result = true;}}new File(filePath).delete(); //删除登录人脸,节省服务器资源return result;}}

Controller层

package com.xxq.controller;
import com.xxq.service.FaceService;
import com.xxq.util.ImageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;@Controller
@RequestMapping("/admin/face")
public class FaceController {@Autowiredprivate FaceService faceService;/*** 调到录入人脸页面* @return*/@RequestMapping("/toinput")public String toInput() {return "/face/input";}@RequestMapping("/tologin")public String toLogin() {return "/face/login";}/*** 录入人脸* @param imgData* @param request* @return* @throws IOException*/@ResponseBody@RequestMapping("/upload")public ResponseEntity doAdd(@RequestParam("imgData") String imgData,HttpServletRequest request) throws IOException {String savePath = request.getServletContext().getRealPath("img/face/");String fileName = UUID.randomUUID().toString().replaceAll("-", "") +".png";System.out.println(savePath);ImageUtils.generateImage(imgData.substring(22), savePath, fileName);faceService.addFace(savePath + fileName);return ResponseEntity.ok("{\"success\": \"true\"}");}/*** 人脸识别登录* @param imgData* @param request* @return* @throws IOException*/@ResponseBody@RequestMapping("/login")public ResponseEntity login(@RequestParam("imgData") String imgData,HttpServletRequest request) throws IOException {String savePath =request.getServletContext().getRealPath("img/face/login/");String fileName = UUID.randomUUID().toString().replaceAll("-", "") +".png";System.out.println(savePath);ImageUtils.generateImage(imgData.substring(22), savePath, fileName);boolean b = faceService.loginByFace(savePath + fileName);if (b) {System.out.println("登录成功");return ResponseEntity.ok("{\"success\": true}");} else {System.out.println("登录失败");return ResponseEntity.ok("{\"success\": false}");}}
}

工具类,进行BASE64转码的

package com.xxq.util;
import sun.misc.BASE64Decoder;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class ImageUtils {public static boolean generateImage(String imgStr, String filePath, String fileName) {try {if (imgStr == null) {return false;}BASE64Decoder decoder = new BASE64Decoder();byte[] b = decoder.decodeBuffer(imgStr);File file = new File(filePath);if (!file.exists()) {file.mkdirs();}OutputStream out = new FileOutputStream(filePath+fileName);out.write(b);out.flush();out.close();return true;} catch (Exception e) {return false;}}}

前端页面:

input.jtml

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta charset="utf-8"/><title>用户管理</title><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/><!-- bootstrap & fontawesome --><link rel="stylesheet" href="/assets/css/bootstrap.min.css"/><link rel="stylesheet" href="/assets/font-awesome/4.5.0/css/font-awesome.min.css"/><!-- page specific plugin styles --><!-- text fonts --><link rel="stylesheet" href="/assets/css/fonts.googleapis.com.css"/><!-- ace styles --><link rel="stylesheet" href="/assets/css/ace.min.css" class="ace-main-stylesheet" id="main-ace-style"/><!--[if lte IE 9]><link rel="stylesheet" href="/assets/css/ace-part2.min.css" class="ace-main-stylesheet"/><![endif]--><link rel="stylesheet" href="/assets/css/ace-skins.min.css"/><link rel="stylesheet" href="/assets/css/ace-rtl.min.css"/><!--[if lte IE 9]><link rel="stylesheet" href="/assets/css/ace-ie.min.css"/><![endif]--><!-- inline styles related to this page --><!-- ace settings handler --><script src="/assets/js/ace-extra.min.js"></script><!-- HTML5shiv and Respond.js for IE8 to support HTML5 elements and media queries --><!--[if lte IE 8]><script src="/assets/js/html5shiv.min.js"></script><script src="/assets/js/respond.min.js"></script><![endif]--><!--[if !IE]> --><script src="/assets/js/jquery-2.1.4.min.js"></script><!-- <![endif]--><!--[if IE]><script src="/assets/js/jquery-1.11.3.min.js"></script><![endif]--><script src="/assets/js/bootstrap.min.js"></script><!-- page specific plugin scripts --><script src="/assets/js/jquery.dataTables.min.js"></script><script src="/assets/js/jquery.dataTables.bootstrap.min.js"></script><script src="/assets/js/dataTables.buttons.min.js"></script><script src="/assets/js/buttons.flash.min.js"></script><script src="/assets/js/buttons.html5.min.js"></script><script src="/assets/js/buttons.print.min.js"></script><script src="/assets/js/buttons.colVis.min.js"></script><script src="/assets/js/dataTables.select.min.js"></script><!-- ace scripts --><script src="/assets/js/ace-elements.min.js"></script><script src="/assets/js/ace.min.js"></script></head><body class="no-skin"><div th:replace="header :: navbar"></div><div class="main-container ace-save-state" id="main-container"><script type="text/javascript">try {ace.settings.loadState('main-container')} catch (e) {}</script><div th:replace="left :: sidebar"></div><div class="main-content"><div class="main-content-inner"><div class="breadcrumbs ace-save-state" id="breadcrumbs"><ul class="breadcrumb"><li><i class="ace-icon fa fa-home home-icon"></i><a href="#">首页</a></li><li><a href="#">用户</a></li><li class="active">用户管理</li></ul><!-- /.breadcrumb --></div><div class="page-content"><div style="padding: 10px;"><tr><td colspan="2"><button class="btn btn-sm btn-default" onclick="openMedia()">开启摄像头</button><button class="btn btn-sm btn-default" onclick="closeMedia()">关闭摄像头</button><button class="btn btn-sm btn-default" onclick="takePhoto()">录入人脸/button></td></tr><table><tr><td><video id="video" width="500px" height="500px" autoplay="autoplay"></video><canvas id="canvas" width="500px" height="500px" style="display: none"></canvas></td><td><img id="imgTag" src="" alt="..." width="500px" height="500px"><br></td></tr></table><script>let mediaStreamTrack=null; // 视频对象(全局)let video ;function openMedia() {let constraints = {video: { width: 500, height: 500 },audio: false};//获得video摄像头video = document.getElementById('video');let promise = navigator.mediaDevices.getUserMedia(constraints);promise.then((mediaStream) => {// mediaStreamTrack = typeof mediaStream.stop === 'function' ? mediaStream : mediaStream.getTracks()[1];mediaStreamTrack=mediaStream.getVideoTracks()video.srcObject = mediaStream;video.play();});}// 拍照function takePhoto() {//获得Canvas对象let video = document.getElementById('video');let canvas = document.getElementById('canvas');let ctx = canvas.getContext('2d');ctx.drawImage(video, 0, 0, 500, 500);// toDataURL  ---  可传入'image/png'---默认, 'image/jpeg'let img = document.getElementById('canvas').toDataURL();// 这里的img就是得到的图片console.log('img-----', img);document.getElementById('imgTag').src=img;//上传$.ajax({url:"/admin/face/upload",type:"POST",data:{"imgData":img},success:function(data){alert("录入成功")},error:function(){alert("录入失败")}});}// 关闭摄像头function closeMedia() {let stream = document.getElementById('video').srcObject;let tracks = stream.getTracks();tracks.forEach(function(track) {track.stop();});document.getElementById('video').srcObject = null;}</script></div></div><!-- /.page-content --></div></div><!-- /.main-content --></div><!-- /.main-container --></body>
</html>

login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta charset="utf-8"/><title>用户管理</title><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/><!-- bootstrap & fontawesome --><link rel="stylesheet" href="/assets/css/bootstrap.min.css"/><link rel="stylesheet" href="/assets/font-awesome/4.5.0/css/font-awesome.min.css"/><!-- page specific plugin styles --><!-- text fonts --><link rel="stylesheet" href="/assets/css/fonts.googleapis.com.css"/><!-- ace styles --><link rel="stylesheet" href="/assets/css/ace.min.css" class="ace-main-stylesheet" id="main-ace-style"/><!--[if lte IE 9]><link rel="stylesheet" href="/assets/css/ace-part2.min.css" class="ace-main-stylesheet"/><![endif]--><link rel="stylesheet" href="/assets/css/ace-skins.min.css"/><link rel="stylesheet" href="/assets/css/ace-rtl.min.css"/><!--[if lte IE 9]><link rel="stylesheet" href="/assets/css/ace-ie.min.css"/><![endif]--><!-- inline styles related to this page --><!-- ace settings handler --><script src="/assets/js/ace-extra.min.js"></script><!-- HTML5shiv and Respond.js for IE8 to support HTML5 elements and media queries --><!--[if lte IE 8]><script src="/assets/js/html5shiv.min.js"></script><script src="/assets/js/respond.min.js"></script><![endif]--><!--[if !IE]> --><script src="/assets/js/jquery-2.1.4.min.js"></script><!-- <![endif]--><!--[if IE]><script src="/assets/js/jquery-1.11.3.min.js"></script><![endif]--><script src="/assets/js/bootstrap.min.js"></script><!-- page specific plugin scripts --><script src="/assets/js/jquery.dataTables.min.js"></script><script src="/assets/js/jquery.dataTables.bootstrap.min.js"></script><script src="/assets/js/dataTables.buttons.min.js"></script><script src="/assets/js/buttons.flash.min.js"></script><script src="/assets/js/buttons.html5.min.js"></script><script src="/assets/js/buttons.print.min.js"></script><script src="/assets/js/buttons.colVis.min.js"></script><script src="/assets/js/dataTables.select.min.js"></script><!-- ace scripts --><script src="/assets/js/ace-elements.min.js"></script><script src="/assets/js/ace.min.js"></script></head><body class="no-skin"><div class="main-container ace-save-state" id="main-container"><div class="main-content"><div class="main-content-inner"><div class="page-content"><div style="padding: 10px;"><tr><td colspan="2"><button class="btn btn-sm btn-default" onclick="openMedia()">开启摄像头</button><button class="btn btn-sm btn-default" onclick="closeMedia()">关闭摄像头</button><button class="btn btn-sm btn-default" onclick="takePhoto()">登录</button></td></tr><table><tr><td><video id="video" width="500px" height="500px" autoplay="autoplay"></video><canvas id="canvas" width="500px" height="500px" style="display: none"></canvas></td><td><img id="imgTag" src="" alt="..." width="500px" height="500px"><br></td></tr></table><script>let mediaStreamTrack=null; // 视频对象(全局)let video ;function openMedia() {let constraints = {video: { width: 500, height: 500 },audio: false};//获得video摄像头video = document.getElementById('video');let promise = navigator.mediaDevices.getUserMedia(constraints);promise.then((mediaStream) => {// mediaStreamTrack = typeof mediaStream.stop === 'function' ? mediaStream : mediaStream.getTracks()[1];mediaStreamTrack=mediaStream.getVideoTracks()video.srcObject = mediaStream;video.play();});}// 拍照function takePhoto() {//获得Canvas对象let video = document.getElementById('video');let canvas = document.getElementById('canvas');let ctx = canvas.getContext('2d');ctx.drawImage(video, 0, 0, 500, 500);// toDataURL  ---  可传入'image/png'---默认, 'image/jpeg'let img = document.getElementById('canvas').toDataURL();// 这里的img就是得到的图片console.log('img-----', img);document.getElementById('imgTag').src=img;//上传$.ajax({url:"/admin/face/login",type:"POST",data:{"imgData":img},dataType: "json",success:function(data){var b = data.success;alert(b);if (b) {alert("登录成功");} else {alert("登录失败");}},error:function(){alert("登录失败")}});}// 关闭摄像头function closeMedia() {let stream = document.getElementById('video').srcObject;let tracks = stream.getTracks();tracks.forEach(function(track) {track.stop();});document.getElementById('video').srcObject = null;}</script></div></div><!-- /.page-content --></div></div><!-- /.main-content --></div><!-- /.main-container --></body>
</html>

java人脸识别怎么写-------源码附上相关推荐

  1. 人脸检测MTCNN和人脸识别Facenet(附源码)

    原文链接:人脸检测MTCNN和人脸识别Facenet(附源码) 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第九节.人脸检测之Haa ...

  2. OpenCV+百度云人脸识别项目及源码

    OpenCV+百度云人脸识别项目及源码 1.需要的硬件环境 虚拟机 带有摄像头的电脑 2.整体项目的框架 用Opencv识别人脸,上传百度云进行识别对比 3.虚拟机上需要装的库 sudo apt-ge ...

  3. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  4. 人脸检测颜值软件_百度AI人脸识别测颜值源码

    百度AI人脸识别测颜值由百度AI官方推出百度AI人脸识别测颜值源码,目前已将人脸识别氛围V2和V3两个接口,使用前需要参考相应的文档权限来选择接口类型.今天为大家带来的源码,就是让大家能够了解学习到百 ...

  5. 百度AI人脸检测测颜值php,百度AI人脸识别测颜值源码app

    百度AI人脸识别测颜值源码app是由百度AI官方提供的,将人脸识别分为了两个接口,v2与vv3.需要根据文档权限来选择接口类型,这款软件非常方便用户学习和体验.想要学习相关信息的朋友可以来看看哦. 百 ...

  6. java企业排班系统企业考勤人脸识别考勤系统源码企业批量排班网站

    java实现的企业批量排班系统,出差请假打卡统计,排班,设置部长,发布公告等功能.人脸识别考勤打卡. 新增角色:部长(管理员指定部长) ,由部长对自己部门的员工进行分组,然后按分组进行排班,比如:张三 ...

  7. python 深度学习源码_「深度学习」用TensorFlow实现人脸识别(附源码,快速get技能)...

    本文将会带你使用python码一个卷积神经网络模型,实现人脸识别,操作难度比较低,动手跟着做吧,让你的电脑认出你那帅气的脸. 由于代码篇幅较长,而且最重要的缩进都没了,建议直接打开源码或者点击分享-& ...

  8. (转)第三十七节、人脸检测MTCNN和人脸识别Facenet(附源码)

    http://www.cnblogs.com/zyly/p/9703614.html 在说到人脸检测我们首先会想到利用Harr特征提取和Adaboost分类器进行人脸检测(有兴趣的可以去一看这篇博客第 ...

  9. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  10. 人脸检测颜值软件_百度AI人脸识别颜值-百度AI人脸识别测颜值源码下载-西西软件下载...

    百度AI人脸识别测颜值由百度AI官方推出,目前已将人脸识别氛围V2和V3两个接口,使用前需要参考相应的文档权限来选择接口类型.本次为大家带来百度AI人脸识别测颜值平台源码资源下载,相关的测量源码数据都 ...

最新文章

  1. “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
  2. Python__数据结构与算法——表、栈、队列
  3. 常用chrome插件
  4. python搭建selenium_了解搭建selenium安装以及配置环境
  5. cshtml中引用css_css基础必备-使用样式,前端小白一看就会
  6. 线程销毁_多线程(2)-Java高级知识(9)
  7. springcloud是如何进行服务治理的
  8. withRouter有什么用?干嘛用?为啥要用它啊???一分钟理解!
  9. dell 7040m 黑苹果_618晒单如何打造一台万元级10代酷睿黑苹果
  10. Python——彩票(大乐透)模拟随机选号
  11. BM3D 算法原理详细解析 按过程步骤讲解(附C++实现代码)
  12. matlab教程pdf,Matlab2010经典超强教程(清晰、版).pdf
  13. 博途PLC 1200/1500PID PID_Temp 加热制冷双输出+级联控制(串级控制)
  14. 给大家讲解一下 AIDL原理分析
  15. oracle全量增量_oracle增量和全量备份方案
  16. js日期时间格式化yyyy-mm-dd hh:ii:ss
  17. 谨慎选择我们的先验 - 对最优拟合概率分布搜索空间的一种约束
  18. 万用字元与特殊符号及正则表示字符
  19. visio用方向键无法移动图标的解决方法
  20. 要闻君说:小米9已确认无线充电;华为着手操作的5G火车站启动建设仪式将于本月18日“登陆”;三星提出大力发展电信网络设备业务……...

热门文章

  1. QT编程入门系列文章之三十三——国际化(上)
  2. Depth Map Prediction from a Single Image using a Multi-Scale Deep Network--Eigen D
  3. python库下载地址
  4. RK3128 Linux 源代码,rk3128开发板linux开发使用指南(35页)-原创力文档
  5. java图书管理系统课程设计_JAVA课程设计图书管理系统课程设计.doc
  6. svn删除文件和解决冲突
  7. c语言程序设计基础课本答案,c语言程序设计基础课后习题参考 答 案与解析.doc...
  8. 产品设计必备干货:产品开发流程[完整版]
  9. access control延迟锁门_求教RFID ACCESS CONTROL门禁机设置方法
  10. plist文件的读写