查看: 811|回复: 3

[项目分享] 虚谷号体验(六) 人工智能案例体验:人脸识别

[复制链接]
本帖最后由 szjuliet 于 2019-8-19 10:38 编辑

虚谷号体验(一)开箱及基本功能体验
虚谷号体验(二) 安装远程桌面及蓝牙设备
虚谷号体验(三) 主机模式体验
虚谷号体验(四)人工智能案例体验:文字识别
虚谷号体验(五)人工智能案例体验:动植物识别
虚谷号体验(六)  人工智能案例体验:人脸识别

摄像头获取图像来识别人脸,并输出人脸的属性:年龄、性别、表情、是否佩戴眼镜、情绪、人种、相貌、脸型等。

1.设备连接:
虚谷号连接高清电视、摄像头,通电:
04connect.png

2. 百度云中创建应用(如使用体验文档的KEY,则可以跳过这步)

  • 登录百度云,选择需要使用的服务

baiduyun00.png

  • 点击创建应用,输入相应的信息(应用名称、应用类型、应用描述等),拖到窗口最底部,点击“立即创建”

baiduyun02.png
baiduyun03.png

  • 创建成功后记录下应用的API_KEY和SECRET_KEY,并填写到第3步的程序中

baiduyun01.png


3. 修改程序:
虚谷号U盘模式\vvBoard\Python\01.example\03.人工智能 目录下复制程序face_info.py到电脑上进行编辑:
[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 18 13:02:42 2018

@author: james
"""

import cv2
import requests
import json
import threading
import time
import base64
import numpy as np
import xugu

# servo=xugu.Servo(12)
# access_token="24.42017d996da0a23f3c4567b8dfd16a21.2592000.1550220300.282335-14563606"
access_token =""
# API_KEY="ijoqlG1PdSsdxtXc7DNn68jh"
API_KEY = "" # 输入自己的API_KEY
# SECRET_KEY = "Erpr184wiWCG7ZZglFKKG3Zm3up6xUmi"
SECRET_KEY = "" # 输入自己的SECRET_KEY
face_num = 0
frame=None
now_time=0
face_info={}

def cvimg_to_b64(img):
    try:
        image = cv2.imencode('.jpg', img)[1]
        base64_data = str(base64.b64encode(image))[2:-1]
        return base64_data
    except Exception as e:
        return "error"


def face_search(img64):
    url="https://aip.baidubce.com/rest/2.0/face/v3/search"
    url=url+"?access_token="+access_token
    data={
            "image":img64,
            "image_type":"BASE64",
            "group_id_list":"test_group"}
    try:
        response=requests.post(url,files=None,data=data)
        res_text=response.text
        res_json=json.loads(res_text)
        return res_json
    except Exception:
        return "error"

def get_ai_access_token():
    url="https://aip.baidubce.com/oauth/2.0/token?grant_type=" +\
    "client_credentials&client_id=%s&client_secret=%s" %(API_KEY,SECRET_KEY)
    try:
        response=requests.get(url)
        res_text=response.text
        res_json=json.loads(res_text)
        return str(res_json["access_token"])
    except Exception:
        return "error"

def get_face_info(img64):
    url="https://aip.baidubce.com/rest/2.0/face/v3/detect"
    url = url + "?access_token=" + access_token
    data = {"face_field": "age,beauty,emotion,face_shape,gender,glasses,race,qualities,expression",
            "image_type": "BASE64", "image": img64, "max_face_num": 5}
    try:
        response = requests.post(url,data=data)
        res_text=response.text
        res_json=json.loads(res_text)
        return res_json
    except Exception:
        return "error"
    
def post_request(frame,face_num,nt):
    global face_info
    if(face_num>0) and (time.time()-nt>3):
        global now_time
        now_time=time.time()
        img64=cvimg_to_b64(frame)
        res=get_face_info(img64)
        print(res)
        try:
            status=res['error_msg']
        except Exception:
            status=""
        if(status=="SUCCESS"):
            face_info['gender']= res['result']['face_list'][0]['gender']['type']
            face_info['age']=res['result']['face_list'][0]['age']
            face_info['beauty']=res['result']['face_list'][0]['beauty']
            face_info['emotion'] = res['result']['face_list'][0]['emotion']['type']
            face_info['faceshape'] = res['result']['face_list'][0]['face_shape']['type']
            face_info['glasses'] = res['result']['face_list'][0]['glasses']['type']
            face_info['expression'] = res['result']['face_list'][0]['expression']['type']
            face_info['race'] = res['result']['face_list'][0]['race']['type']
            # face_info['qualities'] = res['result']['face_list'][0]['qualities']
            return
        else:
            face_info={}
            
def faceDetect(img,face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')):
    size=img.shape[:2]
    divisor = 8
    h,w=size
    minSize=(w//divisor,h//divisor)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.2, 1,cv2.CASCADE_SCALE_IMAGE,minSize)
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    return img,len(faces)


def put_Text(cvimg,text,location,size=1):
    cvimg=cv2.putText(cvimg, text, location,cv2.FONT_HERSHEY_SIMPLEX, size, (51, 102, 255), 3)
    return cvimg


def check_token():
    print(int(time.time()) - 1547628298)
    if int(time.time()) - 1547628298 >= 2592000:
        global access_token
        token = get_ai_access_token()
        if token != "error":
            access_token = get_ai_access_token()


def main():
    check_token()
    cap = cv2.VideoCapture(0)
    global now_time
    now_time=time.time()
    while(True):
        global face_info
        global servo
        ret, frame = cap.read()
        if ret == True:
            frame1,face_num = faceDetect(frame)
            frame1=cv2.flip(frame1,1,dst=None)
            frame1=cv2.resize(frame1,(1280,800),interpolation=cv2.INTER_LINEAR)
            t = threading.Thread(target=post_request, args=(
                frame, face_num, now_time,), name='POST_REQUEST')
            t.start()
            print(face_info)
            if face_info=={} :
                frame1=put_Text(frame1,"Waiting...",(50,50))
            else:
                try:
                    frame1=put_Text(frame1,str(int(face_info['age'])),(300,50))
                    frame1=put_Text(frame1,str(face_info['gender']),(300,120))
                    frame1=put_Text(frame1,str(int(face_info['beauty'])),(300,190))
                    frame1=put_Text(frame1,"Age:",(50,50))
                    frame1=put_Text(frame1,"Gender:",(50,120))
                    frame1=put_Text(frame1,"Beauty:",(50,190))
                    frame1 = put_Text(frame1, str((face_info['expression'])), (300, 260))
                    frame1 = put_Text(frame1, str(face_info['faceshape']), (300, 330))
                    frame1 = put_Text(frame1, str((face_info['glasses'])), (300, 400))
                    frame1 = put_Text(frame1, "Expression:", (50, 260))
                    frame1 = put_Text(frame1, "Faceshape:", (50, 330))
                    frame1 = put_Text(frame1, "Glasses:", (50, 400))
                    frame1 = put_Text(frame1, str((face_info['emotion'])), (300, 470))
                    frame1 = put_Text(frame1, str(face_info['race']), (300, 540))
                    # frame1 = put_Text(frame1, str(int(face_info['qualities'])), (300, 610))
                    frame1 = put_Text(frame1, "Emotion:", (50, 470))
                    frame1 = put_Text(frame1, "Race:", (50, 540))
                    # frame1 = put_Text(frame1, "Qualities:", (50, 610))
                    # servo.angle(int(face_info['beauty']*3))
                except Exception:
                    pass
                
            cv2.imshow('Magic Image',frame1)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()

main()


4. 将程序face_info上传到虚谷号桌面,同时将/home/scope/vvBoard/Python/01.example/03.人工智能/人脸识别目录下的依赖包也拖动到桌面
file.png


5. 在文件管理器中进入Desktop目录,运行LX终端
28LX1.png

6. 输入命令python3 face_info.py,在当前目录下运行文字识别脚本

201908131339335891.png

7. 很快会新建一个窗口,标题为Magic Image,用于显示采集的摄像头图像。
29MagicImage.png

8. 输出结果
face7.jpg
face6.jpg
face5.jpg
face4.jpg
(不清楚为什么最后两行Emotion和Race为什么没有显示出来,检查了代码没发现问题)

  • 人脸属性返回值:
baiduyun_face.png

参考资料:
https://ai.baidu.com/download?sdkId=3,SDK下载地址

http://ai.baidu.com/docs#/Face-Python-SDK/top,SDK使用说明



至此,体验文档里要求的内容已经全部完成。

在体验过程中对虚谷好的好感和认同度不断增加。这几天也把虚谷号公众号里几篇访谈文章认认真真的读完,觉得谢作如、管雪枫等一大批中国创客教育的先行者做了许多了不起事情。由衷的感动,钦佩!!








face3.png

kylinpoet  高级技师

发表于 2019-8-17 23:35:20

不能显示的原因是:返回的不是键值:qualities,程序运行到这里直接 异常处理掉,跳过后面的文字显示了。
回复 支持 反对

使用道具 举报

szjuliet  版主
 楼主|

发表于 2019-8-19 10:37:02

kylinpoet 发表于 2019-8-17 23:35
不能显示的原因是:返回的不是键值:qualities,程序运行到这里直接 异常处理掉,跳过后面的文字显示了。 ...

谢谢,原来如此~~
重新修改了程序,到时候再试一下。
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2019-9-15 07:34:03

有意思
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail