完成人脸识别登录功能(基于百度AI人工智能库)

需要技术:
1、python Django框架(用于搭建网页)
2、学习调用百度AI人工智能库
(本文主要提供项目思路,后端代码主要应用百度AI库文档中的代码无需研究)
思路:
1、获取一张人脸照片
2、用ajax技术将人脸传向后台
3、在后台利用百度AI库进行人脸查找,判断该人是否在人脸库中(人脸库中的照片需要自己添加)
4、返回判断结果

前端代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>欢迎进入人脸识别系统</title>

  <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">

  <link rel="stylesheet" href="/cdnjs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">

  <link rel="stylesheet" href="/cdnjs/font-awesome/4.7.0/css/font-awesome.min.css">


    <link rel="stylesheet" href="/cdnjs/admin-lte/2.4.8/css/AdminLTE.min.css">

    <script src="/cdnjs/jquery/3.5.0/jquery.min.js"></script>

    <script src="/cdnjs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>


  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->


  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
</head>
<body class="hold-transition login-page" style="overflow-y:hidden">
<div class="login-box">
  <div class="login-logo">
    <a href="#" style="color:#32779f">人脸识别系统</a>
  </div>
  <div>
      <input type="button" class="btn btn-primary btn-block btn-flat" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()" />
      <button id="snap" class="btn btn-primary btn-block btn-flat" onclick="takePhoto()">拍照</button>
      <video id="video" width="300px" height="300px" autoplay="autoplay"></video>
      <canvas id="canvas" width="300px" height="300px"></canvas>


  </div>

</div>




<script>function postLoginRequest(){
     
     console.log("login");var e=$("#username").val(),n=$("#password").val();0!==e.length?0!==n.length?$.ajax({
     
     url:"/api/mgr/signin",type:"POST",data:"username="+e+"&password="+n,success:function(e,n,t){
     
     0===e.ret?window.location.href="/mgr/index.html":(alert("登录失败 : "+e.msg),$("#password").val(""))},error:function(e,n,t){
     
     alert("错误: "+e.status+t)}}):alert("请输入密码"):alert("请输入用户名")}function curTimestamp(){
     
     var e=(new Date).getTime();return Math.floor(e/1e3)}var lastSendReqTime=0;function on_return(e){
     
     if(13==e){
     
     var n=curTimestamp();if(n-window.lastSendReqTime<5)return;window.lastSendReqTime=n,postLoginRequest()}}document.onkeydown=function(e){
     
     on_return(window.event?window.event.keyCode:e.which)}
function getMedia() {
     
     
        let constraints = {
     
     
            //参数
            video: {
     
      width: 300, height: 300 },
            audio: false
        };
        //获得video摄像头区域
        let video = document.getElementById("video");
        //返回的Promise对象
        let promise = navigator.mediaDevices.getUserMedia(constraints);
        //then()异步,调用MediaStream对象作为参数
        promise.then(function (MediaStream) {
     
     
            video.srcObject = MediaStream;
            video.play();
        });
    }

    function takePhoto() {
     
     
        //获得Canvas对象
        let video = document.getElementById("video");
        let canvas = document.getElementById("canvas");
        let width = parseInt(video.videoWidth)
        let height = parseInt(video.videoHeight)
        let ctx = canvas.getContext('2d');
        //绘图
        ctx.drawImage(video,0,0,300,300);
        img=canvas.toDataURL('image/jpg')
            img=img.split(',')[1]
            //将照片以base64用ajax传到后台
            $.ajax({
     
     
		        type:"POST",
                url:'baidu_api',
                data:{
     
     
                    message:img
                },
                success:function (callback) {
     
     
                    if(callback=='no'){
     
     
                        alert( '登入失败!' );
                    }else {
     
     
                        alert( '录入成功!' );
                        window.location.href=callback
                    }
                },
                error:function (callback) {
     
     
                    alert( '登入失败!' );
                }
            })
    }
</script>
</body>
</html>

后端代码

import datetime
import os

from django.http import JsonResponse, request, HttpResponse

import requests
import base64
#调用百度api,需要先学习怎么调用
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=rXoEbmpmCyMqwc7G9fjwocTK&client_secret=VZtqZm8MGnlNqfxZS64GUPlOPaMthp8j'
response = requests.get(host)
token = response.json()
if response:
    print(token['access_token'])
'''
人脸注册
'''
#def add(img64):
    # request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add"
    # with open('C:/Users/yky/Pictures/yky.jpg', 'rb') as f:
    #     img = f.read()
    #     img64 = base64.b64encode(img).decode()
    # params = {}
    # params['image'] = img64
    # params['image_type'] = 'BASE64'
    # params['group_id'] = 1
    # params['user_id'] = 1
    # params['quality_control'] = 'NORMAL'
    # params['liveness_control'] = 'LOW'
    # access_token = token['access_token']
    # request_url = request_url + "?access_token=" + access_token
    # headers = {'content-type': 'application/json'}
    # response = requests.post(request_url, data=params, headers=headers)
    # if response:
    #     print (response.json())
"""
实现人脸查找
"""
# with open('C:/Users/yky/Pictures/yky2.jpg', 'rb') as f:
#     img = f.read()
#     img64 = base64.b64encode(img).decode()
def search(img64):
    shuxing = {
    
    }
    shuxing['image'] = img64
    shuxing['image_type'] = 'BASE64'
    shuxing['group_id_list'] = 1
    shuxing['quality_control'] = 'NORMAL'
    shuxing['liveness_control'] = 'LOW'
    '''
    人脸搜索
    '''

    request_url = "https://aip.baidubce.com/rest/2.0/face/v3/search"

    access_token = token['access_token']
    request_url = request_url + "?access_token=" + access_token
    headers = {
    
    'content-type': 'application/json'}
    response = requests.post(request_url, data=shuxing, headers=headers)
    if response:
        print(response.json())
        fanhui = response.json()
        result = fanhui['result']
        user_list = result['user_list']
        score = user_list[0]['score']
        return int(score)
def duibi(request):
    """人脸登录验证"""
    if request.POST:
        time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        strs = request.POST['message']
        #imgdata = base64.b64decode(strs)
        if search(strs) >= 80:
            return HttpResponse('index.html')
        else:
            return HttpResponse('no')
    return HttpResponse('no')
# if __name__ =='__main__':
#     with open('C:/Users/yky/Pictures/yky2.jpg', 'rb') as f:
#         img = f.read()
#         img64 = base64.b64encode(img).decode()
#         print(search(img64))

猜你喜欢

转载自blog.csdn.net/Kyrie6c/article/details/109249145