赞
踩
本次模型训练以唐可可为例,完成唐可可的人脸识别模型训练,并且检验模型的准确性。
模型训练需要准备正负样本集,正样本集需要包含唐可可的图片,负样本集需要完全不含有唐可可的图片。
【正片】
正片可以从互联网上检索,我们需要获取唐可可的图片并且下载,例如:
【负片】
负片的获取就相对容易了,选择任意一张图片都可以。但是负片要做到尽可能种类多样,这样有利于提升识别的准确率。同时负片的样本数量应该在正片样本数量的3倍左右,这是一个经验结论,有利于训练过程中虚警率在合理区间内。
以下提供一个可用的负样本集库,可以酌情下载使用:
—负片数据集网址点此跳转—
我们需要把准备好的正负样本图片保存到文件夹中,文件后缀应为jpg格式。请注意:正样本命名为[positive],负样本命名为[negative]。
这并非是不必要的,这一步为接下来的图片规范化做铺垫。
找到样本集的上级文件夹绝对路径,并且复制到剪贴板中。
如图:
此时C:\User\yliue\Desktop\haar为输入解释器的绝对路径,文件夹内包含正负样本两个文件夹。(请确保文件名称正确,否则代码运行将会失败)
运行图片规范化代码,把绝对路径粘贴到解释器对应的窗口中,然后回车确认。
完整代码块如下:
import os import cv2 import time class rebuild(): def count(self, path): filenames = os.listdir(path) file_len = len(filenames) return file_len def rename(self, path): # rename函数对所有图片进行命名规范化 num = int(self.count(path)) num_list = [] # 储存图片的名称信息 for i in range(1, num + 1): # 开始进行排序 num_list.append(i) image = os.listdir(path) # 将原文件名称保存到列表中 n = 0 for i in image: old_name = path + image[n] # 旧文件名(就是路径+文件名) new_name = path + str(num_list[n]) + '.jpg' # 新文件名(就是路径+文件名) os.rename(old_name, new_name) # 进行名称修改 n = n + 1 def reform(self, path, size): for i in range(1, self.count(path) + 1): img_path = path + str(i) + '.jpg' img = cv2.imread(img_path, 0) img = cv2.resize(img, (size, size)) cv2.imwrite(path + str(i) + '.jpg', img) print("重构进度:", '{:.2%}'.format(i / self.count(path))), if __name__ = '__main__': PATH = input("请在冒号后粘贴完整的图片文件夹地址:") file = rebuild() # 实例化 time_start = time.time() # 记录开始检测时间 print("#*******图片重构开始*******#") #负片检测 path_n = PATH + r"\\negative\\" print("负样本库中共检测到", file.count(path_n), "张图片") #正片检测 path_p = PATH + r"\\postive\\" print("正样本库中共检测到", file.count(path_p), "张图片") file.rename(path_n) # 进行名称规范化 file.reform(path_n, 80) # 进行格式规范化 print("#***负样本重构完成***#") file.rename(path_p) # 进行名称规范化 file.reform(path_p, 20) # 进行格式规范化 print("#***正样本重构完成***#") time_end = time.time() # 记录终止时间 print('执行完成,总耗时:', (time_end - time_start), '秒') # 输出执行时间
进度条跑满后,编译器会显示执行完成,并输出检测耗时。
之后,我们打开本地文件,检查正负样本文件夹内的图片,是否达成预定目标。
观察到图片都按照预期修改完毕后,我们可以进行下一步操作。
import cv2 as cv # 引入opencv库 def opencv_print(title, obj): # 定义opencv_print函数,参数为标题和对象 cv.namedWindow(title, cv.WINDOW_FREERATIO) cv.imshow(title, obj) # 窗口显示标题并且输出对象信息 cv.waitKey(0) # 一直等待按键操作 cv.destroyAllWindows() # 关闭所有窗口 def face_recognition(pic_name): # 定义face_recognition函数 img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 将img转化为灰度图保存到img_gray中 face_recongnition = cv.CascadeClassifier( r'C:\Users\yliue\PycharmProjects\opencv_project_pic\cascade.xml') # cv类的CascadeClassifier方法定义face_recongnition对象(括号内为模型地址) face = face_recongnition.detectMultiScale(img_gray, 1.1, 2, 0) # face_recongnition对象的detectMultiScale方法定义face对象 (括号内为Mat& image,scaleFactor,minNeighbors,flags) for x, y, h, w in face: # 遍历所有的像素点 cv.rectangle(img, (x, y), (x + w, y + h), color=(255, 0, 0), thickness=2) # 绘制框选长方体 opencv_print(pic_name, img) # 调用opencv_print函数 print(x, y, w, h) # 显示位置坐标 print(x + w / 2, y + h / 2) # 显示中心坐标 print(type(face)) #***main***# if __name__ == '__main__': pic_name = input("请输入待识别的图片名称(不包含后缀名):") img = cv.imread(pic_name + '.jpg') # 读取图像名称 face_recognition(pic_name) # 调用face_recognition函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。