Django调用百度AI接口实现人脸注册登录代码实例

作者:小陆同学 时间:2023-10-13 23:07:14 

面部识别----考勤打卡、注册登录、面部支付等等...感觉很高大上,又很方便,下面用python中的框架--django完成一个注册登录的功能,调用百度AI的接口,面部识别在网上也有好多教程,可以自己建模,训练模型,但是这都需要大量的数据去提高模型的准确度,我们直接用了百度AI的接口,十分的快捷、高效、准确,下来码一下代码啦!!

首先需要在百度AI官网注册一个应用,免费,并提供强大的人脸库。

1.注册表单


<div class="tab-content">
                   <div class="tab-content-inner active" data-content="signup">
                     <!-- <form action="{% url 'regist' %}" method="POST"> -->
                       <div class="row form-group">
                         <div class="col-md-12">
                           <input type="text" class="form-control" id="username" placeholder="用户名">
                         </div>
                       </div>
                       <div class="row form-group">
                         <div class="col-md-12">
                           <input type="text" class="form-control" id="mobile" placeholder="手机号">
                         </div>
                       </div>
                       <div class="row form-group">
                         <div class="col-md-12">
                           <input type="password" class="form-control" id="password" placeholder="密码">
                         </div>
                       </div>
                       <div class="row form-group">
                           <div class="col-md-12">
                             <!-- <input type="text" class="form-control" id="mobile_code" placeholder="验证码">
                             <input type="button" value=" 获取验证码" id="zphone"> -->
                           </div>
                       </div>
                       <div class="row form-group">
                         <div class="col-md-12">
                           <label for="password2"><font color='green'>新用户点击注册会有面部特征收集哦!</font></label>
                         </div>
                       </div>

<div class="row form-group">
                         <div class="col-md-12">
                           <input type="submit" class="btn btn-primary" value="注册" id="regist">
                         </div>
                       </div>
                     <!-- </form>   -->
                   </div>

2.注册时调用摄像头,ajax封装给后端的数据


<!-- jQuery -->
 <script src="../static/assets/js/jquery.min.js"></script>
 <!-- jQuery Easing -->
 <script src="../static/assets/js/jquery.easing.1.3.js"></script>
 <!-- Bootstrap -->
 <script src="../static/assets/js/bootstrap.min.js"></script>
 <!-- Waypoints -->
 <script src="../static/assets/js/jquery.waypoints.min.js"></script>
 <!-- Carousel -->
 <script src="../static/assets/js/owl.carousel.min.js"></script>
 <!-- countTo -->
 <script src="../static/assets/js/jquery.countTo.js"></script>
 <!-- Magnific Popup -->
 <script src="../static/assets/js/jquery.magnific-popup.min.js"></script>
 <script src="../static/assets/js/magnific-popup-options.js"></script>
 <!-- Main -->
 <script src="../static/assets/js/main.js"></script>

<script>
   !(function () {
     // 老的浏览器可能根本没有实现 mediaDevices,所以我们可以先设置一个空的对象
     if (navigator.mediaDevices === undefined) {
       navigator.mediaDevices = {};
     }
     if (navigator.mediaDevices.getUserMedia === undefined) {
       navigator.mediaDevices.getUserMedia = function (constraints) {
         // 首先,如果有getUserMedia的话,就获得它
         var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

// 一些浏览器根本没实现它 - 那么就返回一个error到promise的reject来保持一个统一的接口
         if (!getUserMedia) {
           return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
         }

// 否则,为老的navigator.getUserMedia方法包裹一个Promise
         return new Promise(function (resolve, reject) {
           getUserMedia.call(navigator, constraints, resolve, reject);
         });
       }
     }
     const constraints = {
       video: true,
       audio: false
     };
     videoPlaying = false;
     v = document.getElementById('v');
     promise = navigator.mediaDevices.getUserMedia(constraints);
     promise.then(stream => {
       // 旧的浏览器可能没有srcObject
       if ("srcObject" in v) {
         v.srcObject = stream;
       } else {
         // 防止再新的浏览器里使用它,应为它已经不再支持了
         v.src = window.URL.createObjectURL(stream);
       }
       v.onloadedmetadata = function (e) {
         v.play();
         videoPlaying = true;
       };
     }).catch(err => {
       console.error(err.name + ": " + err.message);
     })
     document.getElementById('regist').addEventListener('click', function () {
       if (videoPlaying) {
         mycanvas = document.getElementById('canvas');
         mycanvas.width = v.videoWidth;
         mycanvas.height = v.videoHeight;
         mycanvas.getContext('2d').drawImage(v, 0, 0);
         // 图片数据转换成数组
         data = mycanvas.toDataURL('image/webp');
         document.getElementById('photo').setAttribute('src', data);
         // ajax提交数据到后台
         $.ajax({
           type:"POST",
           url:'http://127.0.0.1:8000/regist/',
           data:{username:$("#username").val(),mobile:$('#mobile').val(),password:$('#password').val(),mobile_code:$('#mobile_code').val(),imagecontent:data},
           dataType:"json",
           success:function(data){
             alert(data.result)
             $('#resText').text(data['result']);
             if(data.code == 200){
               window.location.href='http://127.0.0.1:8000/home/'
             }else{
               alert(data.result);
             }
           }
         })
       }
     }, false);

3.将已经注册的应用中的各种id和key贴上来


# 导入百度AI
from django.apps import AppConfig
from aip import AipFace
import json
# django内置事务
from django.db import transaction
# 导入状态码
from jyapp.ErrorCode import * # 官网给出的状态码,通过pandas读出保存到

# 百度AI基本信息
class AppConfig(AppConfig):
 name = ''
 APP_ID = ''
 API_KEY = ''
 SECRECT_KEY = ''
 client = AipFace(APP_ID,API_KEY,SECRECT_KEY)
 client.setConnectionTimeoutInMillis(1000*5)
 client.setSocketTimeoutInMillis(1000*5)

4.注册接口,按照接口文档传入必须的参数,手机验证码功能已在本文中注释掉,需要时自行百度。


# 注册
class Regist(View):
 def get(self,request):
   return render(request,'moban_index.html')
 def post(self,request):
   # 获取前端数据
   imagecontent = request.POST.get('imagecontent')
   username = request.POST.get('username')
   mobile = request.POST.get('mobile')
   password = request.POST.get('password')
   # mobile_code = request.POST.get('mobile_code')
   # print(imagecontent,username,mobile,password,mobile_code)
   # mobile_code_right = request.session.get('message_code')
   if not all([imagecontent,username,mobile,password]):
     return JsonResponse({'result':'注册信息不能为空'})
   # if mobile_code != mobile_code_right:
   #   return JsonResponse({'result':'请输入正确的验证码'})
   else:
     # 验证该用户是否存在
     user = models.User.objects.filter(mobile=mobile)
     if user:
       return JsonResponse({'result':'该用户已存在,请直接登录'})
     else:
       try:
         # 引入事务
         with transaction.atomic():  
           # 分割字符串
           base_data = imagecontent.split(',')[1]
           # base64解码
           base64_decode = base64.b64decode(base_data)
           # 图片写入本地
           with open('static/image/'+mobile+'.jpeg', 'wb') as f:
             f.write(base64_decode)
           # 添加到mysql数据库
           models.User.objects.create(
             imagecontent = 'static/image/'+mobile+'.jpeg',  # 可以根据需求是否保存注册照片到数据库,也可以通过百度AI人脸库查看
             username = username,
             mobile = mobile,
             password = password,
           )
           imageType = 'BASE64'
           groupId = 'usergroup'  # 自定义
           userId = mobile
           # 加入可选参数
           options = {}
           options['user_info'] = username
           options['quality_control'] = 'NORMAL'
           options['liveness_control'] = 'LOW'
           result = AppConfig.client.addUser(base_data,imageType,groupId,userId,options)
           print(result)
           error_code = result['error_code']
           if isinstance(error_code,int) and error_code == 0:
             request.session['mobile'] = mobile
             return JsonResponse({'code':200,'result':'注册成功'})
             # return JsonResponse({'result':'注册成功'})
           else:
             error = ErrorCode().getErrorInfo(error_code)
             return JsonResponse({'result':'{}'.format(error)})
       except:
         return JsonResponse({'result':'注册失败'})

5.登录.html


<div class="tab-content-inner" data-content="login">
                     <!-- <form action="{% url 'login' %}" method="POST"> -->
                       <div class="row form-group">
                         <div class="col-md-12">
                           <input type="text" class="form-control" id="mobile1" placeholder="请输入手机号">
                         </div>
                       </div>
                       <div class="row form-group">
                         <div class="col-md-12">
                           <input type="password" class="form-control" id="password1" placeholder="请输入密码">
                         </div>
                       </div>

<div class="row form-group">
                         <div class="col-md-12">
                           <input type="submit" class="btn btn-primary" value="密码登陆" id="login">
                           <input type="submit" class="btn btn-primary" value="人脸登陆" id="login_face">
                         </div>
                       </div>
                     <!-- </form>   -->
                   </div>

6.ajax封装登录信息


document.getElementById('login_face').addEventListener('click', function () {
       if (videoPlaying) {
         mycanvas = document.getElementById('canvas');
         mycanvas.width = v.videoWidth;
         mycanvas.height = v.videoHeight;
         mycanvas.getContext('2d').drawImage(v, 0, 0);
         data = mycanvas.toDataURL('image/webp');
         document.getElementById('photo').setAttribute('src', data);

$.ajax({
           type:"POST",
           url:'http://127.0.0.1:8000/login_face/',
           data:{mobile:$('#mobile1').val(),imagecontent:data},
           dataType:"json",
           success:function(data){
             $('#resText').text(data['result']);
             document.getElementById('photo').setAttribute('src','static/'+data['point72src']);
             console.log(data['point72src'])
             if(data.code == 200){
               alert(data.result)
               window.location.href='http://127.0.0.1:8000/idcard/'
             }else{
               alert(data.result);
             }
           }
         })
       }
     }, false);

7.人脸快速登录


class Login_face(View):
 def get(self,request):
   return render(request,'moban_index.html')
 def post(self,request):
   imagecontent = request.POST.get('imagecontent')
   mobile = request.POST.get('mobile')
   if not all([imagecontent,mobile]):
     return JsonResponse({'code':100,'result':'登录信息不能为空'})
   else:
     user = models.User.objects.filter(mobile=mobile)
     if not user:
       return JsonResponse({'code':113,'result':'用户不存在'})
     else:
       base_data = imagecontent.split(',')[1]
       imageType = 'BASE64'
       groupIdList = 'usergroup'
       # 加入可选参数
       options = {}
       options['max_user_num'] = 1
       options['quality_control'] = 'NORMAL'
       options['liveness_control'] = 'LOW'
       # options['user_id'] = mobile
       result = AppConfig.client.search(base_data,imageType,groupIdList,options)
       print(result)
       error_code = result['error_code']
       try:
         user_id = result['result']['user_list'][0]['user_id']
         score = result['result']['user_list'][0]['score']
         if isinstance(error_code,int) and error_code == 0 and user_id == mobile and score >= 90:
           request.session['mobile'] = mobile
           return JsonResponse({'code':200,'result':'快速登录成功'})
         else:
           error = ErrorCode().getErrorInfo(error_code)
           return JsonResponse({'result':'{}'.format(error)})
       except:
         error = ErrorCode().getErrorInfo(error_code)
         return JsonResponse({'result':'{}'.format(error)})

来源:https://www.cnblogs.com/lutt/p/11093974.html

标签:Django,百度,AI,接口
0
投稿

猜你喜欢

  • Pycharm直接使用远程服务器代码并调试的解决方法

    2021-05-13 10:21:03
  • pygame实现贪吃蛇游戏(上)

    2022-07-10 20:48:10
  • MySQL与MSSQl使用While语句循环生成测试数据的代码

    2024-01-22 01:42:47
  • Mysql InnoDB引擎的索引与存储结构详解

    2024-01-12 15:22:52
  • python中使用enumerate函数遍历元素实例

    2021-05-08 04:56:41
  • SpringBoot配置连接两个或多个数据库的实现

    2024-01-14 14:40:36
  • sql server自动生成拼音首字母的函数

    2024-01-25 15:27:19
  • 使用python模拟高斯分布例子

    2021-04-27 05:22:22
  • 在 Python 中如何将天数添加到日期

    2023-02-09 03:34:30
  • Python访问MySQL封装的常用类实例

    2024-01-16 01:43:42
  • 聚合函数和group by的关系详解

    2024-01-20 15:19:53
  • python os模块介绍

    2021-11-06 20:53:16
  • Python多线程中阻塞(join)与锁(Lock)使用误区解析

    2022-03-22 08:00:31
  • 基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式

    2024-04-22 22:37:54
  • Python全栈之文件函数和函数参数

    2023-05-11 02:28:21
  • python如何给内存和cpu使用量设置限制

    2021-03-04 00:43:00
  • 在Python中使用mechanize模块模拟浏览器功能

    2022-04-12 10:13:56
  • python中遍历文件的3个方法

    2022-10-21 08:41:07
  • 5 种JavaScript编码规范

    2024-06-16 16:57:08
  • Python中的zip函数使用示例

    2021-05-15 01:10:53
  • asp之家 网络编程 m.aspxhome.com