人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)
目录
[人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)](#人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测))
[1. 前言](#1. 前言)
[2. 人脸检测和人体检测检测模型](#2. 人脸检测和人体检测检测模型)
[3. 人脸检测和人体检测C++端上部署](#3. 人脸检测和人体检测C++端上部署)
(2)配置开发环境(OpenCV+OpenCL+base-utils+MNN)
[4. 人脸检测和人体检测效果C++版本](#4. 人脸检测和人体检测效果C++版本)
[5. 人脸检测和人体检测效果Android版本](#5. 人脸检测和人体检测效果Android版本)
[6. 项目源码下载](#6. 项目源码下载)
1. 前言
这是项目《人脸检测和行人检测 》系列之《C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测 》;本篇主要分享将Python训练后的YOLOv8 YOLO11 YOLO26的模型转写成C/C++代码。我们将开发一个简易的、可实时运行的人脸检测和人体检测(行人检测) C/C++ Demo。C/C ++版本的人脸检测和行人检测模型,采用MNN推理,支持CPU和GPU加速,在GPU(OpenCL)加速下,可以达到实时的检测效果,基本可以满足大多数业务场景的性能需求。
先展示一下人脸检测和行人检测的效果:


【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/164629582
更多项目《人脸检测和行人检测》系列文章请参考:
- 人脸检测和人体检测(行人检测)1:人脸检测和人体检测数据集(含下载链接)
- 人脸检测和行人检测2:YOLOv8 YOLO11 YOLO26 实现人脸检测和行人检测(含数据集和训练代码) https://blog.csdn.net/guyuealian/article/details/164620332
- 人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26 人脸检测和人体检测(含源码,可实时检测) https://blog.csdn.net/guyuealian/article/details/164629582
- 人脸检测和行人检测4:Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测) https://blog.csdn.net/guyuealian/article/details/164629596

如果需要进行人像分割,实现一键抠图效果,请参考文章:《一键抠图Portrait Matting人像抠图 (C++和Android源码)》
|-----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
|
|
2. 人脸检测和人体检测检测模型
(1)模型训练
人脸检测和人体检测 训练过程,请参考:《人脸检测和行人检测2:YOLOv8 YOLO11 YOLO26 实现人脸检测和行人检测(含数据集和训练代码)》https://blog.csdn.net/guyuealian/article/details/164620332
下表格给YOLOv8n / YOLO11n / YOLO26n计算量和参数量以及其人脸检测和行人检测精度:
|-------------|----------------|---------------|------------|-------------|------------------|
| 模型 | input-size | params(M) | GFLOPs | mAP_0.5 | mAP_0.5:0.95 |
| YOLOv8n | 416×416 | 3.15M | 3.7 | 0.97046 | 0.79315 |
| YOLO11n | 416×416 | 2.62M | 2.7 | 0.97001 | 0.79531 |
| YOLO26n | 416×416 | 2.41M | 2.3 | 0.97002 | 0.79009 |
(2)将Pytorch模型转换ONNX和MNN模型
训练好模型后,你需要将Pytorch模型转换为ONNX和MNN模型,转换脚本工具export.py:
需要安装依赖库: pip install onnx onnxsim onnxruntime mnn
python
# -*- coding: utf-8 -*-
import os
import argparse
import numpy as np
from ultralytics import YOLO
def export_model(weights, format="mnn", imgsz=640, dynamic=False, half=False, int8=False):
"""
https://docs.ultralytics.com/modes/export/
:param weights: model file
:param format: onnx,ncnn,mnn,rknn
:param imgsz: input image size
:param dynamic: use dynamic model
:param half: use half model
:param int8: use int8 model
:return:
"""
model = YOLO(weights)
kwargs = {"dynamic": dynamic, "half": half, "int8": int8, "name": "", "imgsz": imgsz}
if format in ['mnn', 'rknn']: kwargs["dynamic"] = False # argument 'dynamic' is not supported for format='mnn'
if format in ['rknn']:
file = model.model_name
dirn, name = os.path.dirname(file), os.path.basename(file).split('.')[0]
os.makedirs(os.path.join(f"{name}_rknn_model", dirn), exist_ok=True) # 创建rknn模型目录
# TODO RKNN默认float16,所以half=False,可支持int8,但validate_args会报错,需要修改源码不检查
kwargs.update(half=False, int8=True, name="rk3588", source="./images.txt")
print("export format :{}, kwargs:{}".format(format, kwargs))
file = model.export(format=format, simplify=True, opset=15, **kwargs)
print("export file :{}".format(file))
return file
def parse_opt():
weights = "output/face-person-detect/yolo11n-416/weights/best.pt"
# weights = "output/face-person-detect/yolo26n-416/weights/best.pt"
# weights = "output/face-person-detect/yolov8n-416/weights/best.pt"
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default=weights, help='model file')
parser.add_argument('--imgsz', type=int, default=416, help='input image size')
parser.add_argument('--format', type=str, default="mnn", help='save result image')
opt = parser.parse_args()
return opt
if __name__ == "__main__":
"""
# TODO 转换为onnx模型
python libs/export.py --weights "data/model/pretrained/yolo11n.pt" --imgsz 416 --format onnx
# TODO 转换为mnn模型
python libs/export.py --weights "data/model/pretrained/yolo11n.pt" --imgsz 416 --format mnn
"""
opt = parse_opt()
export_model(opt.weights, format=opt.format, imgsz=opt.imgsz)
在终端运行执行命令,转换ONNX和MNN模型
bash
# TODO 转换为onnx模型
python libs/export.py --weights "data/model/pretrained/yolo11n.pt" --imgsz 416 --format onnx
# TODO 转换为mnn模型
python libs/export.py --weights "data/model/pretrained/yolo11n.pt" --imgsz 416 --format mnn
3. 人脸检测和人体检测C++端上部署
本项目采用 CLion 作为集成开发环境(IDE)。在依赖库方面,OpenCV 为必须安装的核心依赖,用于图像处理基础功能;base-utils 与 MNN 推理框架已集成于项目内部,开发者无需额外配置;OpenCL 作为可选组件,主要用于在支持该标准的设备上对模型推理进行硬件加速,用户可根据实际硬件情况选择性启用。
(1)项目结构

(2)配置开发环境(OpenCV+OpenCL+base-utils+MNN)
项目模型推理采用MNN部署框架(支持多线程CPU和GPU加速推理);图像处理采用OpenCV库,模型加速采用OpenCL/Vulkan,在普通电脑设备即可达到实时处理。
- 项目仅在Ubuntu20.04进行测试,Windows系统下请自行配置和编译
- 如果你想在这个 C++ Demo部署你自己训练的人脸检测和人体检测 模型,你可以将训练好的Pytorch模型转换ONNX ,再转换成MNN 模型,然后把原始的模型替换成你自己的MNN模型即可。
- 安装OpenCV:图像处理
图像处理(如读取图片,图像裁剪等)都需要使用OpenCV库进行处理
安装教程:Ubuntu20.04安装opencv和opencv_contrib
OpenCV库使用opencv-4.3.0版本,opencv_contrib库暂时未使用,可不安装
- 安装OpenCL:模型加速
安装教程:Ubuntu20.04安装OpenCL
OpenCL和Vulkan用于模型GPU推理加速,若不使用GPU,纯C++推理模型,速度会比较慢。OpenCL支持性更好,推进使用OpenCL。
- 安装Vulkan :模型加速
安装教程:Ubuntu20.04安装Vulkan
OpenCL和Vulkan用于模型GPU推理加速,若不使用GPU,纯C++推理模型,速度会比较慢。OpenCL支持性更好,推进使用OpenCL。
- base-utils:C++库
GitHub:https://github.com/PanJinquan/base-utils (无需安装,项目已经配置了)
base_utils是个人开发常用的C++库,集成了C/C++ OpenCV等常用的算法
- MNN:模型推理
GitHub:https://github.com/alibaba/MNN (无需安装,项目已经配置了)
MNN (Mobile Neural Network) 是由阿里巴巴集团开源的一个轻量级、高性能的深度学习推理引擎。它专为移动端、嵌入式设备以及边缘计算场景设计,支持OpenCL/Vulkan,同时也支持服务器端的高并发推理。自2019年开源以来,MNN 已经成为业界主流的端侧推理框架之一,广泛应用于淘宝、天猫、优酷、钉钉等阿里系App中,覆盖了搜索推荐、图像识别、OCR、AR特效、语音处理等数百个业务场景。
(3)CMake配置
具体查看项目配套的CMakeLists.txt文件,主要配置了OpenCV+base-utils+MNN这四个库,Windows系统下请自行配置和编译。
(4)main源码
主程序src/main.cpp,提供了人脸检测和人体检测的Demo,其中test_image_file()用于测试图片,test_video_file()用于测试视频文件,test_usb_camera()用于测试USB摄像头,test_performance用于测试性能。
cpp
//
// Created by Pan on 2024/6/24.
//
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <vector>
#include <string>
#include "yolo.h"
#include "Types.h"
#include "file_utils.h"
#include "image_utils.h"
using namespace dl;
using namespace vision;
using namespace std;
DeviceType device = CPU; // 使用CPU运行
// DeviceType device = OPENCL; // 使用OPENCL运行
// DeviceType device = VULKAN; // 使用VULKAN运行
const int max_nums = -1; // 最大检测数量,-1表示不限制
const int numThread = 4; // 线程数
const float scoreThresh = 0.25f; // 检测阈值
const float iouThresh = 0.45f; // IOU阈值
// TODO YOLO26 模型
string model_file = "../data/model/yolo26n-416-face-person.mnn";
YOLOParam param = YOLO26_FACE_PERSON416;
// TODO YOLO11 模型
// string model_file = "../data/model/yolo11n-416-face-person.mnn";
// YOLOParam param = YOLO11_FACE_PERSON416;
// TODO YOLOv8 模型
// string model_file = "../data/model/yolov8n-416-face-person.mnn";
// YOLOParam param = YOLOv8_FACE_PERSON416;
YOLO *detector = new YOLO(model_file, param, numThread, device, max_nums);
/***
* 测试图片文件
* @return
*/
int test_image_file() {
// 测试图片
string image_dir = "../data/test_image/coco";
vector<string> image_list = get_files_list(image_dir);
for (string image_path: image_list) {
cv::Mat frame = cv::imread(image_path);
if (frame.empty()) continue;
FrameInfo resultInfo;
// 开始检测
detector->detect(frame, resultInfo, scoreThresh, iouThresh);
// 可视化代码
detector->drawResult(frame, resultInfo, true, 0, true);
}
printf("FINISHED.\n");
return 0;
}
/***
* 测试视频文件
* @return
*/
int test_video_file() {
string video_file = "../data/video/video1.mp4"; //视频文件
cv::VideoCapture cap;
bool ret = get_video_capture(video_file, cap);
cv::Mat frame;
while (ret) {
cap >> frame;
if (frame.empty()) break;
FrameInfo resultInfo;
// 开始检测
detector->detect(frame, resultInfo, scoreThresh, iouThresh);
// 可视化代码
detector->drawResult(frame, resultInfo, true, 10, true);
}
cap.release();
printf("FINISHED.\n");
return 0;
}
/***
* 测试USB摄像头
* @return
*/
int test_usb_camera() {
int camera = 0; //摄像头USB ID号(请修改成自己摄像头USB ID号)
cv::VideoCapture cap;
bool ret = get_video_capture(camera, cap);
cv::Mat frame;
while (ret) {
cap >> frame;
if (frame.empty()) break;
FrameInfo resultInfo;
// 开始检测
detector->detect(frame, resultInfo, scoreThresh, iouThresh);
// 可视化代码
detector->drawResult(frame, resultInfo, true, 10, true);
}
cap.release();
printf("FINISHED.\n");
return 0;
}
/***
* 测试性能
* @return
*/
int test_performance() {
// 测试图片
string image_dir = "../data/test_image/coco";
string image_path = "../data/test_image/coco/bus.jpg";
vector<string> image_list = get_files_list(image_dir);
cv::Mat frame = cv::imread(image_path);
FrameInfo resultInfo;
detector->performance(frame, resultInfo, scoreThresh, iouThresh, 50);
detector->drawResult(frame, resultInfo, true, 0, true);
printf("FINISHED.\n");
return 0;
}
int main() {
test_image_file();
test_video_file();
test_usb_camera();
test_performance();
return 0;
}
(5)源码编译和运行
编译脚本,或者直接:bash build.sh
bash
#!/usr/bin/env bash
mkdir -p build && cd build
cmake .. -DMNN_VULKAN=ON
make -j4
sleep 1
#./video_for_pose
./Detector
- 如果你要测试CPU运行的性能,请修改src/main.cpp
DeviceType device = CPU;
- 如果你要测试GPU运行的性能,请修改src/main.cpp (需配置好OpenCL)
DeviceType device = OPENCL;
下面截图是YOLO26n的MNN CPU/OpenCL/Vulkan性能对比,纯C++推理(4线程)需要耗时62ms的时间,而开启OpenCL加速后,GPU模式耗时仅需9ms左右,性能极大的提高。不过,MNN对Vulkan貌似没有特殊优化,加速不明,建议使用OpenCL进行模型加速。
|--------|----------------------------------------------------------------------------|
| 模式 | |
| CPU |
|
| OPENCL |
|
| VULKAN |
|
4. 人脸检测和人体检测效果C++版本
下图给出C++版本行人检测(人体检测)效果:
|----------------------------------------------------------------------------------|----------------------------------------------------------------------------------|
|
|
|
|
|
|
下图GIF这是Python版本的人脸检测和人体检测效果,C++版本与Python版本的结果几乎是一致


5. 人脸检测和人体检测效果Android版本
已经完成Android版本人脸检测和行人检测算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约40ms左右,GPU约20ms左右 ,基本满足业务的性能需求。详细说明请查看:人脸检测和行人检测4:**Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)**https://blog.csdn.net/guyuealian/article/details/164629596
Android人脸检测和行人检测APP Demo体验:https://download.csdn.net/download/guyuealian/93441570

6. 项目源码下载
如需下载项目源码,请WX关注【AI吃大瓜】,回复【人脸检测和人体检测】即可下载
项目资源内容包含:
- 项目提供YOLOv8n / YOLO11n / YOLO26n版本的人脸检测和人体检测模型(MNN)
- 项目C/C++源码支持CPU和GPU运行,GPU模型加速需要配置好OpenCL,可以达到实时检测效果。
- 项目C/C++源码Demo支持图片,视频,摄像头测试
Android人脸检测和行人检测APP Demo体验:https://download.csdn.net/download/guyuealian/93441570