目录

一、任务概述

二、环境准备

三、实现步骤

3.1 Python推理

3.2 C++推理

3.2.1 环境准备

3.2.2 推理

3.3 Java推理


一、任务概述

最近项目中大量场景需要用到人脸检测和人脸关键点检测技术,因此经过一番查找,将相关资料进行了整理,最终的目的是希望能够将基于深度学习的人脸检测算法落地部署,方便未来直接嵌入到自己的项目中。

本文主要使用于士琪的人脸检测代码来操作,详细的训练(Pytorch版)过程和使用说明请参考官方代码:
libfacedetectionhttps://github.com/ShiqiYu/libfacedetection值得注意的是上述开源项目已经贡献到OpenCV里面了,因此,只需要安装最新的opencv即可方便的使用该人脸检测代码。

本文使用Windows10操作系统进行部署,只使用CPU,不依赖GPU。如果需要使用GPU,需要下载对应支持GPU CUDA版本的opencv。

本文完整代码链接:https://download.csdn.net/download/qianbin3200896/77986050

二、环境准备

  • 安装OpenCV,版本要求 >= 4.5.4
  • 从官网下载已经训练并导出的onnx推理文件,下载地址:libfacedetection.train/yunet.onnx at a61a428929148171b488f024b5d6774f93cdbc13 · ShiqiYu/libfacedetection.train · GitHub

三、实现步骤

3.1 Python推理

首选安装环境包:

pip install numpy
pip install "opencv-python>=4.5.4.58" -i https://mirror.baidu.com/pypi/simple

这里为了加速下载使用了百度镜像源。安装过程中如果opencv一直安装不上,可以尝试先更新下pip软件:

pip install --upgrade pip setuptools wheel

推理代码如下所示:

import numpy as np
import cv2 as cvdef visualize(image, faces, print_flag=False):'''可视化结果'''output = image.copy()for idx, face in enumerate(faces):if print_flag:print('Face {}, top-left coordinates: ({:.0f}, {:.0f}), box width: {:.0f}, box height {:.0f}, score: {:.2f}'.format(idx, face[0], face[1], face[2], face[3], face[-1]))coords = face[:-1].astype(np.int32)# 画人脸框cv.rectangle(output, (coords[0], coords[1]), (coords[0]+coords[2], coords[1]+coords[3]), (0, 255, 0), 2)# 画关键点cv.circle(output, (coords[4], coords[5]), 2, (255, 0, 0), 2)cv.circle(output, (coords[6], coords[7]), 2, (0, 0, 255), 2)cv.circle(output, (coords[8], coords[9]), 2, (0, 255, 0), 2)cv.circle(output, (coords[10], coords[11]), 2, (255, 0, 255), 2)cv.circle(output, (coords[12], coords[13]), 2, (0, 255, 255), 2)# 画置信度cv.putText(output, '{:.4f}'.format(face[-1]), (coords[0], coords[1]+15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))return outputdef main():'''主函数'''# 初始化模型yunet = cv.FaceDetectorYN.create(model='./yunet.onnx',config='',input_size=(320, 320),score_threshold=0.6,nms_threshold=0.3,top_k=5000,backend_id=cv.dnn.DNN_BACKEND_DEFAULT,target_id=cv.dnn.DNN_TARGET_CPU)# 读入图像image = cv.imread('test.jpg')# 重新设置模型输入尺寸yunet.setInputSize((image.shape[1], image.shape[0]))# 执行检测_, faces = yunet.detect(image)# 画检测框和关键点vis_image = visualize(image, faces)# 保存图像cv.imwrite('new.jpg', vis_image)print('完成')if __name__ == '__main__':main()

效果图如下所示:

从效果上来看检测精度是比较高的,满足实用需求。

测试结果如下所示:

图像尺寸 CPU型号 CPU单次推理时间
1280 X 960

CPU型号

Intel(R) Core(TM) CPU i7-6700 @ 3.40GHz

102毫秒

如果想要达到实时性检测要求,把图像分辨率降低1倍,即控制在512x512的尺寸,那么就可以满足该指标。如果想要在嵌入式设备上跑该代码,那还需要再进一步优化。

3.2 C++推理

3.2.1 环境准备

本节使用VS2019在windows平台上通过C++实现人脸检测和人脸关键点检测。

首先从官网下载最新版opencv:Releases - OpenCVhttps://opencv.org/releases/

本文下载使用对应windows版本的opencv4.5.5。

接下来用VS2019创建一个控制台项目:

创建完成后切换成64位Release平台:

然后进行项目配置如下:

(1)属性配置——VC++目录

 (2)属性配置——库目录

(3)链接器——输入

添加lib文件如下:

接下来将opencv对应的dll文件(opencv_world455.dll)和模型文件yunet.onnx拷贝到项目根目录下即可。如下图所示:

3.2.2 推理

完整推理代码如下:

#include <iostream>//导入opencv库
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>//定义命名空间
using namespace std;
using namespace cv;Mat visualize(cv::Mat input, cv::Mat faces, bool print_flag = false, int thickness = 2)
{cv::Mat output = input.clone();for (int i = 0; i < faces.rows; i++){if (print_flag) {cout << "Face " << i<< ", top-left coordinates: (" << faces.at<float>(i, 0) << ", " << faces.at<float>(i, 1) << "), "<< "box width: " << faces.at<float>(i, 2) << ", box height: " << faces.at<float>(i, 3) << ", "<< "score: " << faces.at<float>(i, 14) << "\n";}// 画人脸框cv::rectangle(output, cv::Rect2i(int(faces.at<float>(i, 0)), int(faces.at<float>(i, 1)), int(faces.at<float>(i, 2)), int(faces.at<float>(i, 3))), cv::Scalar(0, 255, 0), thickness);// 画关键点cv::circle(output, cv::Point2i(int(faces.at<float>(i, 4)), int(faces.at<float>(i, 5))), 2, cv::Scalar(255, 0, 0), thickness);cv::circle(output, cv::Point2i(int(faces.at<float>(i, 6)), int(faces.at<float>(i, 7))), 2, cv::Scalar(0, 0, 255), thickness);cv::circle(output, cv::Point2i(int(faces.at<float>(i, 8)), int(faces.at<float>(i, 9))), 2, cv::Scalar(0, 255, 0), thickness);cv::circle(output, cv::Point2i(int(faces.at<float>(i, 10)), int(faces.at<float>(i, 11))), 2, cv::Scalar(255, 0, 255), thickness);cv::circle(output, cv::Point2i(int(faces.at<float>(i, 12)), int(faces.at<float>(i, 13))), 2, cv::Scalar(0, 255, 255), thickness);// 画置信度cv::putText(output, cv::format("%.4f", faces.at<float>(i, 14)), cv::Point2i(int(faces.at<float>(i, 0)), int(faces.at<float>(i, 1)) + 15), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0));}return output;
}int main(int argc, char** argv)
{//参数设置cv::String modelPath = "yunet.onnx";int backendId = 0;  //0: default, 1: Halide, 2: Intel's Inference Engine, 3: OpenCV, 4: VKCOM, 5: CUDAint targetId = 0;  //0: CPU, 1: OpenCL, 2: OpenCL FP16, 3: Myriad, 4: Vulkan, 5: FPGA, 6: CUDA, 7: CUDA FP16, 8: HDDLfloat scoreThreshold = 0.9;float nmsThreshold = 0.3;int topK = 5000;// 初始化人脸检测器FaceDetectorYNcv::Ptr<cv::FaceDetectorYN> detector = cv::FaceDetectorYN::create(modelPath, "", cv::Size(320, 320), scoreThreshold, nmsThreshold, topK, backendId, targetId);// 加载图像cv::Mat image = cv::imread("test.jpg");// 重新设置尺寸detector->setInputSize(image.size());//检测cv::Mat faces;detector->detect(image, faces);//可视化结果cv::Mat vis_image = visualize(image, faces, true);cout << "执行完成.\n";//保存结果cv::imwrite("result.jpg", vis_image);
}

3.3 Java推理

Java推理部分请参考另一篇博文。

基于深度学习的人脸检测和关键点检测推理实践(OpenCV实现,含代码)相关推荐

  1. 第四篇:基于深度学习的人脸特征点检测 - 数据预处理

    在上一篇博文中,我们整理了300-W.LFPW.HELEN.AFW.IBUG和300-VW这6个数据集,使用Python将特征点绘制在对应的图片上,人工验证了数据集的正确性,最终获得了223034个人 ...

  2. 开发基于深度学习的人脸识别【考勤/签到】系统

    开发基于深度学习的人脸识别[考勤/签到]系统 人脸识别介绍 平台环境需求 技术点 系统流程 细节设计 人脸检测 人脸关键点定位 人脸特征提取 模型的训练 模型的部署 MySQL数据库的使用 MFC工程 ...

  3. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  4. 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  5. 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【六】设计人脸识别的识别类...

    前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...

  6. 基于深度学习的人脸识别与管理系统(UI界面增强版,Python代码)

    摘要:人脸检测与识别是机器视觉领域最热门的研究方向之一,本文详细介绍博主自主设计的一款基于深度学习的人脸识别与管理系统.博文给出人脸识别实现原理的同时,给出Python的人脸识别实现代码以及PyQt设 ...

  7. 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

    摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...

  8. 一文掌握基于深度学习的人脸表情识别开发(基于PaddlePaddle)

    目录 一.概述 1.1 表情分类 1.2 表情识别方法 1.2.1 人工特征方法 1.2.2 神经网络方法 1.3 本文实现 二.环境准备 2.1 安装PaddlePaddle 2.2 安装Paddl ...

  9. 基于深度学习的人脸识别综述

    本文转载自 https://xraft.github.io/2018/03/21/FaceRecognition/ (作者:Caleb Ge (葛政)),如有侵权请告知删除. (下文中的"我 ...

最新文章

  1. 【NLP招聘动态】太难啦!面试官盘点NLP近五年招聘动态
  2. C# 获取电脑的网络连接状态
  3. java 链表反转_LeetCode206 实现单链表的反转
  4. 初学者计算机_初学者极客:如何在计算机上重新安装Windows
  5. 大学毕业10年,同学之间的差距是怎样拉开的?答案很现实!
  6. 凌波微步-python小游戏源码下载
  7. 项目管理---(1) 项目管理流程
  8. 【8.12测试】辉夜的见面礼
  9. slice 和splice 的区别 js
  10. android 虚拟经纬度_Android原生方式获取经纬度
  11. 5亿次Web攻击 怎么防住的?
  12. android自动适应横屏,Android屏幕适配(一)--自定义View屏幕适配
  13. ab变频器22b用户手册_AB变频器22B-D4P0N104
  14. 开源时代:刘韧对话任旭东崔宝秋章文嵩蒋涛
  15. walking机器人仿真教程-应用-多点导航结合摄像头实现在线查房
  16. 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
  17. python检测ipa证书过期时间
  18. 我在【MIT科技创新领袖俱乐部】的演讲实录
  19. 掌握这些核心算法,拿不到10+个offer你来找我,我锤飞你个不争气的
  20. VPU?APU?GPU?折腾从AMD-GPU回到Intel核显+OpenCL+Linux环境搭建

热门文章

  1. 扎心!原来在月薪3000和30000的差距竟是这样
  2. EVT/DVT/PVT/MP代表什么阶段
  3. 深圳python如何评价_如何评价shen 语言?
  4. 日本准备推行AI婚配,年轻人会为“爱情算法”买单吗?
  5. 【冷眼看CES2018】AI概念满天飞,大型吹牛集会可休矣
  6. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序:
  7. Spring MVC ModelAndView 简述
  8. 大学生数学竞赛(高数篇)
  9. iapp上传图片到云函数
  10. exynos4412 祼机LED闪灯 - 一闪一闪亮晶晶