Python调用华为API实现人脸比对

Posted ZHW_AI课题组

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python调用华为API实现人脸比对相关的知识,希望对你有一定的参考价值。

目录

1.作者介绍

马梦航,男,西安工程大学电子信息学院,2021级硕士研究生
研究方向:医学影像大数据分析
电子邮件:mamenghang9@gmail.com

孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:2425613875@qq.com

2.背景及访问流程介绍

2.1 人脸识别服务介绍

人脸识别作为一种“以貌取人”的生物智能识别技术,与其他生物识别技术相比,具有易获取、易识别、准确率高、直观性好等优点。人脸比对在人们的生活中应用广泛。通过比对两张图片中的人脸相似度并返回两两比对的得分,判断两张脸是否是同一人的可能性大小,人脸比对这一技术将辅助人们更加快捷有效地完成身份验证。目前,人脸对比检测技术主要包括:基于肤色、基于特征、基于模板匹配和基于统计学习。

2.2 华为人脸服务

华为云提供的人脸识别集合了人脸检测、人脸比对、人脸搜索等技术,广泛应用于人脸实名认证、城市公共交通、手机刷脸登陆、人脸采集等场景,无需人工干预,机器自动搜索人脸特征并完成分析,全面提升识别效率。其中,人脸比对功能根据用户选择的两张照片自动进行相似度分析,得出可能性大小,判断是否为同一人。

2.3 华为API访问流程

人脸识别提供了Web化的服务管理平台,即管理控制台,以及基于HTTPS请求的API管理方式。人脸识别以开放API的方式提供给用户,用户需要将人脸识别集成到第三方系统后才可使用。
①申请服务
②获取请求认证:①Token认证:通过Token认证调用请求。②AK/SK认证:通过AK/SK加密调用请求。AK/SK认证安全性更高。
③调用API。

2.4 构建HTTPS协议

在HTTP协议中,请求可以使用多种请求方法例如GET、 PUT、 POST、 DELETE、PATCH,用于指明以何种方式来访问指定的资源。在调用人脸比对API之前,需要先获取TOKEN值。访问TOKEN的协议为:url=https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens。
参数设置如图:

2.5 人脸识别限制要求

3.关于实验代码、实验过程、测试结果

3.1 Token获取代码

3.2 调用人脸比对算法API

3.3 结果输出

根据算法要求设置调用API,并上传两张人脸图片,将会返回人脸的相似度。

为了验证模型是否是根据脸部的全局特征进行人脸对比,接下来的实验上传了一个遮挡部分脸部的实验,最终结果报错。由此可见,该算法是根据人脸的全局特征,并不是根据局部特征,例如虹膜等其它生物特征。

3.4 完整代码

# _*_ coding: utf-8 _*_
# @Email :mamenghang9@gmail.com

import sys
import os
basedir = os.path.abspath(os.path.dirname(__file__))
sys.path.append(basedir)
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import requests
import base64
from urllib3.exceptions import InsecureRequestWarning
import urllib3
urllib3.disable_warnings(InsecureRequestWarning)

class picture(QWidget):

    def __init__(self):
        super(picture, self).__init__()

        self.resize(1200, 800)
        self.setWindowTitle("人脸比对识别")
        self.setWindowIcon(QIcon('logo.ico'))

        self.setWindowFlags(Qt.FramelessWindowHint)  # 去边框
        #   self.setAttribute(Qt.WA_TranslucentBackground)  # 设置窗口背景透明

        window_pale = QtGui.QPalette()
        window_pale.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background.png")))
        self.setPalette(window_pale)

        button_red = QPushButton(self)
        button_red.move(20, 20)
        button_red.setFixedSize(20, 20)
        button_red.setStyleSheet("QPushButton\\n"
                                 "    background:#CE0000;\\n"
                                 "    color:white;\\n"
                                 "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                 "\\n"
                                 "QPushButton:hover                    \\n"
                                 "    background:red;\\n"
                                 "\\n"
                                 "QPushButton:pressed\\n"
                                 "    border: 1px solid #3C3C3C!important;\\n"
                                 "    background:black;\\n"
                                 "")
        button_red.clicked.connect(self.quit_button)

        button_orange = QPushButton(self)
        button_orange.move(50, 20)
        button_orange.setFixedSize(20, 20)
        button_orange.setStyleSheet("QPushButton\\n"
                                    "    background:orange;\\n"
                                    "    color:white;\\n"
                                    "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                    "\\n"
                                    "QPushButton:hover                    \\n"
                                    "    background:yellow;\\n"
                                    "\\n"
                                    "QPushButton:pressed\\n"
                                    "    border: 1px solid #3C3C3C!important;\\n"
                                    "    background:black;\\n"
                                    "")
        button_green = QPushButton(self)
        button_green.move(80, 20)
        button_green.setFixedSize(20, 20)
        button_green.setStyleSheet("QPushButton\\n"
                                   "    background:green;\\n"
                                   "    color:white;\\n"
                                   "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                   "\\n"
                                   "QPushButton:hover                    \\n"
                                   "    background:#08BF14;\\n"
                                   "\\n"
                                   "QPushButton:pressed\\n"
                                   "    border: 1px solid #3C3C3C!important;\\n"
                                   "    background:black;\\n"
                                   "")
        button_green.clicked.connect(self.min_button)

        self.label1 = QLabel(self)
        self.label1.setText("           图片1显示")
        self.label1.setFixedSize(500, 400)
        # self.label1.move(350, 75)
        self.label1.move(80, 75)
        # self.label1.setStyleSheet("QLabelbackground:white;"
        #                          "QLabelcolor:rgb(300,300,300,120);font-size:48px;font-weight:bold;font-family:微软雅黑;"
        #                          )

        self.label2 = QLabel(self)
        self.label2.setText("           图片2显示")
        self.label2.setFixedSize(500, 400)
        self.label2.move(620, 75)

        # self.label1.setStyleSheet("QLabelbackground:white;"
        #                          "QLabelcolor:rgb(300,300,300,120);font-size:48px;font-weight:bold;font-family:微软雅黑;"
        #                          )
        self.label1.setStyleSheet("QLabel\\n"
                                 "    background:white;\\n"
                                 "    font-family:微软雅黑;\\n"
                                 "    color:black;\\n"
                                 "font-size:48px;\\n"
                                 "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                 "\\n"
                                 "")
        self.label2.setStyleSheet("QLabel\\n"
                                  "    background:white;\\n"
                                  "    font-family:微软雅黑;\\n"
                                  "    color:black;\\n"
                                  "font-size:48px;\\n"
                                  "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                  "\\n"
                                  "")

        self.text1 = QLineEdit(self)
        self.text1.setText("人脸对比识别")
        self.text1.setFixedSize(1140, 50)
        self.text1.move(30, 600)

        #self.text1.setFixedWidth(800);
        self.text1.setStyleSheet("QLineEdit\\n"
                                   "    background:white;\\n"
                                   "    font-family:微软雅黑;\\n"
                                   "    color:black;\\n"
                                   "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                   "\\n"
                                   "QPushButton:hover                    \\n"
                                   "    background:#00BFFF;\\n"
                                   "\\n"
                                   "QPushButton:pressed\\n"
                                   "    border: 1px solid #3C3C3C!important;\\n"
                                   "    background:black;\\n"
                                   "")


        btn1 = QPushButton(self)
        btn1.setText("第一张图片")
        btn1.resize(120, 80)
        btn1.move(270, 500)
        btn1.setStyleSheet("QPushButton\\n"
                                   "    background:#6495ED;\\n"
                                   "    font-family:微软雅黑;\\n"
                                   "    color:white;\\n"
                                   "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                                   "\\n"
                                   "QPushButton:hover                    \\n"
                                   "    background:#00BFFF;\\n"
                                   "\\n"
                                   "QPushButton:pressed\\n"
                                   "    border: 1px solid #3C3C3C!important;\\n"
                                   "    background:black;\\n"
                                   "")
        btn1.clicked.connect(self.openimage_1)

        btn2 = QPushButton(self)
        btn2.setText("第二张图片")
        btn2.resize(120, 80)
        btn2.move(810, 500)
        btn2.setStyleSheet("QPushButton\\n"
                           "    background:#6495ED;\\n"
                           "    font-family:微软雅黑;\\n"
                           "    color:white;\\n"
                           "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                           "\\n"
                           "QPushButton:hover                    \\n"
                           "    background:#00BFFF;\\n"
                           "\\n"
                           "QPushButton:pressed\\n"
                           "    border: 1px solid #3C3C3C!important;\\n"
                           "    background:black;\\n"
                           "")
        btn2.clicked.connect(self.openimage_2)

        btn3 = QPushButton(self)
        btn3.setText("开始识别")
        btn3.resize(150, 50)
        btn3.move(525, 670)
        btn3.setStyleSheet("QPushButton\\n"
                           "    background:#6495ED;\\n"
                           "    font-family:微软雅黑;\\n"
                           "    color:white;\\n"
                           "    box-shadow: 1px 1px 3px;border-radius: 10px;\\n"
                           "\\n"
                           "QPushButton:hover                    \\n"
                           "    background:#00BFFF;\\n"
                           "\\n"
                           "QPushButton:pressed\\n"
                           "    border: 1px solid #3C3C3C!important;\\n"
                           "    background:black;\\n"
                           "")
        btn3.clicked.connect(self.checkimage)

    def quit_button(self,event):

        reply = QtWidgets.QMessageBox.question(self,
                                               '人脸对比',
                                               "是否要退出程序?",
                                               QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
                                               QtWidgets.QMessageBox.No)
        if reply == QtWidgets.QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()
        #quit()
    def full_button(self):
        self.showMaximized()
    def mid_button(self):
        self.showNormal()
    def min_button(self):
        self.showMinimized( )
    def openimage_1(self):
        global imgName1
        imgName1, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
#        print(imgName1)
        jpg = QtGui.QPixmap(imgName1).scaled(self.label1.width(), self.label1.height())
        self.label1.setPixmap(jpg)
    def openimage_2(self):
        global imgName2
        imgName2, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
        jpg = QtGui.QPixmap(imgName2).scaled(self.label2.width(), self.label2.height())
        self.label2.setPixmap(jpg)

    def checkimage(self):
        url = "https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens"
        headers = 'Content-Type': 'application/json'
        request_body = 
            "auth": 
                "identity": 
                    "methods": [
                        "password"
                    ],
                    "password": 
                        "user": 
                            "name": "*********",
                            "password": "**********",
                            "domain": "name": "********",
                "scope": 
                    "project": 
                        "name": "cn-north-4"
        r = requests.post(url, json=request_body, headers=headers)
        token = r.headers.get("X-Subject-Token")
        endpoint = 'face.cn-north-4.myhuaweicloud.com'  # 华北 北京4 人脸比对V2,
        project_id = '0f55615fa680f5fa2fcdc01d0653a04a'
        headers = 'Content-Type': 'application/json', 'X-Auth-Token': token
        url = "https://endpoint/v2/project_id/face-compare".format(endpoint=endpoint, project_id=project_id)
        with open(imgName1, "rb") as bin_data:
            image1_data = bin_data.read()
        with open(imgName2, "rb") as bin_data:
            image2_data = bin_data.read()
        image1_base64 = base64.b64encode(image1_data).decode("utf-8")
        image2_base64 = base64.b64encode(image2_data).decode("utf-8")
        body = "image1_base64": image1_base64, "image2_base64": image2_base64
        response = requests.post(url, headers=headers, json=body, verify=False).json()
        # print(response)
        if 'similarity' not in response.keys():
            response = str(response['error_msg'])
            self.text1.setText('错误原因:'+response)
            # print('failure', response)
        else:
            response = str(response['similarity'])
            self.text1.setText('相似度:'+response)
            # print('success', response)

    def mousePressEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = e.globalPos() - self.pos()
            e.accept()
    def mouseReleaseEvent(self, e):
        if e.button() == Qt.LeftButton:
            self.m_drag = False
    def mouseMoveEvent(self, e):
        try:
            if Qt.LeftButton and self.m_drag:
                self.move(e.globalPos() - self.m_DragPosition)
                e.accept()
        except:
            print("错误代码:000x0")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    my = picture()
    my.show()
    sys.exit(app.exec_())

以上是关于Python调用华为API实现人脸比对的主要内容,如果未能解决你的问题,请参考以下文章

Python调用腾讯API进行人脸身份证比对

Python调用华为API实现人脸检测

Python调用华为API实现人脸检测

Python调用华为API实现人脸检测

Python调用腾讯API进行人脸身份证比对

人脸识别 python调用face++ 功能测试