卷积神经网络识别人脸项目—使用百度飞桨ai计算
卷积神经网络识别人脸项目的详细过程
整个项目需要的准备文件:
下载链接:
链接:https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w
提取码:7777
链接:https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg
提取码:7777
1、模型推理文件
2、模型转换文件
1、数据集准备
数据集的文件夹格式如下图:一共两个文件夹
images文件夹装所有的图片,图片需随机打乱和编号
labels文件夹内是对图片进行打标签操作的标签
打标签使用的是labelimg,安装过程可自行百度
open Dir是打开存放图片的路径,我们这里就是images文件夹
Change Save Dir是存放标签的路径,我们这里选择labels文件夹
打标签模式选择YOLO
然后点击Create RectBox选择关键位置就可以打标签了。
然后是上一级文件夹格式:
其中sex文件夹包括了上面两个文件夹
classes.txt是打标签是生成的,包括了标签的顺序和种类,这里的男女识别classes.txt内部就是:
manwoman
gen.py是用于随机提取出训练集和测试集
运行gen.py后,生成了train.txt,val.txt两个txt
train.txt就是训练集,包括了训练集的图片路径名称
val.txt同理
然后来到主文件夹中:
点击路径,运行cmd:
运行python yolov5_2_coco.py ,生成的文件夹保存到相应路径中
python yolov5_2_coco.py --dir_path D:\Pycharm\code\YOLO2COCO\dataset\YOLOV5
打包数据集,然后压缩后上传到百度飞桨ai数据集平台
2、模型训练
点击创建项目:
项目创建成功后,启动环境,选择一个GPU:
新建一个notebook文件,然后重命名为ppyoloe
上传PaddleYOLO文件
然后将上传的文件重命名为PaddleYOLO
然后进入此文件夹
cd /home/aistudio/PaddleYOLO
然后根据自己的模型实际情况,修改下图文件,num_classes是分类的种类,这里一共两种,所以改为2
dataset/sex是存放数据的位置,按实际情况修改,我这里是男女识别数据集,所以文件夹命名为sex
因为配置文件中要求数据放到dataset/sex里面,所以需要把数据集放置到此处。
新建一个mask文件夹,把解压过后的数据文件夹拖到mask里面。
粘贴到dataset文件夹下,注意红色框的路径。
如果想要修改迭代次数,在此处修改:
/home/aistudio/PaddleYOLO/configs/ppyoloe/_base_/optimizer_80e.yml
epoch: 40 表示迭代次数为40次
输入下列代码,开始训练
第二行代码如果出错,权限不够,后面加上 --user
pip install -r requirements.txt --user
模型训练标志,此时是0 epoch
等待40次迭代完成:
训练完毕后,需要导出训练数据文件:
!python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_s_80e_coco.yml -o weights=/home/aistudio/PaddleYOLO/output/ppyoloe_plus_crn_s_80e_coco/model_final.pdparams
导出成功后,保存在以下路径中:
/home/aistudio/PaddleYOLO/output_inference/ppyoloe_plus_crn_s_80e_coco
然后下载以下的四个文件到电脑中:
3、模型转换
将上一步获得的四个文件放入下图的文件夹中
进入模型可视化网站查看模型:Netron 选择模型
然后进行模型剪枝,在如下目录下打开cmd:
运行这个模型剪枝文件
python prune_paddle_model.py --model_dir ppyoloe_crn_s_80 --model_filename model.pdmodel --params_filename model.pdiparams --output_names tmp_16 concat_14.tmp_0 --save_dir export_model
运行过后新增一个减支完成的模型文件夹
然后进行模型转换,把Paddle模型转换为onnx,需要在环境中提前安装好paddle2onnx。
执行以下命令进行模型转换:
paddle2onnx --model_dir export_model --model_filename model.pdmodel --params_filename model.pdiparams --input_shape_dict "{'image':[1,3,640,640]}" --opset_version 11 --save_file ppyoloe_crn_s_80.onnx
执行生成的ppyoloe_crn_s_80.onnx
mo --input_model ppyoloe_crn_s_80.onnx
执行结果如下:
4、模型推理
增加一个文件labels.txt,内容是我们的标签,注意存放路径
增加一个inference.ipynb用于编写推理代码,注意存放路径
inference.ipynb 文件代码如下:
from openvino.runtime import Core
import openvino.runtime as ov
import cv2 as cv
import numpy as np
import tensorflow as tf
OpenVINO 模型推理器(class)
class Predictor:"""OpenVINO 模型推理器"""def __init__(self, model_path):ie_core = Core()model = ie_core.read_model(model=model_path)self.compiled_model = ie_core.compile_model(model=model, device_name="CPU")def get_inputs_name(self, num):return self.compiled_model.input(num)def get_outputs_name(self, num):return self.compiled_model.output(num)def predict(self, input_data):return self.compiled_model([input_data])def get_request(self):return self.compiled_model.create_infer_request()
图像预处理
def process_image(input_image, size):"""输入图片与处理方法,按照PP-Yoloe模型要求预处理图片数据Args:input_image (uint8): 输入图片矩阵size (int): 模型输入大小Returns:float32: 返回处理后的图片矩阵数据"""max_len = max(input_image.shape)img = np.zeros([max_len,max_len,3],np.uint8)img[0:input_image.shape[0],0:input_image.shape[1]] = input_image # 将图片放到正方形背景中img = cv.cvtColor(img,cv.COLOR_BGR2RGB) # BGR转RGBimg = cv.resize(img, (size, size), cv.INTER_NEAREST) # 缩放图片img = np.transpose(img,[2, 0, 1]) # 转换格式img = img / 255.0 # 归一化img = np.expand_dims(img,0) # 增加维度return img.astype(np.float32)
图像后处理
def process_result(box_results, conf_results):"""按照PP-Yolove模型输出要求,处理数据,非极大值抑制,提取预测结果Args:box_results (float32): 预测框预测结果conf_results (float32): 置信度预测结果Returns:float: 预测框float: 分数int: 类别"""conf_results = np.transpose(conf_results,[0, 2, 1]) # 转置# 设置输出形状box_results =box_results.reshape(8400,4) conf_results = conf_results.reshape(8400,2)scores = []classes = []boxes = []for i in range(8400):conf = conf_results[i,:] # 预测分数score = np.max(conf) # 获取类别# 筛选较小的预测类别if score > 0.5:classes.append(np.argmax(conf)) scores.append(score) boxes.append(box_results[i,:])scores = np.array(scores)boxes = np.array(boxes)result_box = []result_score = []result_class = []# 非极大值抑制筛选重复的预测结果if len(boxes) != 0:# 非极大值抑制结果indexs = tf.image.non_max_suppression(boxes,scores,len(scores),0.25,0.35)for i, index in enumerate(indexs):result_score.append(scores[index])result_box.append(boxes[index,:])result_class.append(classes[index])# 返回结果return np.array(result_box),np.array(result_score),np.array(result_class)
画出预测框
def draw_box(image, boxes, scores, classes, labels):"""将预测结果绘制到图像上Args:image (uint8): 原图片boxes (float32): 预测框scores (float32): 分数classes (int): 类别lables (str): 标签Returns:uint8: 标注好的图片"""colors = [(0, 0, 255), (0, 255, 0)]scale = max(image.shape) / 640.0 # 缩放比例if len(classes) != 0:for i in range(len(classes)):box = boxes[i,:]x1 = int(box[0] * scale)y1 = int(box[1] * scale)x2 = int(box[2] * scale)y2 = int(box[3] * scale)label = labels[classes[i]]score = scores[i]cv.rectangle(image, (x1, y1), (x2, y2), colors[classes[i]], 2, cv.LINE_8)cv.putText(image,label+":"+str(score),(x1,y1-10),cv.FONT_HERSHEY_SIMPLEX, 0.55, colors[classes[i]], 2)return image
读取标签
def read_label(label_path):with open(label_path, 'r') as f:labels = f.read().split()return labels
同步推理
label_path = "labels.txt"
yoloe_model_path = "ppyoloe_crn_s_80.xml"
predictor = Predictor(model_path = yoloe_model_path)
boxes_name = predictor.get_outputs_name(0)
conf_name = predictor.get_outputs_name(1)
labels = read_label(label_path=label_path)
cap = cv.VideoCapture(0)
while cap.isOpened():ret, frame = cap.read()frame = cv.flip(frame, 180)cv.namedWindow("MaskDetection", 0) # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直cv.resizeWindow("MaskDetection", 640, 480) # 设置长和宽input_frame = process_image(frame, 640)results = predictor.predict(input_data=input_frame)boxes, scores, classes = process_result(box_results=results[boxes_name], conf_results=results[conf_name])result_frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)cv.imshow('MaskDetection', result_frame)key = cv.waitKey(1)if key == 27: #esc退出break
cap.release()
cv.destroyAllWindows()
异步推理
label_path = "labels.txt"
yoloe_model_path = "ppyoloe_crn_s_80.xml"
predictor = Predictor(model_path = yoloe_model_path)
input_layer = predictor.get_inputs_name(0)
labels = read_label(label_path=label_path)
cap = cv.VideoCapture(0)
curr_request = predictor.get_request()
next_request = predictor.get_request()
ret, frame = cap.read()
curr_frame = process_image(frame, 640)
curr_request.set_tensor(input_layer, ov.Tensor(curr_frame))
curr_request.start_async()
while cap.isOpened():ret, next_frame = cap.read()next_frame = cv.flip(next_frame, 180)cv.namedWindow("MaskDetection", 0) # 0可调大小,注意:窗口名必须imshow里面的一窗口名一直cv.resizeWindow("MaskDetection", 640, 480) # 设置长和宽in_frame = process_image(next_frame, 640)next_request.set_tensor(input_layer, ov.Tensor(in_frame))next_request.start_async()if curr_request.wait_for(-1) == 1:boxes_name = curr_request.get_output_tensor(0).dataconf_name = curr_request.get_output_tensor(1).databoxes, scores, classes = process_result(box_results=boxes_name, conf_results=conf_name)frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)cv.imshow('MaskDetection', frame)frame = next_framecurr_request, next_request = next_request, curr_requestkey = cv.waitKey(1)if key == 27: #esc退出break
cap.release()
cv.destroyAllWindows()
最终实现效果如图:
笑容识别:
性别识别:
相关文章:

卷积神经网络识别人脸项目—使用百度飞桨ai计算
卷积神经网络识别人脸项目的详细过程 整个项目需要的准备文件: 下载链接: 链接:https://pan.baidu.com/s/1WEndfi14EhVh-8Vvt62I_w 提取码:7777 链接:https://pan.baidu.com/s/10weqx3r_zbS5gNEq-xGrzg 提取码&#x…...

vue中预览静态pdf文件
方法 // pdf预览 viewFileCompare() { const pdfUrl "/static/wjbd.pdf"; window.open(pdfUrl); }, // 下载 downloadFile(){ var a document.createElement("a"); a.href "/static/wjbd.pdf"; a.…...
Java多进程(详细)
进程的含义 简单理解是正在跑起来的程序,正在运行的程序。没有正在运行的程序不叫进程,同一个程序,运行多次,就可能产生多个进程。 平时所说的程序,值的是一些exe的可执行文件,得把程序跑起来才会涉及到进程…...

OpenCV 4.0+Python机器学习与计算机视觉实战
💂 个人网站:【办公神器】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言第一部分&…...

自学网络安全(黑客)全笔记
一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…...

WAF/Web应用安全(拦截恶意非法请求)
Web 应用防火墙(Web Application Firewall, WAF)通过对 HTTP(S) 请求进行检测,识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击,保护 Web 服务安全稳定。 Web 安全是所有互联网应用必须具备的功能,…...

Windows环境下git客户端中的git-bash和MinGW64
我们在 Windows10 操作系统下,安装了 git 客户端之后,可以通过 git-bash.exe 打开一个 shell: 执行一些 linux 系统里的命令: 注意到上图紫色的 MINGW64. Mingw-w64 是原始 mingw.org 项目的改进版,旨在支持 Window…...

欧姆龙CX系列PLC串口转以太网欧姆龙cp1hplc以太网连接电脑
你是否还在为工厂设备信息采集困难而烦恼?捷米特JM-ETH-CX转以太网通讯处理器为你解决这个问题! 捷米特JM-ETH-CX转以太网通讯处理器专门为满足工厂设备信息化需求而设计,可以用于欧姆龙多个系列PLC的太网数据采集,非常方便构建生…...

Vue3笔记
1. Vue2 选项式 API vs Vue3 组合式API <script> export default { data(){ return { count:0 } }, methods:{ addCount(){ this.count } } } </script> <script setup> import { ref } from vue const count ref(0) c…...

git相关
gerrit用户指南: 资料:Gerrit 用户指南 gerrit-user-guide 上述有介绍如何review,review并非修改代码之后如何重新提交等操作 jenkins介绍 Jenkins详细教程 - 知乎 一、jenkins是什么? Jenkins是一个开源的、提供友好操作界…...

车道线检测|利用边缘检测的原理对车道线图片进行识别
前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…...
C++—static关键字详解
引言: C的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一.面向过程中的static 1.静态全局变量 静态全局变量有以下特点…...

CS144学习笔记(1):Internet and IP
1.网络应用 网络应用可以在世界范围内交换数据,例如你可以通过浏览器读取出版社服务器提供的文章。网络应用的基本模型:两台主机各自在本地运行一个程序,程序通过网络来通信。 最常用的通信模型使用双向可靠字节流,通信的两台主机…...

2 Linux基础篇-Linux入门
2Linux基础篇-Linux入门 文章目录 2Linux基础篇-Linux入门2.1 Linux介绍2.2 Linux和Unix的关系 学习视频来自于B站 【小白入门 通俗易懂】2021韩顺平 一周学会Linux。 2.1 Linux介绍 常见的操作系统有 Windows、MacOS、Android、ios、Linux、Unix等。而其中,Linux是…...

分享200+个关于AI的网站
分享200个关于AI的网站 欢迎大家访问:https://tools.haiyong.site/ai 快速导航 AI 应用AI 写作AI 编程AI 设计AI 作图AI 训练模型AI 影音编辑AI 效率助手 AI 应用 文心一言: https://yiyan.baidu.com/ 百度出品的人工智能语言模型 ChatGPT: https://chat.openai.c…...

静态 链接
1、空间与地址的分配 现在的链接器空间分配的策略基本上都采用 “相似段合并” 的方式。通过将所有相同类型的 section 合并到一起,例如将所有输入目标文件的 .text 合并(按顺序合并)到输出文件的 .text 节中;然后,链接…...

【C#性能】C# 语言中的数组迭代
一、说明 可迭代性,是数组等操作的根本;在C程序开发过程中,可迭代操作是非常普遍、非常广泛的,然而,对这种操作知道多少,又不知道多少,都将影响开发灵活性、开发的进度。因此,本文干…...

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…...

信息系统项目管理师(第四版)教材精读思维导图-第三章信息系统治理
请参阅我的另一篇文章,综合介绍软考高项: 信息系统项目管理师(软考高项)备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 目录 3.1 IT治理 3.2 IT审计 3.1 IT治理 3.2 IT审计...

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型
区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...