0


卷积神经网络识别人脸项目—使用百度飞桨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内部就是:

  1. man
  2. woman

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 ,生成的文件夹保存到相应路径中

  1. 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

然后进入此文件夹

  1. cd /home/aistudio/PaddleYOLO

在这里插入图片描述

然后根据自己的模型实际情况,修改下图文件,num_classes是分类的种类,这里一共两种,所以改为2

dataset/sex是存放数据的位置,按实际情况修改,我这里是男女识别数据集,所以文件夹命名为sex

因为配置文件中要求数据放到dataset/sex里面,所以需要把数据集放置到此处。

新建一个mask文件夹,把解压过后的数据文件夹拖到mask里面。

粘贴到dataset文件夹下,注意红色框的路径。

如果想要修改迭代次数,在此处修改:

  1. /home/aistudio/PaddleYOLO/configs/ppyoloe/_base_/optimizer_80e.yml

epoch: 40 表示迭代次数为40次

在这里插入图片描述

输入下列代码,开始训练

第二行代码如果出错,权限不够,后面加上 --user

  1. pip install -r requirements.txt --user

模型训练标志,此时是0 epoch

在这里插入图片描述

等待40次迭代完成:

在这里插入图片描述

训练完毕后,需要导出训练数据文件:

  1. !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)]

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

  1. /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:

在这里插入图片描述

运行这个模型剪枝文件

在这里插入图片描述

  1. 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。

执行以下命令进行模型转换:

  1. 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

在这里插入图片描述

  1. mo --input_model ppyoloe_crn_s_80.onnx

在这里插入图片描述

执行结果如下:

在这里插入图片描述

4、模型推理

增加一个文件labels.txt,内容是我们的标签,注意存放路径

在这里插入图片描述

增加一个inference.ipynb用于编写推理代码,注意存放路径
在这里插入图片描述

inference.ipynb 文件代码如下:

  1. from openvino.runtime import Core
  2. import openvino.runtime as ov
  3. import cv2 as cv
  4. import numpy as np
  5. import tensorflow as tf

OpenVINO 模型推理器(class)

  1. classPredictor:"""
  2. OpenVINO 模型推理器
  3. """def__init__(self, model_path):
  4. ie_core = Core()
  5. model = ie_core.read_model(model=model_path)
  6. self.compiled_model = ie_core.compile_model(model=model, device_name="CPU")defget_inputs_name(self, num):return self.compiled_model.input(num)defget_outputs_name(self, num):return self.compiled_model.output(num)defpredict(self, input_data):return self.compiled_model([input_data])defget_request(self):return self.compiled_model.create_infer_request()

图像预处理

  1. defprocess_image(input_image, size):"""输入图片与处理方法,按照PP-Yoloe模型要求预处理图片数据
  2. Args:
  3. input_image (uint8): 输入图片矩阵
  4. size (int): 模型输入大小
  5. Returns:
  6. float32: 返回处理后的图片矩阵数据
  7. """
  8. max_len =max(input_image.shape)
  9. img = np.zeros([max_len,max_len,3],np.uint8)
  10. img[0:input_image.shape[0],0:input_image.shape[1]]= input_image # 将图片放到正方形背景中
  11. img = cv.cvtColor(img,cv.COLOR_BGR2RGB)# BGRRGB
  12. img = cv.resize(img,(size, size), cv.INTER_NEAREST)# 缩放图片
  13. img = np.transpose(img,[2,0,1])# 转换格式
  14. img = img /255.0# 归一化
  15. img = np.expand_dims(img,0)# 增加维度return img.astype(np.float32)

图像后处理

  1. defprocess_result(box_results, conf_results):"""按照PP-Yolove模型输出要求,处理数据,非极大值抑制,提取预测结果
  2. Args:
  3. box_results (float32): 预测框预测结果
  4. conf_results (float32): 置信度预测结果
  5. Returns:
  6. float: 预测框
  7. float: 分数
  8. int: 类别
  9. """
  10. conf_results = np.transpose(conf_results,[0,2,1])# 转置# 设置输出形状
  11. box_results =box_results.reshape(8400,4)
  12. conf_results = conf_results.reshape(8400,2)
  13. scores =[]
  14. classes =[]
  15. boxes =[]for i inrange(8400):
  16. conf = conf_results[i,:]# 预测分数
  17. score = np.max(conf)# 获取类别# 筛选较小的预测类别if score >0.5:
  18. classes.append(np.argmax(conf))
  19. scores.append(score)
  20. boxes.append(box_results[i,:])
  21. scores = np.array(scores)
  22. boxes = np.array(boxes)
  23. result_box =[]
  24. result_score =[]
  25. result_class =[]# 非极大值抑制筛选重复的预测结果iflen(boxes)!=0:# 非极大值抑制结果
  26. indexs = tf.image.non_max_suppression(boxes,scores,len(scores),0.25,0.35)for i, index inenumerate(indexs):
  27. result_score.append(scores[index])
  28. result_box.append(boxes[index,:])
  29. result_class.append(classes[index])# 返回结果return np.array(result_box),np.array(result_score),np.array(result_class)

画出预测框

  1. defdraw_box(image, boxes, scores, classes, labels):"""将预测结果绘制到图像上
  2. Args:
  3. image (uint8): 原图片
  4. boxes (float32): 预测框
  5. scores (float32): 分数
  6. classes (int): 类别
  7. lables (str): 标签
  8. Returns:
  9. uint8: 标注好的图片
  10. """
  11. colors =[(0,0,255),(0,255,0)]
  12. scale =max(image.shape)/640.0# 缩放比例iflen(classes)!=0:for i inrange(len(classes)):
  13. box = boxes[i,:]
  14. x1 =int(box[0]* scale)
  15. y1 =int(box[1]* scale)
  16. x2 =int(box[2]* scale)
  17. y2 =int(box[3]* scale)
  18. label = labels[classes[i]]
  19. score = scores[i]
  20. cv.rectangle(image,(x1, y1),(x2, y2), colors[classes[i]],2, cv.LINE_8)
  21. cv.putText(image,label+":"+str(score),(x1,y1-10),cv.FONT_HERSHEY_SIMPLEX,0.55, colors[classes[i]],2)return image

读取标签

  1. defread_label(label_path):withopen(label_path,'r')as f:
  2. labels = f.read().split()return labels

同步推理

  1. label_path ="labels.txt"
  2. yoloe_model_path ="ppyoloe_crn_s_80.xml"
  3. predictor = Predictor(model_path = yoloe_model_path)
  4. boxes_name = predictor.get_outputs_name(0)
  5. conf_name = predictor.get_outputs_name(1)
  6. labels = read_label(label_path=label_path)
  7. cap = cv.VideoCapture(0)while cap.isOpened():
  8. ret, frame = cap.read()
  9. frame = cv.flip(frame,180)
  10. cv.namedWindow("MaskDetection",0)# 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
  11. cv.resizeWindow("MaskDetection",640,480)# 设置长和宽
  12. input_frame = process_image(frame,640)
  13. results = predictor.predict(input_data=input_frame)
  14. boxes, scores, classes = process_result(box_results=results[boxes_name], conf_results=results[conf_name])
  15. result_frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)
  16. cv.imshow('MaskDetection', result_frame)
  17. key = cv.waitKey(1)if key ==27:#esc退出break
  18. cap.release()
  19. cv.destroyAllWindows()

异步推理

  1. label_path ="labels.txt"
  2. yoloe_model_path ="ppyoloe_crn_s_80.xml"
  3. predictor = Predictor(model_path = yoloe_model_path)
  4. input_layer = predictor.get_inputs_name(0)
  5. labels = read_label(label_path=label_path)
  6. cap = cv.VideoCapture(0)
  7. curr_request = predictor.get_request()
  8. next_request = predictor.get_request()
  9. ret, frame = cap.read()
  10. curr_frame = process_image(frame,640)
  11. curr_request.set_tensor(input_layer, ov.Tensor(curr_frame))
  12. curr_request.start_async()while cap.isOpened():
  13. ret, next_frame = cap.read()
  14. next_frame = cv.flip(next_frame,180)
  15. cv.namedWindow("MaskDetection",0)# 0可调大小,注意:窗口名必须imshow里面的一窗口名一直
  16. cv.resizeWindow("MaskDetection",640,480)# 设置长和宽
  17. in_frame = process_image(next_frame,640)
  18. next_request.set_tensor(input_layer, ov.Tensor(in_frame))
  19. next_request.start_async()if curr_request.wait_for(-1)==1:
  20. boxes_name = curr_request.get_output_tensor(0).data
  21. conf_name = curr_request.get_output_tensor(1).data
  22. boxes, scores, classes = process_result(box_results=boxes_name, conf_results=conf_name)
  23. frame = draw_box(image=frame, boxes=boxes, scores=scores, classes=classes, labels=labels)
  24. cv.imshow('MaskDetection', frame)
  25. frame = next_frame
  26. curr_request, next_request = next_request, curr_request
  27. key = cv.waitKey(1)if key ==27:#esc退出break
  28. cap.release()
  29. cv.destroyAllWindows()

最终实现效果如图:

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

性别识别:

在这里插入图片描述

在这里插入图片描述


本文转载自: https://blog.csdn.net/chenyu128/article/details/131751548
版权归原作者 chenyu128 所有, 如有侵权,请联系我们删除。

“卷积神经网络识别人脸项目—使用百度飞桨ai计算”的评论:

还没有评论