# 作业 **Repository Path**: du-changyou/task ## Basic Information - **Project Name**: 作业 - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-02 - **Last Updated**: 2021-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 作业 #### 介绍 {**以下是 Gitee 平台说明,您可以替换此简介** Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} #### 代码 人脸识别 import matplotlib.pyplot as plt import cv2 as cv import pickle import numpy as np #加载数据 img = cv.imread("zhangruoyun.jpg") # 读入待预测图片 img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 将图片转化为灰度图 img_gray = cv.equalizeHist(img_gray) # 把图像的范围拉开 #将训练好的模型,准确率,PCA导入 with open("clf", 'rb') as f: clf = pickle.load(f) # 随机森林模型 with open("acc", 'rb') as f: acc = pickle.load(f) # 准确率 with open("pca", 'rb') as f: pca = pickle.load(f) # PCA # 1. 创建级联分类器 face_cascade = cv.CascadeClassifier() # 2. 引入训练好的可用于人脸识别的级联分类器模型 face_cascade.load("haarcascade_frontalface_alt.xml") # 3. 用此级联分类器识别图像中的所有人脸信息,返回一个包含有所有识别的人联系系的列表 # 列表中每一个元素包含四个值:面部左上角的坐标(x,y) 以及面部的宽和高(w,h) faces = face_cascade.detectMultiScale(img_gray) # 4. 为图像中的所有面部画框 for (x, y, w, h) in faces: cv.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) img_face1 = cv.resize(img_gray[y:y+h+1, x:x+w+1], (32, 32)) # 提取面部图像信息 cv.putText(img, # 要显示字体的图片 # 要显示的内容 str(clf.predict(pca.transform([img_face1.ravel()]))[0]), (x, y-10), # 要显示的位置 cv.FONT_HERSHEY_SIMPLEX, # 要使用的字体 -> 一般英文字体 1, # 字体放大倍数 (0, 255, 0), # 字体颜色 2) # 字体线条粗细 cv.putText(img, 'acc={:.2f}'.format(acc), (10, 10), cv.FONT_HERSHEY_SIMPLEX, 0.4, (255, 0, 0), 1) plt.figure(figsize=(10, 5)) plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB)) plt.show() 训练模型 from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt import cv2 as cv import numpy as np import pandas as pd import pickle import os from os.path import exists from imutils import paths # 使用这个 from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split import time import faiss from sklearn.decomposition import PCA import math # 显示进度条 def progress_bar(s, i): print("\r", end="") # 输出位置回到行首 print(s+": {}%: ".format(i), "▋ " * (i // 2), end="") print("读取所有图像,生成X和y") l = list(paths.list_images('.')) # 从当前文件夹中获得所有的图像文件列表 X = [] # 数据信息 y = [] # 标签信息 c = 1 for i in l: progress_bar("读取图像", c*100//len(l)) img = cv.imread(i, 0) # 已灰度图读入 img = cv.resize(img, (32, 32)) X.append(img.ravel()) label = i.split(os.path.sep)[-1].split(".")[0] y.append(label) c = c+1 print("\nX.shape:", np.shape(X)) print("y.shape:", np.shape(y)) #1.得到X,y X = np.array(X) y = np.array(y) print('\n对X处理,保留90%的变异性对应的维度') pca = PCA(0.9).fit(X) # <--- 保留90%的变异性对应的维度 X = pca.transform(X) with open('pca', 'wb') as f: pickle.dump(pca, f) print('已保存pca') print("X的形状:", X.shape) print("y的形状:", y.shape) # 2. train_test_split 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25) # 3. 训练 随机森林 模型 clf = RandomForestClassifier() clf.fit(X_train, y_train) acc=clf.score(X_test,y_test) print('\n用随机森林模型得到的准确率为:{:.2f}'.format(acc)) with open("clf", 'wb') as f: pickle.dump(clf, f) print("已保存随机森林模型") with open("acc", 'wb') as f: pickle.dump(acc, f) print("已保存准确率") 获得人脸图片 import cv2 as cv import os out_folder = 'face_img' # 建立文件夹,用于保存经过处理后的面部图片信息 if not os.path.exists(out_folder): os.mkdir(out_folder) # os.listdir 返回指定目录下的所有文件和文件夹名称 # 如果不指定目录,则默认为python文件所在目录 l = [] for f in os.listdir(): if ".jpg" not in f: # 如果不是图片,则跳过 continue l.append(f) # 将图片名报存在一个列表中 for i in l: img = cv.imread(i) img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) img_gray = cv.equalizeHist(img_gray) # 对图像进行直方图增强 # 1. 创建级联分类器 face_cascade = cv.CascadeClassifier() # 2. 引入训练好的可用于人脸识别的级联分类器模型 face_cascade.load("haarcascade_frontalface_alt.xml") # 3. 用此级联分类器识别图像中的所有人脸信息,返回一个包含有所有识别的人联系系的列表 # 列表中每一个元素包含四个值:面部左上角的坐标(x,y) 以及面部的宽和高(w,h) faces = face_cascade.detectMultiScale(img_gray) # 4. 获取所有的面部信息并保存为.jpg图片 for (x, y, w, h) in faces: # cv.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) cv.imwrite(os.path.join(out_folder, '{}.jpg'.format(i.split('.')[0]+'.'+i.split('.')[1])), img[y:y+h+1, x:x+w+1]) #### 运行截图 1. xx![输入图片说明]()1K7X4%5DN@VAJGL_%5DYLZ@_1I.png)xx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技