基于百度AI开放平台的人脸识别的实现
li12345萌萌 发布于2018-10-30 浏览:1847 回复:1
0
收藏

首先需要申明的是,本文介绍的是使用百度AI开放平台的免费人脸对比功能来实现的人脸识别的搭建,如果您购买了百度AI开放品台的人脸识别产品的话,我想这篇文章就没有什么用处了。此处申明:本文不是百度AI广告文

      具体步骤如下:

前往百度AI开放平台申请开发者账号,百度账号通用,如果没有百度账号的话那就注册一个就可以了
百度AI开放平台:http://ai.baidu.com/
申请免费的人脸对比API就可以了,您也可以查看百度官方提供的技术文档,由于我是Python实现,说实话,百度的文档编写估计很久没有人维护了吧,用的是Python2.7的编码和一些比较老的库了,文档编写也有些让人疑惑的地方。本文采用的是Python3编写的程序。
得到免费的人脸对比API之后,只能对两张人脸图片进行比对,和人脸打卡机有点区别对不对,所以我对这个API进行外围的包装了一下,可以实现基本的人脸打卡机的功能
在程序所在的文件夹建立一个FaceFile的文件夹用来存放已知人脸的图片,图片文件名为图片人脸的真实名称,比如:Mike.jpg,建立一个FaceRecognition的文件夹用来存放OpenCV源文件里面检测人脸的XML文件,具体怎么做可以参考我之前的博客:https://blog.csdn.net/KimLK/article/details/78503442
以下为完整的程序:

#!/usr/bin/env python
# -*- coding:utf-8 -*- 
# Author: K_liu
from aip import AipFace
import base64
import cv2
import os
import numpy as np
import time


dic = {}
def Mactch(img1, img2):
    """ 你的 APPID AK SK """
    APP_ID = 'ID'
    API_KEY = 'AK'
    SECRET_KEY = 'SK'                                                                    
    client = AipFace(APP_ID, API_KEY, SECRET_KEY)

    name = img2[9:-4] # 获取文件名
    dic[name] = 0    # 创建一个容器来存放已知照片的人物名称

    f1 = open(img1, 'rb')   # 打开图片1
    f2 = open(img2, 'rb')
    #参数image:图像base64编码 分别base64编码后的2张图片数据
    img1 = base64.b64encode(f1.read()) # 编码
    img2 = base64.b64encode(f2.read())
    image_1 = str(img1,'utf-8') # 变成字符串
    image_2 = str(img2,'utf-8')

    #数据打包上传到百度AI开放平台
    ptr = client.match([
                          {
                            'image': image_1,
                            'image_type': 'BASE64',
                          },
                          {
                            'image': image_2,
                            'image_type': 'BASE64',
                           }
                        ])
    ptr = ptr['result']
    # print(ptr)
    dic[name] = ptr['score'] #给名称打分并存在容器里面
    sort = list(sorted(dic.items(), key= lambda x:x[1])) #对分数进行排列,从小到大顺序
    print(sort)
    return sort

#已上是将两张图片上传到百度AI开放平台的操作函数,会被下面的主函数调用
#--------------------------------------------------------------------------------------
#以下时主要操作函数,主要运行的是下面的函数
Camera = cv2.VideoCapture(0) # 初始化摄像头

while(True):
    ret, frame = Camera.read()
    face_cascade = cv2.CascadeClassifier('./FaceRecognition/haarcascade_frontalface_default.xml') # 加载人脸检测文件
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 彩色图片变成灰度图片
    faces = face_cascade.detectMultiScale(gray, 1.3, 5) #检测人脸
    for (x, y, w, h) in faces:
        img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)  # 在检测到的人脸上画出方形
    cv2.imshow('faceMe',frame)

    if cv2.waitKey(1) & 0xFF == 27:  # 27为ESC的键盘值
        cv2.imwrite('faceMe.jpg',frame) # 截图保存
        break # 退出循环
Camera.release()
cv2.destroyAllWindows()


time_start = time.time()
try:
    for files in os.walk('FaceFile'):
        data = files[-1] # 取文件
    for i in data:
        tag = 'FaceFile/' + i  # 拼接路径
        result = Mactch('faceMe.jpg',tag)

    print('result:{}'.format(result)) 
    time_end = time.time()
    print('timeCost:{} s'.format(time_end-time_start))
    score = result[-1][1]
    if score <= 50:
        text = 'Name:Stranger'
        img = cv2.imread('faceMe.jpg')
        cv2.putText(img, text, (10, 35), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 255), 2)
        cv2.imshow('FaceMe', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    else:
        text = 'Name:{}'.format(result[-1][0])
        img = cv2.imread('faceMe.jpg')
        cv2.putText(img,text, (10, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 69, 255),2) # 将得到人名印在照片上
        cv2.imshow('FaceMe',img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
except:
    print('internet error')

---------------------
转自作者:胖子大叔

收藏
点赞
0
个赞
共1条回复 最后由我是小丸子774回复于2018-11-05
#2我是小丸子774回复于2018-11-05

0
TOP
切换版块