调用百度API,来实现人脸活体(人脸展示攻击)(人脸反欺骗)的实时检测

目录

一、登录百度API网站,申请API接口 

二、创建应用列表,查看API Key 与 Secret Key

三、应用API Key 与 Secret Key,将模型部署在本地环境中

四、以视频流的方式进行实时检测

总体功能描述:

        1. 调用百度API,实现对人脸展示攻击的检测;

        2. 将检测模块部署到自己的电脑上,以视频窗口的方式进行实时检测;


一、登录百度API网站,申请API接口 

        1. 进入百度提供的关于活体检测的API网站

        方式一(地址可能会变): https://ai.baidu.com/tech/face/faceliveness

        方式二:

        (1)进入:https://ai.baidu.com/ 

        (2)找到活体检测入口:开放能力->人脸与人体->活体检测;

        2. 点击立即使用,然后登录自己的百度账号

         3. 概览->领取免费资源

         4. 基础服务->人脸检测->领取

        5. 5分钟之后,查看资源列表

         6. 可以看到已成功领取


二、创建应用列表,查看API Key 与 Secret Key

         1. 创建应用列表:公有云服务->应用列表->创建应用

2. 填写应用信息,并创建

        3. 再次返回应用列表,可看到创建的应用信息,API Key 与 Secret Key在绿色框里


三、应用API Key 与 Secret Key,将模型部署在本地环境中

逻辑思想:

        (1)指定API Key 与 Secret Key;

        (2)以二进制的方式读取本地测试图片;

        (3)二进制图片转base64;

        (4)将base64传入接口;

         代码如下:

import requests
import json
import base64
API_KEY = ""
SECRET_KEY = ""
def api_interface(base_str = None):
    url = "https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=" + get_access_token()

    payload = json.dumps([
        {
            "image":base_str,
            "image_type": "BASE64",
            "face_field": "spoofing"
        }
    ])
    headers = {
        'Content-Type': 'application/json'
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    # 查看返回的结果
    print(response.text)
    print("="*10)
    # 查看预测分数
    print(response.json()["result"]["face_liveness"])
    if response.json()["error_code"] != 0:
        return 0
    elif response is None:
        # print("Null")
        return 0.0
    else:
        return response.json()["result"]["face_liveness"]

def get_access_token():
    """
    使用 AK,SK 生成鉴权签名(Access Token)
    :return: access_token,或是None(如果错误)
    """
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    # print(str(requests.post(url, params=params).json().get("access_token")))
    return str(requests.post(url, params=params).json().get("access_token"))

if __name__ == '__main__':
    f = open('test.jpg', 'rb')
    image = base64.b64encode(f.read())
    image64 = str(image, 'utf-8')
    api_interface(image64)

        友情提示:如果上述代码运行有问题 ,在保证API Key 与 Secret Key未输错的情况下,很有可能是官方获取token的url地址变了,这就去需要看官去百度API官方查最新的url接口了!

        查看获取token的url的方法:

        (1)公有云服务->API在线调试

         (2)人体分析->获取AccessToken->示例代码->Python;绿色方框就是

        该API推荐的阈值信息:(预测分数高于设定的阈值,判定为真样本;否则,判定为假样本)

        运行代码,对本地的攻击图片进行测试:

单张图像的测试结果

         可以看到,测试图像为真样本的预测分数为“0.000343”,明显低于推荐的阈值“0.30”,因此可判定为攻击样本。


四、以视频流的方式进行实时检测

         以视频流的方式进行实时检测,可以理解为,借助电脑的摄像头捕捉图像,并对捕捉到的图像进行真假的判别,将判别结果以人脸检测框的形式直接呈现出来!

代码逻辑:

        (1)OpenCV调用摄像头捕捉图像;

        (2)提取面部区域;

        (3)以二进制的方式读取面部图像,并编码为base64格式;

        (4)将图像传入自定义的api_interface函数中,对图像进行判别;

        (5)设定阈值,并展示判别结果;

        (6)关闭摄像头;

import numpy as np
import cv2
from sklearn.externals import joblib
import base64
from python_scripts.api import api_interface

def detect_face(img, faceCascade):
    faces = faceCascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5, minSize=(110, 110))
    return faces


if __name__ == "__main__":
    # Open the camera
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("Error opening camera")
        exit(0)

    width = 720
    height = 480

    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)

    # # Initialize face detector
    cascPath = "haarcascade_frontalface_default.xml"
    faceCascade = cv2.CascadeClassifier(cascPath)

    while True:
        ret, img_bgr = cap.read()
        if ret is False:
            print("Error grabbing frame from camera")
            break
        img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
        faces = detect_face(img_gray, faceCascade)
        point = (0,0)
        for i, (x, y, w, h) in enumerate(faces):
            roi = img_bgr[y:y+h, x:x+w]
            cv2.imwrite("roi1.jpg",roi)
            f = open('roi1.jpg', 'rb')
            image = base64.b64encode(f.read())
            base_64 = str(image, 'utf-8')
            if base_64 is not None:
                result = api_interface(base_str=base_64)
                cv2.rectangle(img_bgr, (x, y), (x + w, y + h), (255, 0, 0), 2)
                point = (x, y-5)
                print(result)
                text = "True"
                if result < 0.3:
                    text = "False"
                    font = cv2.FONT_HERSHEY_SIMPLEX
                    cv2.putText(img=img_bgr, text=text, org=point, fontFace=font, fontScale=0.9, color=(0, 0, 255),
                                thickness=2, lineType=cv2.LINE_AA)
                else:
                    font = cv2.FONT_HERSHEY_SIMPLEX
                    cv2.putText(img=img_bgr, text=text, org=point, fontFace=font, fontScale=0.9,
                                color=(0, 255, 0), thickness=2, lineType=cv2.LINE_AA)
                cv2.imshow('img_rgb', img_bgr)
                key = cv2.waitKey(1)
                if key & 0xFF == 27:
                    break
        cv2.imshow('img_rgb', img_bgr)
        key = cv2.waitKey(1)
        if key & 0xFF == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

        用于检测人脸的xml文件在这里:

 https://github.com/ee09115/spoofing_detection/tree/master/python_scripts

        结果展示:

检测结果

         检测时画面很流畅,非常完美!ღ( ´・ᴗ・` )

该博客如果对您有帮助的话,可以点个小心心噢 ღ( ´・ᴗ・` )

猜你喜欢

转载自blog.csdn.net/power_kaikaige/article/details/130422581