人脸检索 M:N(视频,摄像头),调用百度API

news2024/11/30 6:50:30

目录

创建百度智能云账号

代码部分:


创建百度智能云账号

网址:

 百度智能云-云智一体深入产业

点击导航栏中的产品,再选择人脸与人体

再选择人脸搜索

进入后,可以先去领取免费资源,如果不领取,后面是无法调用api的,建议是把所有的免费资源都领取,我是全部都领取了。

然后就是创建应用,按照要求填写就好。

创建成功后,可以在应用列表看到自己创建好的应用。下图用红色方框圈起来的在后续代码中需要填写。

接着我们可以创建我们的可视化人脸库。

按照要求创建即可,下图是我已经创建成功的。

再点进自己创建好的人脸库,创建分组,这里我已经创建好了四个分组,接着就是进入分组,创建用户,添加图片

这一切完成后,就有了自己的人像数据库。

代码部分:

完整代码:

import cv2
from aip import AipFace
from io import BytesIO
import base64
from PIL import Image,ImageDraw, ImageFont
import threading
import numpy as np
import imutils
import time

# 在图像上绘制文本
def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
    if (isinstance(img, np.ndarray)):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(img)
    # 字体的格式
    fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8")
    # 绘制文本
    draw.text((left, top), text, textColor, font=fontStyle)
    # 转换回OpenCV格式
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

# 将图像格式转换为base64格式
def frame2base64(frame):
    img = Image.fromarray(frame)  # 将每一帧转为Image
    output_buffer = BytesIO()  # 创建一个BytesIO
    img.save(output_buffer, format='JPEG')  # 写入output_buffer
    byte_data = output_buffer.getvalue()  # 在内存中读取
    base64_data = base64.b64encode(byte_data)  # 转为BASE64
    return base64_data  # 转码成功 返回base64编码

def process(image,ls):
    """ 调用人脸检测 """
    """ 如果有可选参数 """
    # 换成自己的百度appid
    APP_ID = ''
    API_KEY = ''
    SECRET_KEY = ''
    groupIdList = ''
    imageType = 'BASE64'
    base64 = frame2base64(image)
    base64 = str(base64,'UTF-8')
    options = {}
    options["max_face_num"] = 10
    options["face_type"] = "LIVE"
    options["match_threshold"] = 0
    #options["liveness_control"] = "NORMAL"
    client = AipFace(APP_ID, API_KEY, SECRET_KEY)
    """ 如果有可选参数 """
    options = {}
    options["max_face_num"] = 10
    options["match_threshold"] = 0
    options["quality_control"] = "LOW"
    options["liveness_control"] = "LOW"
    options["max_user_num"] = 7

    start3 = time.time()
    json1 = client.multiSearch(base64, imageType, groupIdList, options)
    print("*******:", time.time() - start3)
    print("json1:", json1)
    if json1['error_msg'] == 'SUCCESS':
        face_num = json1['result']['face_num']
        for i in range(face_num):
            x = max(int(json1['result']['face_list'][i]['location']['left']), 0)
            y = max(int(json1['result']['face_list'][i]['location']['top']), 0)
            width = int(json1['result']['face_list'][i]['location']['width'])
            height = int(json1['result']['face_list'][i]['location']['height'])
            cv2.rectangle(image, (x, y), (x + width, y + height), (0, 0, 255), 2)
            print("$$$$$$$$$$$$$$$$$$$$$$$$$")
            print("json1:", json1)
            if json1['result']['face_list'][i]['user_list'][0]['score']>70:
                print(json1['result']['face_list'][i]['user_list'][0]['user_id'])
                image = cv2ImgAddText(image, json1['result']['face_list'][i]['user_list'][0]['user_id'],
                                      max(x - 20, 0), max(y - 20, 0), (255, 0, 0), 60)
            else:
                image = cv2ImgAddText(image, "访客",
                                      max(x - 20, 0), max(y - 20, 0), (255, 0, 0), 60)
        ls.append(image)
    else:
        print("************************")
        print("没有检测到人脸:", json1)


def main():
    # 使用摄像头检测
    # video_capture = cv2.VideoCapture(0)
    # 使用本地视频文件检测
    video_capture = cv2.VideoCapture('test6.mp4')
    fps_time =0
    f = 0
    start = time.time()
    while True:
        f += 1
        ls = []
        if f == 30:
            print("时间到:", time.time()-start)
            break
        ret, frame = video_capture.read()
        # t = threading.Thread(target=process, args=(frame, ls))  # 使用线程
        # t.start()
        # t.join()
        process(frame, ls)
        frame = ls[0] if ls else frame
        frame = imutils.resize(frame, width=400)
        frame = cv2.putText(frame, '%d, FPS: %f' % (f, 1.0 / (time.time() - fps_time)),
                            (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
        fps_time = time.time()
        cv2.imshow('wx', frame)
        if cv2.waitKey(1) & 0xFF == ord('Q'):
            cv2.destroyAllWindows()
            video_capture.release()
            break
if __name__ == "__main__":
    main()

后续写了一点 注册,更新人脸数据库的代码:

from aip import AipFace
from PIL import Image
from io import BytesIO
import base64

def frame2base64(image_path):
    # img = Image.fromarray(frame)  # 将每一帧转为Image
    img = Image.open(image_path)
    output_buffer = BytesIO()  # 创建一个BytesIO
    img.save(output_buffer, format='JPEG')  # 写入output_buffer
    byte_data = output_buffer.getvalue()  # 在内存中读取
    base64_data = base64.b64encode(byte_data)  # 转为BASE64
    return base64_data  # 转码成功 返回base64编码

def user_register(image,groupId, userId):
    """ 你的 APPID AK SK """
    APP_ID = ''
    API_KEY = ''
    SECRET_KEY = ''
    client = AipFace(APP_ID, API_KEY, SECRET_KEY)
    # 将图片转换为 base64 类型
    image = frame2base64(image)
    image = str(image, 'UTF-8')

    # 图片类型
    imageType = "BASE64"
    # 分组
    groupId = groupId
    # 用户id
    userId = userId

    """ 调用人脸注册 """
    json1 = client.addUser(image, imageType, groupId, userId)
    while json1['error_msg'] == 'Open api qps request limit reached':
        json1 = client.addUser(image, imageType, groupId, userId)
        print("jason1:", json1)
    # """ 如果有可选参数 """
    # options = {}
    # options["user_info"] = "user's info"
    # options["quality_control"] = "NORMAL"
    # options["liveness_control"] = "LOW"
    # options["action_type"] = "REPLACE"
    #
    # """ 带参数调用人脸注册 """
    # client.addUser(image, imageType, groupId, userId, options)

def user_update(image, groupId,userId):

    """ 你的 APPID AK SK """
    APP_ID = ''
    API_KEY = ''
    SECRET_KEY = ''
    client = AipFace(APP_ID, API_KEY, SECRET_KEY)

    # 将图片转换为 base64 类型
    image = frame2base64(image)
    image = str(image, 'UTF-8')

    imageType = "BASE64"

    # 分组Id
    groupId = groupId
    # 用户Id
    userId = userId

    """ 调用人脸更新 """
    jason2 = client.updateUser(image, imageType, groupId, userId)
    print("jason2:", jason2)
    # """ 如果有可选参数 """
    # options = {}
    # options["user_info"] = "user's info"
    # options["quality_control"] = "NORMAL"
    # options["liveness_control"] = "LOW"
    # options["action_type"] = "REPLACE"
    #
    # """ 带参数调用人脸更新 """
    # client.updateUser(image, imageType, groupId, userId, options)


if __name__ == "__main__":
    image = "L1.JPG"
    groupId = "group"
    userId = "2020"
    user_register(image, groupId, userId)

百度也提供了 详细的 Python-SDK 供大家学习使用。

创作不易,求点赞,求收藏!,如有问题欢迎留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1159607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS Sourcetree 选择文件比较工具 Kaleidoscope

Sourcetree 选择文件比较工具 Kaleidoscope Kaleidoscope 使用的命令行工具是 ksdiff。Sourcetree 集成 Kaleidoscope之前,必须先安装 ksdiff。 Kaleidoscope 使用的命令行工具是 ksdiff。Sourcetree 集成 Kaleidoscope之前,必须先安装 ksdiff。 打开Ka…

5.3 用户定义的完整性

思维导图: 5.3 用户定义的完整性 用户定义的完整性是确保数据库中的数据满足特定应用的语义要求。这是通过关系数据库管理系统(RDBMS)中的内置机制来完成的,不需要依赖应用程序来执行。 5.3.1 属性上的约束条件 1. 定义属性上的约束条件 当在CREATE T…

架构风格-架构师(六十六)

管道-过滤器和仓库 数据处理方式: 管道过滤器是 数据驱动机制,处理流程事前确定,交互差。 仓库是通过仓库中间件交互,交互性强,灵活组装 系统可扩展性: 管道过滤器是数和处理在一起,需要新增…

金Gien乐道 | 10月热点回顾

收获之秋,中电金信Q4开篇捷报不断 Q4开篇,中电金信迎来多个捷报。公司与青岛财通集团联合打造的核心业务系统(一体化业务平台)一期项目顺利投产上线并平稳运行;中标华南某全国性股份制商业银行新一代云原生分布式核心系…

系列四、全局配置文件mybatis-config.xml

一、全局配置文件中的属性 mybatis全局配置中的文件非常多,主要有如下几个: properties(属性)settings(全局配置参数)typeAliases(类型别名)typeHandlers(类型处理器&am…

prompt工程

微信公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、prompt基础 提示包括传递给语言模型的指令和语境,以实现预期的任务。提示工程是开发和优化提示的实践,以便在各种应用…

YOLO目标检测——安全帽佩戴检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:安全帽佩戴检测数据集可以用于实时检测工作人员是否按照要求佩戴了安全帽,以保障他们的安全数据集说明:安全帽佩戴检测数据集,真实场景的高质量图片数据,数据场景丰富,图片分为带头盔和没带头…

贪吃蛇代码实现与剖析(C语言)

贪吃蛇代码实现与剖析[C语言] 1.温馨提示2.最终实现版本的样子1.游戏开始-欢迎界面2.游戏运行界面3.游戏结束界面4.选择是否继续玩1.选择继续 2.选择退出游戏 3.完整代码一.Win32相关API的介绍1.控制台程序1.什么是控制台程序2.命令提示符中设置控制台窗口的大小3.控制台行和列…

【Linux】Nignx及负载均衡动静分离

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯&#x1f3a…

数据标准是什么?如何建立企业的数据标准?

2023年10月25日国家数据局正式揭牌,由国家发展和改革委员会管理。国家数据局的主要职责是负责协调推进数据基础制度建设,统筹数据资源整合共享和开发利用,统筹推进数字中国、数字经济、数字社会规划和建设等。国家越来越重视数据资源的价值&a…

Explaining and harnessing adversarial examples

Explaining and harnessing adversarial examples----《解释和利用对抗样本》 背景: 早期的研究工作认为神经网络容易受到对抗样本误导是由于其非线性特征和过拟合。 创新点: 该论文作者认为神经网络易受对抗性扰动影响的主要原因是它的线性本质&#xf…

第五章 I/O管理 十、磁盘调度算法(FCFS、SSTF、SCAN、C-SCAN、C-LOOK)

目录 一、概括 二、一次磁盘读/写操作需要的时间 1、寻找时间(寻道时间): 2、延迟时间: 3、传输时间(读磁盘的时间) 三、先来先服务算法(FCFS) 1、定义: 2、例子&#xff1…

Qwt QwtPolarPlot类使用

1.概述 QwtPolarPlot是Qwt库中用于绘制极坐标图的类。它继承自QwtPolarItemDict和QFrame类,并且可以作为QwtPlot控件的一部分使用。 以下是类的继承关系图: 2.常用方法 设置标签: void setTitle (const QString &)void setTitle (con…

降低毕业论文写作压力的终极指南

亲爱的同学们,时光荏苒,转眼间你们即将踏入毕业生的行列。毕业论文作为本科和研究生阶段的重要任务,不仅是对所学知识的综合运用,更是一次对自己学术能力和专业素养的全面考验。然而,论文写作常常伴随着压力和焦虑&…

YOLOv5:修改backbone为MobileOne

YOLOv5:修改backbone为MobileOne 前言前提条件相关介绍MobileOneYOLOv5修改backbone为MobileOne修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作,方便自己查阅。由于本人水平有限,难免出现错漏&#xf…

前端基础之JavaScript

JavaScript是一种能够在网页上添加交互效果的脚本语言,也被称为客户端语言。它可以在网页中操作HTML元素、改变CSS样式,以及处理用户的交互事件等。 以下是JavaScript的常见基础知识点: 变量和数据类型:JavaScript中的变量可以存…

YOLOv7优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLO…

【实现多个接口的使用】

文章目录 前言实现多个接口接口间的继承接口使用实例给对象数组排序创建一个比较器 总结 前言 实现多个接口 Java中不支持多继承,但是一个类可以实现多个接口 下面是自己反复理了很久才敲出来的,涉及到之前学的很多知识点 如果哪看不懂,真…

基于向量数据库的文档检索实战

推荐:用 NSDT编辑器 快速搭建可编程3D场景 在过去的六个月里,我一直在 A 系列初创公司 Voxel51 工作,该公司是开源计算机视觉工具包 FiftyOne 的创建者。 作为一名机器学习工程师和开发人员布道者,我的工作是倾听我们的开源社区的…

LabVIEW开发双目立体系统猪重估算

LabVIEW开发双目立体系统猪重估算 动物的活重是各种研究中的重要参考,例如动物生长,饲料转化率,健康状况和疾病发生。生长中的动物的体重为保持它们处于适当的营养和环境水平提供了一个有价值的参数或指标。动物的利润通常与收入和成本之间的…