人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别

简介: 本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。

来源介绍

人脸检测项目libfacedetection是2015年创建的开源项目,算法模型为YuNet,已经持续维护8年至今,在GitHub上已经获得11.7K星。链接

2022-2023年作者对训练部分进行了大幅改进。更加大胆地对算法进行优化迭代,放弃了第二版的Anchor-based机制而采用Anchor-free机制,并对损失函数、正负样本标签匹配等部分进行改进,得到了第三版YuNet。第三版YuNet有两个版本:追求高速度的YuNet-s和追求高精度的YuNet-n。

  • YuNet-s:该版本将参数量降低到54K,降幅约40%。精度略有下降,达到了0.887/0.871/0.768(比上一版85K参数版本好)。在C++库上,作者采用YuNet-s重新编写了新模型的执行代码,推理速度提升约20%。
  • YuNet-n:将参数量降低到76K,在WIDER Face验证集上,Easy/Medium/Hard三个难度分别达到了0.892/0.883/0.811,达到了人脸检测领域内的高水平。

如何使用

如果你想在你的程序中使用YuNet进行人脸检测,有以下几种简单的方式

  • 通过OpenCV库使用。目前OpenCV库已经集成了最新版的YuNet作为人脸检测模块,只要你的环境中安装了OpenCV库,就可以直接调用人脸检测的API。
  • 通过pip安装yuface包。我们团队使用pybind11对C++的人脸检测库进行了封装,并且将其上传到pypi,现在你只需要执行pip install yuface,就可以直接在Python中使用YuNet进行人脸检测。
  • 直接从我们的开源库libfacedetection中克隆代码,然后根据你的需求修改相关的函数调用。我们已经在开源库中提供了预训练好的模型权重文件。
  • 使用onnx推理引擎进行推理。我们已经将YuNet导出为onnx格式,并且使用Numpy库对输入和输出进行了高效的处理。

代码实现

单张图片

import yuface
import cv2

def plt_pic(image, confs, bboxes, landmarks):
    # 定义边界框和关键点的颜色
    bbox_color = (0, 255, 0)  # BGR 格式的颜色,这里是绿色
    landmark_color = (255, 0, 0)  # BGR 格式的颜色,这里是蓝色
    # 绘制边界框和关键点
    for conf, bbox, landmark in zip(confs, bboxes, landmarks):
        # 绘制边界框
        x, y, w, h = bbox
        cv2.rectangle(image, (x, y), (x + w, y + h), bbox_color, 2)

        # 绘制关键点
        for i in range(0, len(landmark), 2):
            x, y = landmark[i], landmark[i + 1]
            cv2.circle(image, (x, y), 3, landmark_color, -1)

        # 绘制置信度文本
        cv2.putText(image, f"Confidence: {conf.item():.2f}", (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                    (0, 255, 0), 2)

if __name__ == '__main__':
    path=(r'1.jpg')
    img=cv2.imread(path)
    confs, bboxes, landmarks =yuface.detect(img)
    print(confs, bboxes, landmarks)
    plt_pic(img, confs, bboxes, landmarks)
    cv2.imshow("img", img)
    cv2.waitKey(0)

摄像头

import yuface
import cv2

def plt_pic(image, confs, bboxes, landmarks):
    # 定义边界框和关键点的颜色
    bbox_color = (0, 255, 0)  # BGR 格式的颜色,这里是绿色
    landmark_color = (255, 0, 0)  # BGR 格式的颜色,这里是蓝色
    # 绘制边界框和关键点
    for conf, bbox, landmark in zip(confs, bboxes, landmarks):
        # 绘制边界框
        x, y, w, h = bbox
        cv2.rectangle(image, (x, y), (x + w, y + h), bbox_color, 2)

        # 绘制关键点
        for i in range(0, len(landmark), 2):
            x, y = landmark[i], landmark[i + 1]
            cv2.circle(image, (x, y), 3, landmark_color, -1)

        # 绘制置信度文本
        cv2.putText(image, f"Confidence: {conf.item():.2f}", (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                    (0, 255, 0), 2)
if __name__ == '__main__':

    Capture = cv2.VideoCapture(0)

    while True:
        ret, frame = Capture.read()
        if not ret:
            print("无法打开摄像头")

        confs, bboxes, landmarks = yuface.detect(frame)
        plt_pic(frame, confs, bboxes, landmarks)

        cv2.imshow("img", frame)
        if cv2.waitKey(1) == 27:
            break

    Capture.release()

限制区域摄像头

import cv2
import yuface
from test import plt_pic

cap = cv2.VideoCapture(0)

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    if not ret:
        print("无法读取摄像头图像")
        break

    # 获取帧的宽度和高度
    frame_height, frame_width, _ = frame.shape

    # 定义ROI的左上角和右下角坐标
    roi_top_left = (0, int(frame_height / 4))  # 左上角坐标
    roi_bottom_right = (frame_width, int(frame_height / 4 * 3))  # 右下角坐标

    # 提取ROI
    roi = frame[roi_top_left[1]:roi_bottom_right[1], roi_top_left[0]:roi_bottom_right[0]]

    # 在帧上绘制ROI区域
    cv2.rectangle(frame, roi_top_left, roi_bottom_right, (0, 255, 0), 2)

    # 将感兴趣区域转换为灰度图像
    confs, bboxes, landmarks = yuface.detect(roi)
    plt_pic(roi, confs, bboxes, landmarks)

    # 在窗口中显示图像
    cv2.imshow("Camera", frame)

    if cv2.waitKey(1) == 27:
        break

cap.release()
cv2.destroyAllWindows()
目录
相关文章
|
2月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
53 0
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
1月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构的基本概念;算法的基本概念、特性以及时间复杂度、空间复杂度等举例说明;【含常见的报错问题及其对应的解决方法】
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
80 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)