1. 程式人生 > 程式設計 >Django呼叫百度AI介面實現人臉註冊登入程式碼例項

Django呼叫百度AI介面實現人臉註冊登入程式碼例項

面部識別----考勤打卡、註冊登入、面部支付等等...感覺很高大上,又很方便,下面用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);
          // 圖片資料轉換成陣列
          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,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',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(),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):
    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,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)})

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。