ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)

人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测) 人脸检测和行人检测3C/C实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码可实时检测)目录人脸检测和行人检测3C/C实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码可实时检测)1. 前言2. 人脸检测和人体检测检测模型1模型训练2将Pytorch模型转换ONNX和MNN模型3. 人脸检测和人体检测C端上部署1项目结构2配置开发环境(OpenCVOpenCLbase-utilsMNN)3CMake配置4main源码5源码编译和运行4. 人脸检测和人体检测效果C版本5. 人脸检测和人体检测效果Android版本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人脸检测和人体检测数据集(含下载链接)人脸检测和行人检测2YOLOv8 YOLO11 YOLO26 实现人脸检测和行人检测(含数据集和训练代码) https://blog.csdn.net/guyuealian/article/details/164620332人脸检测和行人检测3C/C实现YOLOv8 YOLO11 YOLO26 人脸检测和人体检测(含源码可实时检测) https://blog.csdn.net/guyuealian/article/details/164629582人脸检测和行人检测4Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码可实时检测) https://blog.csdn.net/guyuealian/article/details/164629596如果需要进行人像分割实现一键抠图效果请参考文章《一键抠图Portrait Matting人像抠图 (C和Android源码)》2. 人脸检测和人体检测检测模型1模型训练人脸检测和人体检测训练过程请参考《人脸检测和行人检测2YOLOv8 YOLO11 YOLO26 实现人脸检测和行人检测(含数据集和训练代码)》https://blog.csdn.net/guyuealian/article/details/164620332下表格给YOLOv8n / YOLO11n / YOLO26n计算量和参数量以及其人脸检测和行人检测精度:模型input-sizeparams(M)GFLOPsmAP_0.5mAP_0.5:0.95YOLOv8n416×4163.15M3.70.970460.79315YOLO11n416×4162.62M2.70.970010.79531YOLO26n416×4162.41M2.30.970020.790092将Pytorch模型转换ONNX和MNN模型训练好模型后你需要将Pytorch模型转换为ONNX和MNN模型转换脚本工具export.py需要安装依赖库 pip install onnx onnxsim onnxruntime mnn# -*- coding: utf-8 -*- import os import argparse import numpy as np from ultralytics import YOLO def export_model(weights, formatmnn, imgsz640, dynamicFalse, halfFalse, int8False): 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 formatmnn 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_okTrue) # 创建rknn模型目录 # TODO RKNN默认float16,所以halfFalse可支持int8但validate_args会报错需要修改源码不检查 kwargs.update(halfFalse, int8True, namerk3588, source./images.txt) print(export format :{}, kwargs:{}.format(format, kwargs)) file model.export(formatformat, simplifyTrue, opset15, **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, typestr, defaultweights, helpmodel file) parser.add_argument(--imgsz, typeint, default416, helpinput image size) parser.add_argument(--format, typestr, defaultmnn, helpsave 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, formatopt.format, imgszopt.imgsz)在终端运行执行命令转换ONNX和MNN模型# 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 mnn3.人脸检测和人体检测C端上部署本项目采用CLion作为集成开发环境IDE。在依赖库方面OpenCV为必须安装的核心依赖用于图像处理基础功能base-utils与MNN推理框架已集成于项目内部开发者无需额外配置OpenCL作为可选组件主要用于在支持该标准的设备上对模型推理进行硬件加速用户可根据实际硬件情况选择性启用。1项目结构2配置开发环境(OpenCVOpenCLbase-utilsMNN)项目模型推理采用MNN部署框架支持多线程CPU和GPU加速推理图像处理采用OpenCV库模型加速采用OpenCL/Vulkan在普通电脑设备即可达到实时处理。项目仅在Ubuntu20.04进行测试Windows系统下请自行配置和编译如果你想在这个 C Demo部署你自己训练的人脸检测和人体检测模型你可以将训练好的Pytorch模型转换ONNX 再转换成MNN模型然后把原始的模型替换成你自己的MNN模型即可。安装OpenCV图像处理图像处理如读取图片图像裁剪等都需要使用OpenCV库进行处理安装教程Ubuntu20.04安装opencv和opencv_contribOpenCV库使用opencv-4.3.0版本opencv_contrib库暂时未使用可不安装安装OpenCL模型加速安装教程Ubuntu20.04安装OpenCLOpenCL和Vulkan用于模型GPU推理加速若不使用GPU纯C推理模型速度会比较慢。OpenCL支持性更好推进使用OpenCL。安装Vulkan模型加速安装教程Ubuntu20.04安装VulkanOpenCL和Vulkan用于模型GPU推理加速若不使用GPU纯C推理模型速度会比较慢。OpenCL支持性更好推进使用OpenCL。base-utilsC库GitHubhttps://github.com/PanJinquan/base-utils 无需安装项目已经配置了base_utils是个人开发常用的C库集成了C/C OpenCV等常用的算法MNN模型推理GitHubhttps://github.com/alibaba/MNN 无需安装项目已经配置了MNN (Mobile Neural Network)是由阿里巴巴集团开源的一个轻量级、高性能的深度学习推理引擎。它专为移动端、嵌入式设备以及边缘计算场景设计支持OpenCL/Vulkan同时也支持服务器端的高并发推理。自2019年开源以来MNN 已经成为业界主流的端侧推理框架之一广泛应用于淘宝、天猫、优酷、钉钉等阿里系App中覆盖了搜索推荐、图像识别、OCR、AR特效、语音处理等数百个业务场景。3CMake配置具体查看项目配套的CMakeLists.txt文件主要配置了OpenCVbase-utilsMNN这四个库Windows系统下请自行配置和编译。4main源码主程序src/main.cpp,提供了人脸检测和人体检测的Demo其中test_image_file()用于测试图片test_video_file()用于测试视频文件test_usb_camera()用于测试USB摄像头test_performance用于测试性能。// // 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; vectorstring 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; vectorstring 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#!/usr/bin/env bash mkdir -p build cd build cmake .. -DMNN_VULKANON make -j4 sleep 1 #./video_for_pose ./Detector如果你要测试CPU运行的性能请修改src/main.cppDeviceType device CPU;如果你要测试GPU运行的性能请修改src/main.cpp 需配置好OpenCLDeviceType device OPENCL;下面截图是YOLO26n的MNN CPU/OpenCL/Vulkan性能对比纯C推理(4线程)需要耗时62ms的时间而开启OpenCL加速后GPU模式耗时仅需9ms左右性能极大的提高。不过MNN对Vulkan貌似没有特殊优化加速不明建议使用OpenCL进行模型加速。模式CPUOPENCLVULKAN4.人脸检测和人体检测效果C版本下图给出C版本行人检测(人体检测)效果下图GIF这是Python版本的人脸检测和人体检测效果C版本与Python版本的结果几乎是一致5.人脸检测和人体检测效果Android版本已经完成Android版本人脸检测和行人检测算法开发APP在普通Android手机上可以达到实时的检测和识别效果CPU(4线程)约40ms左右GPU约20ms左右 基本满足业务的性能需求。详细说明请查看人脸检测和行人检测4Android实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码可实时检测)https://blog.csdn.net/guyuealian/article/details/164629596Android人脸检测和行人检测APP Demo体验https://download.csdn.net/download/guyuealian/934415706. 项目源码下载如需下载项目源码请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
返回列表