卷积神经网络识别人脸项目—使用百度飞桨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同理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVbSEcox-1689495250366)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716111500162.png)]

然后来到主文件夹中:

在这里插入图片描述

点击路径,运行cmd:
在这里插入图片描述

运行python yolov5_2_coco.py ,生成的文件夹保存到相应路径中

python yolov5_2_coco.py --dir_path D:\Pycharm\code\YOLO2COCO\dataset\YOLOV5

在这里插入图片描述

打包数据集,然后压缩后上传到百度飞桨ai数据集平台

在这里插入图片描述

2、模型训练

点击创建项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dUdGgNWz-1689495250370)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716121747564.png)]

在这里插入图片描述

项目创建成功后,启动环境,选择一个GPU:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cpE6hFmC-1689495250371)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716122037028.png)]

新建一个notebook文件,然后重命名为ppyoloe

在这里插入图片描述

上传PaddleYOLO文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0lJYBIUJ-1689495250372)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716122458800.png)]

然后将上传的文件重命名为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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QlvXe2NL-1689495250376)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716143851858.png)]

导出成功后,保存在以下路径中:

/home/aistudio/PaddleYOLO/output_inference/ppyoloe_plus_crn_s_80e_coco

在这里插入图片描述

然后下载以下的四个文件到电脑中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsgYtujP-1689495250377)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716123546754.png)]

3、模型转换

将上一步获得的四个文件放入下图的文件夹中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oyx5Cju8-1689495250379)(C:\Users\vers\AppData\Roaming\Typora\typora-user-images\image-20230716135057966.png)]

进入模型可视化网站查看模型: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

img

运行过后新增一个减支完成的模型文件夹

在这里插入图片描述

然后进行模型转换,把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()

最终实现效果如图:

笑容识别:
在这里插入图片描述
在这里插入图片描述

性别识别:

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/73805.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Java极简设计模式》第02章:抽象工厂模式(AbstractFactoty)

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

1.2 eureka注册中心,完成服务注册

目录 环境搭建 搭建eureka服务 导入eureka服务端依赖 编写启动类,添加EnableEurekaServer注解 编写eureka配置文件 启动服务,访问eureka Euraka服务注册 创建了两个子模块 在模块里导入rureka客户端依赖 编写eureka配置文件 添加Services 环境搭建 创建父…

CentOS7系统MBR、GRUB2、内核启动流程报错问题

目录 🥩Linux启动流程 🥩MBR修复 🍭1、模拟损坏 🍭2、重启测试 🍭3、修复MBR 🍭4、测试系统 🥩GRUB2修复 🍭1、模拟损坏 🍭2、修复GRUB2 🍭3、测试系统 &…

docker 资源限制

目录 1、CPU使用率 2、CPU共享比例 3、CPU周期限制 4、CPU核心限制 5、CPU 配额控制参数的混合案例 6、内存限制 7、Block IO 的限制 8、限制bps 和iops docker资源限制 Docker容器技术底层是通过Cgroup(Control Group 控制组)实现容器对物理资…

赛车游戏——【极品飞车】(内含源码inscode在线运行)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄,vue成神之路★ ★ 解决算法,一个专栏就够了★ ★ 架…

【excel常用文本函数大全上】

目录索引 LEFT:公式:举例: RIGHT:公式:举例: MID:公式:举例: FIND:公式:举例: LEN:公式:举例: LEN…

Hive/Spark/Yarn: User Not Found 错误和 Kerberos / AD / OpenLDAP 之间的关系与解释

有时候,当你向Spark或Hive提交作业时,可能会遇到如下的错误: 提交作业使用的用户是example-user-1,但是Yarn返回的错误信息是:该用户不存在。类似的问题大多发生在启动了Kerberos的Hadoop集群上,或者集群集成了Windows AD或OpenLDAP后。本文,我们把这个问题梳理清楚并给…

【力扣】206. 反转链表 <链表指针>

【力扣】206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2 输入:head [1,2] 输出:[2,1] 示例 3 输入&#xff1a…

寄存器详解

目录 前言: 通用寄存器 示例: 通用寄存器的划分 汇编指令 cpu物理地址的形成 地址加法器运算示例: 1. 相关部件提供段地址和偏移地址 2. 段地址和偏移地址送入地址加法器 3. 段地址*16 4. 求出物理地址 5. 输出物理地址 段的概念 Deb…

git 常用命令有哪些

Git 是我们开发工作中使用频率极高的工具,下面总结下他的基本指令有哪些,顺便温习一下。 前言 一般项目中长存2个分支: 主分支(master) 和开发分支(develp) 项目存在三种短期分支 &#xff1a…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据,y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

【vue】 vue2 监听滚动条滚动事件

代码 直接上代码&#xff0c;vue单文件 index.vue <template><div class"content" scroll"onScroll"><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容</p><p>内容…

vue 3.0 + element-ui MessageBox弹出框的 让文本框显示文字 placeholder

inputPlaceholder:请填写理由, 方法实现如下: this.$prompt(, 是否确认&#xff1f;, { confirmButtonText: 确定, cancelButtonText: 取消, inputPlaceholder:请填写理由, }).then(({ value }) > { if(value null || value ""){ Message({message: 请填…

Modbus tcp转ETHERCAT在Modbus软件中的配置方法

Modbus tcp和ETHERCAT是两种不同的协议&#xff0c;这给工业生产带来了很大的麻烦&#xff0c;因为这两种设备之间无法通讯。但是&#xff0c;捷米JM-ECT-TCP网关的出现&#xff0c;却为这个难题提供了解决方案。 JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&…

新概念英语的网盘资源

新版新概念英语1-4册全部视频和课本_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/18wyeA#l…

EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?

目录 1 EXCEL里如何显示序号&#xff1f; 2 如何重新排序&#xff1f; 3 怎么取得排序后的序号&#xff1f; 3.1 rank() 的序号可能不连续 3.2 方法2&#xff1a;SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号&#xff1f;如何重新排序…

Vue模版语法

目录 接下来学习click 例题&#xff1a;修改背景颜色 例题&#xff1a;反复点击button按钮&#xff0c;可以不断切换背景颜色 先看以下例题是回顾vue的用法 <body><div id"box">{{myname}} - {{myage}}</div><script>var vm new Vue({el…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功…

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…

二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…