毕业设计 - 基于JAVA人脸识别管理系统(人脸搜索与人脸库管理)

基于JAVA的人脸识别管理系统作品分享一下,希望能帮助到有需要的同学们。

【背景/简介】

人脸搜索与人脸库管理主要用在人脸通用场景,采集照片与底库照片主要为生活照,通常通过手机、电脑、面板机等设备采集。常用于考勤、登录人脸认证等场景。

基于JAVA的人脸识别管理系统由人脸库、人脸识别认证记录两大模块组成,整体简单实用,构成了人脸识别管理系统的核心功能。本篇文章采用百度API为大家展示基于JAVA实现的人脸识别管理系统功能,有需者可参考。

【技术框架】

系统采用的技术是基于JAVA语言开发的后台管理系统,前后端不分离,数据库采用mysql。技术栈如下:
一、后端技术:SpringBoot2.0 + mybatis + Shiro
二、前端技术:Bootstrap + thymeleaf

【核心开发】

一、数据库设计
核心表包括人脸库管理表、人脸识别记录表、人脸识别匹配明细表。因为人脸识别可能有多张图片匹配成功,故需要使用人脸识别记录匹配明细表。具体字段如下:

在这里插入图片描述
其中,人脸库结构由人脸库、用户组、用户、用户下的人脸组成,层级关系如下所示:


|- 人脸库(appid)
   |- 用户组一(group_id)
      |- 用户01(uid)
         |- 人脸(faceid)
      |- 用户02(uid)
         |- 人脸(faceid)
         |- 人脸(faceid)
         ....
       ....
   |- 用户组二(group_id)
   |- 用户组三(group_id)
   ....

设计的库表详细字段如下:

(1)人脸库表(sys_faceLibrary)

create table sys_faceLibrary
(
  id       bigint(20)      not null auto_increment    comment 'yID',
  group_id  varchar(50)     not null                   comment '用户组id',
  user_id     varchar(50)     not null                   comment '用户id',
  url    varchar(2000)     not null                   comment '图片',
  user_info     varchar(50)     not null                   comment '用户资料',
  status        char(1)         default '0'                  comment '状态(0正常 1停用)',
  create_by     varchar(64)     default ''                 comment '创建者',
  create_time   datetime                                   comment '创建时间',
  update_by     varchar(64)     default ''             comment '更新者',
  update_time   datetime                                   comment '更新时间',
  remark        varchar(500)    default null               comment '备注',
  primary key (id)
) engine=innodb comment = '人脸库';

(2)人脸识别记录表(sys_faceRecord)

create table sys_faceRecord
(
  id       bigint(20)      not null auto_increment    comment 'yID',
  url    varchar(2000)     not null                   comment '上传图片',
  face_token     varchar(250)     default null                   comment '人脸标志',
  result     varchar(250)     default null                   comment '识别结果(成功、失败)',
  status        char(1)         default '0'                  comment '状态(0正常 1停用)',
  create_by     varchar(64)     default ''                 comment '创建者',
  create_time   datetime                                   comment '创建时间',
  update_by     varchar(64)     default ''             comment '更新者',
  update_time   datetime                                   comment '更新时间',
  remark        varchar(500)    default null               comment '备注',
  primary key (id)
) engine=innodb comment = '人脸识别记录';

(3)人脸识别记录匹配明细(sys_faceRecordDetail)

create table sys_faceRecordDetail
(
  id       bigint(20)      not null auto_increment    comment 'yID',
  recordId  bigint(20)     not null                   comment '识别记录id',
  group_id  varchar(50)     not null                   comment '识别的用户组id',
  user_id     varchar(50)     not null                   comment '识别的用户id',
  url    varchar(2000)     default null                   comment '识别的图片',
  score    varchar(250)     not null                   comment '识别的用户匹配得分',
  user_info     varchar(50)     not null                   comment '用户资料',
  status        char(1)         default '0'                  comment '状态(0正常 1停用)',
  create_by     varchar(64)     default ''                 comment '创建者',
  create_time   datetime                                   comment '创建时间',
  update_by     varchar(64)     default ''             comment '更新者',
  update_time   datetime                                   comment '更新时间',
  remark        varchar(500)    default null               comment '备注',
  primary key (id)
) engine=innodb comment = '人脸识别记录匹配明细';

【功能展示】

一、人脸库管理

人脸库管理主要调用百度API的人脸注册接口:功能为向人脸库中添加人脸,并在本地库表 - 人脸库表(sys_faceLibrary)存储对应的相关资料,包括新增、修改、删除功能。

(1)新增/修改功能,上传人脸库图片后可以新增到人脸库里面

在这里插入图片描述
在这里插入图片描述

如果上传的是人脸图片,则上传成功。如果不是人脸图片,则会提示图片没有人脸,如下:

在这里插入图片描述

(2)人脸库列表展示功能

在这里插入图片描述

上传成功后,可以到百度api后台查看数据,可以发现也有对应的数据了,如下:

在这里插入图片描述

点击进去后可以看到上传的明细图片:

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

二、人脸识别记录管理

人脸库管理主要调用百度API的人脸搜索接口:也称为1:N识别,在指定人脸集合中,找到最相似的人脸,并在本地库表 - 人脸识别记录表(sys_faceRecord)、人脸识别记录匹配明细表(sys_faceRecordDetail)存储对应的相关资料。因为人脸识别可能有多张图片匹配成功,故需要使用人脸识别记录匹配明细表(sys_faceRecordDetail)。

(1)上传功能:上传人脸图片后与人脸库的图片集合进行对比,搜索出最相似的人脸返回,如果有多张图片匹配,则返回多张。

在这里插入图片描述

(2)人脸识别匹配列表展示:记录上传的图片、返回的人脸标志、创建时间以及识别结果,结果分为识别成功、未找到匹配用户两种结果。

在这里插入图片描述

针对识别成功的记录,可以点击每行前面的+号展开查看匹配的库表图片明细,包括匹配库表的用户组id、用户id、识别的用户图片、识别的用户匹配得分,具体如下:

在这里插入图片描述
在这里插入图片描述

可以看到上面匹配的用户分数都是100分,说明是识别成功了。

【核心代码】

(1)获取API访问token

 /**
     * 获取API访问token
     * 该token有一定的有效期,需要自行管理,当失效时需重新获取.
     * @param ak - 百度云官网获取的 API Key
     * @param sk - 百度云官网获取的 Securet Key
     * @return assess_token 示例:
     * "24.460da4889caad24cccdb1fea17221975.2592000.1491995545.282335-1234567"
     */
    public static String getAuth(String ak, String sk) {
    
    
        // 获取token地址
        String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
        String getAccessTokenUrl = authHost
                // 1. grant_type为固定参数
                + "grant_type=client_credentials"
                // 2. 官网获取的 API Key
                + "&client_id=" + ak
                // 3. 官网获取的 Secret Key
                + "&client_secret=" + sk;
        try {
    
    
            URL realUrl = new URL(getAccessTokenUrl);
            // 打开和URL之间的连接
            HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
    
    
                System.err.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String result = "";
            String line;
            while ((line = in.readLine()) != null) {
    
    
                result += line;
            }
            /**
             * 返回结果示例
             */
            System.err.println("result:" + result);
            JSONObject jsonObject = (JSONObject) JSON.parse(result);
            //JSONObject jsonObject = new JSONObject(result);
            String access_token = jsonObject.getString("access_token");
            return access_token;
        } catch (Exception e) {
    
    
            System.err.printf("获取token失败!");
            e.printStackTrace(System.err);
        }
        return null;
    }

(2)人脸注册功能(含api+本地接口)

/**
     *  人脸注册
     */
    public String add(SysFacelibrary sysFacelibrary) {
    
    
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
        try {
    
    
            Map<String, Object> map = new HashMap<>();
            map.put("image",sysFacelibrary.getUrl());
            map.put("group_id", sysFacelibrary.getGroupId());
            map.put("user_id", sysFacelibrary.getUserId());
            map.put("user_info", sysFacelibrary.getUserInfo());
            map.put("liveness_control", "NONE");
            map.put("image_type", "BASE64");
            map.put("quality_control", "LOW");
            map.put("action_type", "REPLACE");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
/**
     * 新增保存人脸库
     */
    @RequiresPermissions("system:faceLibrary:add")
    @Log(title = "人脸库", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(SysFacelibrary sysFacelibrary) throws Exception
    {
    
    

        String picUrl = sysFacelibrary.getUrl();
        // 上传文件路径,需要处理成本地能下载的
        String filePath = RuoYiConfig.getUploadPath();
        String upload = picUrl.substring(picUrl.indexOf("upload")+6);
        String downFilePath = filePath + upload;

        //人脸注册
        String image = Base64Util.encode(FileUtil.readFileByBytes(downFilePath));
        sysFacelibrary.setUrl(image);
        String result = sysFaceService.add(sysFacelibrary);
        System.out.println("返回结果="+result);
        sysFacelibrary.setUrl(picUrl);

        //判断结果,填写
        JSONObject jsonObject =  JSON.parseObject(result);
        Integer code = (Integer)jsonObject.get("error_code");
        String error_msg = (String)jsonObject.get("error_msg");

        if(code == 0){
    
    
            sysFacelibraryService.insertSysFacelibrary(sysFacelibrary);
        }else {
    
    
            return AjaxResult.error(code+": "+error_msg);
        }

        return AjaxResult.success();
    }

(3)人脸搜索功能(含api+本地接口)

public  String faceSearch(String image) {
    
    
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
        try {
    
    
            Map<String, Object> map = new HashMap<>();
            map.put("image_type", "URL");*/
            map.put("image", image);
            map.put("image_type", "BASE64");
            map.put("liveness_control", "NONE");
            //默认是A_1先
            map.put("group_id_list", "A_1");
            map.put("quality_control", "LOW");
            map.put("match_threshold", "80");

            String param = GsonUtils.toJson(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);

            System.out.println(result);
            return result;
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
/**
     * 新增保存人脸识别记录
     */
    @RequiresPermissions("system:faceRecord:add")
    @Log(title = "人脸识别记录", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(SysFacerecord sysFacerecord) throws Exception
    {
    
    
        String picUrl = sysFacerecord.getUrl();
        // 上传文件路径,需要处理成本地能下载的
        String filePath = RuoYiConfig.getUploadPath();
        String upload = picUrl.substring(picUrl.indexOf("upload")+6);
        String downFilePath = filePath + upload;
        String image = Base64Util.encode(FileUtil.readFileByBytes(downFilePath));
        String faceSearch = sysFaceService.faceSearch(image);
       
        //判断结果,填写
        JSONObject jsonObject =  JSON.parseObject(faceSearch);
        Integer code = (Integer)jsonObject.get("error_code");
        String error_msg = (String)jsonObject.get("error_msg");

        if(code == 0){
    
    
            sysFacerecord.setResult("识别成功");
        }else if(code == 222207){
    
    
            sysFacerecord.setResult("未找到匹配的用户");  
        }else {
    
    
            sysFacerecord.setResult(code+": "+error_msg);
        }

		sysFacerecordService.insertSysFacerecord(sysFacerecord);
        return AjaxResult.success();
    }

【总结】

人脸识别管理系统主要是围绕人脸库管理和人脸识别认证两个核心功能进行拓展,并进行一系列的校验控制,可以容易上手,值得采取。

猜你喜欢

转载自blog.csdn.net/weixin_43423484/article/details/126693620