热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCV头像训练与识别

识别效果图依赖安装opencv-pythonopencv-contrib-pythontensorflowPillownumpypip3installopencv-python4

识别效果图

 

依赖安装 opencv-python opencv-contrib-python tensorflow Pillow numpy 

pip3 install opencv-python==4.5.1.48 -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=10000
pip3 install opencv-contrib-python==4.5.1.48 -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=10000
pip3 install tensorflow==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=10000
pip3 install -U pillow==8.1.2
pip3 install numpy==1.19.4 -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=10000

 

头像目标锁定资源文件 haarcascade_frontalface_default.xml  如果觉得慢,可以从 csdn 资源中下载 

项目结构

 

采集数据 collection.py  采集完成之后可以通过肉眼删除误差较大的数据

# 头像数据采集
import cv2 as cv
import uuid# 数据集收集
def split_image(frame, set_path):# 图片转灰度frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 加载人脸分类识别器face_detector = cv.CascadeClassifier(r'../data/haarcascade_frontalface_default.xml')faces = face_detector.detectMultiScale(frame_gray)for x, y, w, h in faces:# 头像标注# cv.rectangle(frame, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)# 头像切割保存,分类型保存 frame_gray 为灰度图片 frame 为原始图片,选择灰度图片作为训练集cv.imwrite(set_path + str(uuid.uuid1()) + '.jpg', frame_gray[y:y + h, x:x + w])if __name__ == '__main__':# 数据保存路径,不能有中文set_path = "C:/Users/Administrator/Desktop/data"label = 0 # 当前数据的标签stream_address = "../data/one.mp4" # 读取视频文件# stream_address = 0;//获取摄像头stream = cv.VideoCapture(stream_address) # 转化为流set_path = set_path + "/" + labelwhile True:status, frame = stream.read() # 读取帧图片数据if status:print("获取到图片数据,规格为:", frame.shape)else:print('没有检查到图像数据')breaksplit_image(frame, set_path) # 截取头部数据信息cv.destroyAllWindows()stream.release()

 

训练模型 train.py

# 训练模型
import numpy as np
from PIL import Image
import cv2 as cv
import os# 加载训练数据
def get_train_data(data_path, image_width, image_high):train_data_array = [] # 训练集,灰度图片label_array = [] # 标签 必须是整数,数值型从0开始包括0,后续识别可以通过标签索引获取数组字典,数组从0开始listdir = os.listdir(data_path)for label in listdir:label_path = data_path + "/" + labelfiles = os.listdir(label_path)for file_name in files:file_path = label_path + "/" + file_nameimg_numpy = np.array(Image.open(file_path).convert('L'), 'uint8')img_format = cv.resize(img_numpy, (image_width, image_high), interpolation=cv.INTER_CUBIC) # 图片大小格式化train_data_array.append(img_format)label_array.append(int(label))return label_array, train_data_array# 训练模型
def training():print("人脸训练中 ...")data_path = "C:/Users/Administrator/Desktop/data" # 训练数据路径label_array, train_data_array = get_train_data(data_path, 128, 128) # 指定图片格式化大小# 创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器recognizer = cv.face.LBPHFaceRecognizer_create()# 传入训练集与标签recognizer.train(train_data_array, np.array(label_array))# 保存训练信息recognizer.write('../model/trainer.yml')print("{0} 训练分类数为2,已完成".format(len(np.unique(label_array))))if __name__ == '__main__':training()

 

视频识别 distinguish.py

# 识别
import cv2 as cvdef distinguish():# 加载算法 创建LBPH识别器并开始识别,当然也可以选择Eigen或者Fisher识别器recognizer = cv.face.LBPHFaceRecognizer_create()# 加载模型recognizer.read('../model/trainer.yml')face_detector = cv.CascadeClassifier(r"../data/haarcascade_frontalface_default.xml")font = cv.FONT_HERSHEY_SIMPLEX# 特征值对应的姓名映射names = ['one', 'two']cap = cv.VideoCapture("../data/one.mp4") # 加载视频文件数据# cap = cv.VideoCapture(0) # 加载摄像头数据while True:status, frame = cap.read()if status:print("获取到图片数据,规格为:", frame.shape)else:print('没有检查到图像数据')break# 图片转灰度frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)faces = face_detector.detectMultiScale(frame_gray)for x, y, w, h in faces:cv.rectangle(frame, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)# 识别feature_id, value = recognizer.predict(frame_gray[y:y + h, x:x + w])print("当前识别分类为", feature_id, "得分为", value)if value > 100:feature_id = "unknown"reliability = "100%"else:feature_id = names[feature_id] # 将识别的结果特征数值映射成姓名reliability = "{0}%".format(round(100 - value, 2))cv.putText(frame, str(feature_id), (x + 5, y - 5), font, 1, (0, 0, 255), 1)cv.putText(frame, str(reliability), (x + 5, y + h - 5), font, 1, (0, 255, 0), 1)cv.imshow("distinguish", frame)if ord('q') == cv.waitKey(10):breakcv.destroyAllWindows()cap.release()if __name__ == '__main__':distinguish()

采集头像数据示例

训练完之后会在mian/model目录下生成训练文件

校验模型的准确度 check.py

# 模型校验
import cv2 as cv
import os# 数据结构
class CheckResult:accuracy = 0 # 正确数error = 0 # 正确数unknown = 0 # 未知数total = 0 # 总数accuracy_list = [] # 正确详细数据error_list = [] # 错误详细数据unknown_list = [] # 未知详细数据accuracy_rate = None # 正确率error_rate = None # 错误率unknown_rate = None # 未知率accuracy_reliability = 0 # 正确平均可信度error_reliability = 0 # 错误平均可信度def msg(self):return "正确识别数:{0},正确率:{1},错误识别数:{2},错误率:{3},未知识别数:{4},未知率:{5},正确可信度:{6},错误可信度:{7}".format(self.accuracy,self.accuracy_rate,self.error,self.error_rate, self.unknown,self.unknown_rate,self.accuracy_reliability,self.error_reliability)# 加载校验数据
def get_test_data(data_path):# 加载算法 创建LBPH识别器并开始校验,当然也可以选择Eigen或者Fisher识别器recognizer = cv.face.LBPHFaceRecognizer_create() # 加载模型recognizer.read('../model/trainer.yml')face_detector = cv.CascadeClassifier(r"../data/haarcascade_frontalface_default.xml")test_data_array = [] # 校验集listdir = os.listdir(data_path)for label in listdir:label_path = data_path + "/" + labelfiles = os.listdir(label_path)for file_name in files:file_path = label_path + "/" + file_nameframe = cv.imread(file_path, 3)# 图片转灰度frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)faces = face_detector.detectMultiScale(frame_gray)for x, y, w, h in faces:cv.rectangle(frame, (x, y), (x + w, y + h), color=(0, 255, 0), thickness=1)# 识别feature_id, value = recognizer.predict(frame_gray[y:y + h, x:x + w])if value > 100:feature_id = "unknown"reliability = 1else:reliability = 100 - valuetest_data_array.append({"path": file_path, "feature": feature_id, "reliability": reliability, "label": int(label)})return test_data_array# 校验模型
def calc_result(test_data_array):result = CheckResult()for x in test_data_array:if x["feature"] == x["label"]:result.accuracy += 1result.accuracy_list.append(x)result.accuracy_reliability += x["reliability"]elif x["feature"] == 'unknown':result.unknown += 1result.unknown_list.append(x)else:result.error += 1result.error_list.append(x)result.error_reliability += x["reliability"]result.total = len(test_data_array)if result.total == 0:result.accuracy_rate = "0.00%"result.error_rate = "0.00%"result.unknown_rate = "0.00%"else:result.accuracy_rate = str(round(result.accuracy * 100 / result.total, 2)) + "%"result.error_rate = str(round(result.error * 100 / result.total, 2)) + "%"result.unknown_rate = str(round(result.unknown * 100 / result.total, 2)) + "%"result.accuracy_reliability = str(round(result.accuracy_reliability / result.total, 2)) + "%"result.error_reliability = str(round(result.error_reliability / result.total, 2)) + "%"return resultdef checking():print("模型校验中 ...")data_path = "C:/Users/Administrator/Desktop/data" # 校验数据路径test_data_array = get_test_data(data_path)result = calc_result(test_data_array)print(result.msg())# 校验模型准确度
if __name__ == '__main__':checking()

校验结果

 

 


推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
author-avatar
wiggin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有