调用百度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 0elif response is None:# print("Null")return 0.0else: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_interfacedef detect_face(img, faceCascade):faces = faceCascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5, minSize=(110, 110))return facesif __name__ == "__main__":# Open the cameracap = cv2.VideoCapture(0)if not cap.isOpened():print("Error opening camera")exit(0)width = 720height = 480cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)# # Initialize face detectorcascPath = "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")breakimg_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_SIMPLEXcv2.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_SIMPLEXcv2.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:breakcv2.imshow('img_rgb', img_bgr)key = cv2.waitKey(1)if key & 0xFF == 27:breakcap.release()cv2.destroyAllWindows()
用于检测人脸的xml文件在这里:
https://github.com/ee09115/spoofing_detection/tree/master/python_scripts
结果展示:
检测时画面很流畅,非常完美!ღ( ´・ᴗ・` )
该博客如果对您有帮助的话,可以点个小心心噢 ღ( ´・ᴗ・` )

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
