目录
二、创建应用列表,查看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
结果展示:
检测时画面很流畅,非常完美!ღ( ´・ᴗ・` )
该博客如果对您有帮助的话,可以点个小心心噢 ღ( ´・ᴗ・` )