手把手教你使用Tensorflow2.7完成人脸辨认系统,web人脸辨认(Flask框架)+ ...

打印 上一主题 下一主题

主题 887|帖子 887|积分 2661



  

前言

随着人工智能的不断发展,呆板学习和深度学习这门技术也越来越重要,一时间成为码农的学习热点。下面将使用深度学习技术开辟一个人脸辨认系统。之前使用 Tensorflow1.5 完成人脸辨认(之前版本的链接: 手把手教你完成深度学习人脸辨认系统),如今更新到 Tensorflow2.7 版本,我已经改写完成了,更新内容如下:

  • 加入 Flask 框架完成一个简朴的 web 版人脸辨认
  • Tensorflow1.5 改成 Tensorflow 2.7
  • 数据预处理代码更加自动
下面直接展示结果吧:




一、系统总流程设计


二、环境安装

手把手教学视频:链接: link
发起全部库的版本跟我一样,以免出错
python=3.8
tensorflow==2.7(这个版本一定要跟我一样的)
1. 创建虚拟环境

  1. conda create -n py38 python=3.8
复制代码
激活环境
  1. activate py38
复制代码
2.安装其他库

(1)单独安装 pyqt5,命令如下
  1. pip install pyqt5
复制代码
(2)单独安装 tensorflow,要么安装 gpu 版本大概 cpu 版本,下面给出各自的安装教程
如果安装 gpu 版本,电脑必须有英伟达显卡,而且先安装对应版本的 cuda 和 cudnn,安装教程看这篇文章: cuda和cudnn的安装教程(全网最详细保姆级教程),我安装的 cuda 版本是11.3,cudnn 版本是 8.2,发起安装跟我一样,避免报错
安装完 cuda 和 cudnn 之后,输入如下命令来安装 tensorflow gpu 版本 :
  1. pip install tensorflow_gpu==2.7.0
复制代码
测试tensorflow gpu 是否能用,代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :Test.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. import tensorflow as tf
  10. a = tf.test.is_built_with_cuda()  # 判断CUDA是否可以用
  11. b = tf.test.is_gpu_available(
  12.     cuda_only=False,
  13.     min_cuda_compute_capability=None
  14. )                                  # 判断GPU是否可以用
  15. print(a)
  16. print(b)
复制代码
输出两个True证实能用,如下图所示

如果安装 cpu 版本就简朴了,不用安装cuda和cudnn,直接输入下面命令安装就行,命令如下:
  1. pip install tensorflow-cpu==2.7.0
复制代码
之后安装 requirements.txt 配置文件,命令如下:
  1. pip install -r requirements.txt
复制代码

安装完环境你已经乐成一大把了,看到这里点个赞赞鼓励一下
报错了并办理的方法

报错:AttributeError: ‘str‘ object has no attribute ‘decode‘
降低h5py版本
办理方法:
  1. pip install h5py==2.10.0
复制代码

报错:ImportError: cannot import name ‘secure_filename’ from ‘werkzeug’
办理方法,进入到 flask_uploads.py 文件

把圈起来的代码改成下面的:
  1. from werkzeug.utils import secure_filename
  2. from werkzeug.datastructures import  FileStorage
复制代码

三、模子搭建

1.收罗数据集

使用摄像头进行收罗
代码可以直接运行,getdata.py代码如下:
注意:25行 cap = cv2.VideoCapture(1)的改为 cap = cv2.VideoCapture(0),0代表本电脑自带摄像头,1代码其他外接摄像头:
  1. # encoding:utf-8
  2. '''
  3. 功能: Python  opencv调用摄像头获取个人图片
  4. 使用方法:
  5.         启动摄像头后需要借助键盘输入操作来完成图片的获取工作
  6.         c(change): 生成存储目录
  7.         p(photo): 执行截图
  8.         q(quit): 退出拍摄
  9. '''
  10. import os
  11. import cv2
  12. def cameraAutoForPictures(saveDir='data/'):
  13.     '''
  14.     调用电脑摄像头来自动获取图片
  15.     '''
  16.     if not os.path.exists(saveDir):
  17.         os.makedirs(saveDir)
  18.     count = 1
  19.     cap = cv2.VideoCapture(1)
  20.     width, height, w = 640, 480, 360
  21.     cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
  22.     cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
  23.     crop_w_start = (width - w) // 2
  24.     crop_h_start = (height - w) // 2
  25.     print('width: ', width)
  26.     print('height: ', height)
  27.     while True:
  28.         ret, frame = cap.read()
  29.         frame = frame[crop_h_start:crop_h_start + w, crop_w_start:crop_w_start + w]
  30.         frame = cv2.flip(frame, 1, dst=None)
  31.         cv2.imshow("capture", frame)
  32.         action = cv2.waitKey(1) & 0xFF
  33.         if action == ord('c'):
  34.             saveDir = input(u"请输入新的存储目录:")
  35.             if not os.path.exists(saveDir):
  36.                 os.makedirs(saveDir)
  37.         elif action == ord('p'):
  38.             cv2.imwrite("%s/%d.jpg" % (saveDir, count), cv2.resize(frame, (224, 224), interpolation=cv2.INTER_AREA))
  39.             print(u"%s: %d 张图片" % (saveDir, count))
  40.             count += 1
  41.         if action == ord('q'):
  42.             break
  43.     cap.release()
  44.     cv2.destroyAllWindows()
  45. if __name__ == '__main__':
  46.     # xxx替换为自己的名字
  47.     cameraAutoForPictures(saveDir=u'data/1/')
复制代码
2. 数据预处理

代码可以直接运行,new_data_preparation.py代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :new_data_preparation.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. '''
  10. 功能: 图像的数据预处理、标准化部分
  11. '''
  12. import os
  13. import cv2
  14. import time
  15. def readAllImg(path, *suffix):
  16.     '''
  17.     基于后缀读取文件
  18.     '''
  19.     resultArray = []
  20.     try:
  21.         for root, dirs, files in os.walk(path):
  22.             for file in files:
  23.                 if endwith(file, suffix):
  24.                     document = os.path.join(root, file)
  25.                     img = cv2.imread(document)
  26.                     resultArray.append((document, img))
  27.     except IOError:
  28.         print("Error")
  29.     else:
  30.         print("读取成功")
  31.         return resultArray
  32. def endwith(s, *endstring):
  33.     '''
  34.     对字符串的后缀进行匹配
  35.     '''
  36.     return any(map(s.endswith, endstring))
  37. def readPicSaveFace(sourcePath, objectPath, *suffix):
  38.     '''
  39.     图片标准化与存储
  40.     '''
  41.     if not os.path.exists(objectPath):
  42.         os.makedirs(objectPath)
  43.     try:
  44.         allImages = readAllImg(sourcePath, *suffix)
  45.         face_cascade = cv2.CascadeClassifier('config/haarcascade_frontalface_alt.xml')
  46.         count = 0
  47.         for document, img in allImages:
  48.             if img is not None:
  49.                 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  50.                 faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  51.                 for (x, y, w, h) in faces:
  52.                     face = cv2.resize(gray[y:y + h, x:x + w], (200, 200))
  53.                     # 创建与sourcePath子目录对应的objectPath子目录
  54.                     relativePath = os.path.relpath(document, sourcePath)
  55.                     subdir = os.path.dirname(relativePath)
  56.                     saveDir = os.path.join(objectPath, subdir)
  57.                     if not os.path.exists(saveDir):
  58.                         os.makedirs(saveDir)
  59.                     timestamp = str(int(time.time()))
  60.                     fileName = f'{timestamp}_{count}.jpg'
  61.                     cv2.imwrite(os.path.join(saveDir, fileName), face)
  62.                     count += 1
  63.     except Exception as e:
  64.         print("Exception:", e)
  65.     else:
  66.         print(f'已处理 {count} 张人脸,保存到 {objectPath}')
  67. if __name__ == '__main__':
  68.     print('数据处理开始!!!')
  69.     readPicSaveFace('data', 'dataset', '.jpg', '.JPG', '.png', '.PNG', '.tiff', '.TIFF')
复制代码
3.构建模子和训练

代码可以直接运行,train_model.py代码如下:
keras搭建cnn网络模子提取人脸特性
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :train_model.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. """
  9. '''
  10. 功能: 构建人脸识别模型
  11. '''
  12. import os
  13. import cv2
  14. import random
  15. import numpy as np
  16. from tensorflow.keras.models import Sequential, load_model
  17. from sklearn.model_selection import train_test_split
  18. from tensorflow.keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten
  19. from tensorflow.keras.utils import to_categorical
  20. os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
  21. os.environ['CUDA_VISIBLE_DEVICES'] = '0'
  22. class DataSet(object):
  23.     '''
  24.     用于存储和格式化读取训练数据的类
  25.     '''
  26.     def __init__(self, path):
  27.         '''
  28.         初始化
  29.         '''
  30.         self.num_classes = None
  31.         self.X_train = None
  32.         self.X_test = None
  33.         self.Y_train = None
  34.         self.Y_test = None
  35.         self.img_size = 128
  36.         self.extract_data(path)
  37.     def extract_data(self, path):
  38.         '''
  39.         抽取数据
  40.         '''
  41.         imgs, labels, counter = read_file(path)
  42.         X_train, X_test, y_train, y_test = train_test_split(imgs, labels, test_size=0.2, random_state=random.randint(0, 100))
  43.         X_train = X_train.reshape(X_train.shape[0], self.img_size, self.img_size, 1) / 255.0
  44.         X_test = X_test.reshape(X_test.shape[0], self.img_size, self.img_size, 1) / 255.0
  45.         X_train = X_train.astype('float32')
  46.         X_test = X_test.astype('float32')
  47.         Y_train = to_categorical(y_train, num_classes=counter)
  48.         Y_test = to_categorical(y_test, num_classes=counter)
  49.         self.X_train = X_train
  50.         self.X_test = X_test
  51.         self.Y_train = Y_train
  52.         self.Y_test = Y_test
  53.         self.num_classes = counter
  54.     def check(self):
  55.         '''
  56.         校验
  57.         '''
  58.         print('num of dim:', self.X_test.ndim)
  59.         print('shape:', self.X_test.shape)
  60.         print('size:', self.X_test.size)
  61.         print('num of dim:', self.X_train.ndim)
  62.         print('shape:', self.X_train.shape)
  63.         print('size:', self.X_train.size)
  64.         print(np.isnan(dataset.X_train).sum())
  65.         print(np.isnan(dataset.X_test).sum())
  66. def endwith(s, *endstring):
  67.     '''
  68.     对字符串的后续和标签进行匹配
  69.     '''
  70.     resultArray = map(s.endswith, endstring)
  71.     if True in resultArray:
  72.         return True
  73.     else:
  74.         return False
  75. def read_file(path):
  76.     '''
  77.     图片读取
  78.     '''
  79.     img_list = []
  80.     label_list = []
  81.     dir_counter = 0
  82.     IMG_SIZE = 128
  83.     for child_dir in os.listdir(path):
  84.         child_path = os.path.join(path, child_dir)
  85.         for dir_image in os.listdir(child_path):
  86.             if endwith(dir_image, 'jpg'):
  87.                 img = cv2.imread(os.path.join(child_path, dir_image))
  88.                 resized_img = cv2.resize(img, (IMG_SIZE, IMG_SIZE))
  89.                 recolored_img = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)
  90.                 img_list.append(recolored_img)
  91.                 label_list.append(dir_counter)
  92.         dir_counter += 1
  93.     img_list = np.array(img_list)
  94.     return img_list, label_list, dir_counter
  95. def read_name_list(path):
  96.     '''
  97.     读取训练数据集
  98.     '''
  99.     name_list = []
  100.     for child_dir in os.listdir(path):
  101.         name_list.append(child_dir)
  102.     return name_list
  103. class Model(object):
  104.     '''
  105.     人脸识别模型
  106.     '''
  107.     FILE_PATH = "./models/face.h5"
  108.     IMAGE_SIZE = 128
  109.     def __init__(self):
  110.         self.model = None
  111.     def read_trainData(self, dataset):
  112.         self.dataset = dataset
  113.     def build_model(self):
  114.         self.model = Sequential()
  115.         self.model.add(
  116.             Conv2D(
  117.                 filters=32,
  118.                 kernel_size=(5, 5),
  119.                 padding='same',
  120.                 input_shape=self.dataset.X_train.shape[1:]
  121.             )
  122.         )
  123.         self.model.add(Activation('relu'))
  124.         self.model.add(
  125.             MaxPooling2D(
  126.                 pool_size=(2, 2),
  127.                 strides=(2, 2),
  128.                 padding='same'
  129.             )
  130.         )
  131.         self.model.add(Conv2D(filters=64, kernel_size=(5, 5), padding='same'))
  132.         self.model.add(Activation('relu'))
  133.         self.model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'))
  134.         self.model.add(Flatten())
  135.         self.model.add(Dense(1024))
  136.         self.model.add(Activation('relu'))
  137.         self.model.add(Dense(self.dataset.num_classes))
  138.         self.model.add(Activation('softmax'))
  139.         self.model.summary()
  140.     def train_model(self,epochs,batch_size):
  141.         self.model.compile(
  142.             optimizer='sgd',
  143.             loss='categorical_crossentropy',
  144.             metrics=['accuracy'])
  145.         self.model.fit(self.dataset.X_train, self.dataset.Y_train, epochs=epochs, batch_size=batch_size)
  146.     def evaluate_model(self):
  147.         print('\nTesting---------------')
  148.         loss, accuracy = self.model.evaluate(self.dataset.X_test, self.dataset.Y_test)
  149.         print('test loss:', loss)
  150.         print('test accuracy:', accuracy)
  151.     def save(self, file_path=FILE_PATH):
  152.         print('Model Saved Finished!!!')
  153.         self.model.save(file_path)
  154.     def load(self, file_path=FILE_PATH):
  155.         print('Model Loaded Successful!!!')
  156.         self.model = load_model(file_path)
  157.     def predict(self, img):
  158.         img = img.reshape((1, self.IMAGE_SIZE, self.IMAGE_SIZE, 1))
  159.         img = img.astype('float32')
  160.         img = img / 255.0
  161.         result = self.model.predict(img)
  162.         max_index = np.argmax(result)
  163.         return max_index, result[0][max_index]
  164. if __name__ == '__main__':
  165.     dataset = DataSet('dataset/')
  166.     model = Model()
  167.     model.read_trainData(dataset)
  168.     model.build_model()
  169.     model.train_model(epochs=10,batch_size=32)
  170.     model.evaluate_model()
  171.     model.save()
复制代码
五、摄像头测试

代码可以直接运行,Demo.py代码如下:
new_names 对应文件夹人脸的次序
  1. #encoding:utf-8
  2. from __future__ import division
  3. import numpy
  4. '''
  5. 功能: 人脸识别摄像头视频流数据实时检测模块
  6. '''
  7. from PIL import Image, ImageDraw, ImageFont
  8. import os
  9. import cv2
  10. from train_model import Model
  11. threshold=0.7  # 如果模型认为概率高于70%则显示为模型中已有的人物
  12. # 新的名字列表
  13. new_names = ["张三", "李四"]
  14. # 解决cv2.putText绘制中文乱码
  15. def cv2ImgAddText(img2, text, left, top, textColor=(0, 0, 255), textSize=20):
  16.     if isinstance(img2, numpy.ndarray):  # 判断是否OpenCV图片类型
  17.         img2 = Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
  18.     # 创建一个可以在给定图像上绘图的对象
  19.     draw = ImageDraw.Draw(img2)
  20.     # 字体的格式
  21.     fontStyle = ImageFont.truetype(r"C:\WINDOWS\FONTS\MSYH.TTC", textSize, encoding="utf-8")
  22.     # 绘制文本
  23.     draw.text((left, top), text, textColor, font=fontStyle)
  24.     # 转换回OpenCV格式
  25.     return cv2.cvtColor(numpy.asarray(img2), cv2.COLOR_RGB2BGR)
  26. class Camera_reader(object):
  27.     def __init__(self):
  28.         self.model=Model()
  29.         self.model.load()
  30.         self.img_size=128
  31.     def build_camera(self):
  32.         '''
  33.         调用摄像头来实时人脸识别
  34.         '''
  35.         face_cascade = cv2.CascadeClassifier('config/haarcascade_frontalface_alt.xml')
  36.         cameraCapture=cv2.VideoCapture(0)
  37.         success, frame=cameraCapture.read()
  38.         while success and cv2.waitKey(1)==-1:
  39.             success,frame=cameraCapture.read()
  40.             gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  41.             faces=face_cascade.detectMultiScale(gray, 1.3, 5)
  42.             for (x,y,w,h) in faces:
  43.                 ROI=gray[x:x+w,y:y+h]
  44.                 ROI=cv2.resize(ROI, (self.img_size, self.img_size),interpolation=cv2.INTER_LINEAR)
  45.                 label,prob=self.model.predict(ROI)
  46.                 print(label)
  47.                 if prob > threshold:
  48.                     show_name = new_names[label]
  49.                 else:
  50.                     show_name = "陌生人"
  51.                # cv2.putText(frame, show_name, (x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
  52.                 # 在图像上绘制中文字符
  53.                 # 解决cv2.putText绘制中文乱码
  54.                 frame = cv2ImgAddText(frame, show_name, x + 5, y - 30,)
  55.                 frame=cv2.rectangle(frame,(x,y), (x+w,y+h),(255,0,0),2)
  56.             cv2.imshow("Camera", frame)
  57.         else:
  58.             cameraCapture.release()
  59.             cv2.destroyAllWindows()
  60. if __name__ == '__main__':
  61.     camera=Camera_reader()
  62.     camera.build_camera()
复制代码
六、web界面搭建与pyqt界面搭建

web 界面接纳 Flask 框架,重要实现图片辨认功能,运行MainWeb.py即可在欣赏器访问了,地点是:http://127.0.0.1:5000/upload
MainWeb.py代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Auth : 挂科边缘
  4. @File :Test.py
  5. @IDE :PyCharm
  6. @Motto:学习新思想,争做新青年
  7. @Email :179958974@qq.com
  8. @qq :179958974
  9. """
  10. import os
  11. import time
  12. import cv2
  13. import numpy as np
  14. from PIL import Image, ImageDraw, ImageFont
  15. from flask import Flask, request, redirect, url_for, render_template
  16. from flask_uploads import UploadSet, IMAGES, configure_uploads
  17. from train_model import Model
  18. app = Flask(__name__)
  19. # 配置 Flask 文件上传
  20. # 注意这里的配置名称与上传集 'photos' 的名称一致
  21. app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'uploads')
  22. app.config['UPLOADED_PHOTOS_ALLOW'] = IMAGES
  23. photos = UploadSet('photos', IMAGES)
  24. configure_uploads(app, photos)
  25. # 人脸识别的标签(名字列表)
  26. new_names = ["张国荣", "王祖贤", "彭于晏", "特狼普", "章子怡"]
  27. # 加载人脸检测模型
  28. face_cascade = cv2.CascadeClassifier('config/haarcascade_frontalface_alt.xml')
  29. # 解决cv2.putText绘制中文乱码的问题
  30. def cv2ImgAddText(img, text, left, top, textColor=(0, 0, 255), textSize=20):
  31.     if isinstance(img, np.ndarray):
  32.         img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  33.     draw = ImageDraw.Draw(img)
  34.     fontStyle = ImageFont.truetype(r"C:\WINDOWS\FONTS\MSYH.TTC", textSize, encoding="utf-8")
  35.     draw.text((left, top), text, textColor, font=fontStyle)
  36.     return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
  37. def detectOnePicture(path):
  38.     '''
  39.     单图识别
  40.     '''
  41.     model = Model()
  42.     model.load()
  43.     # 读取图像并转换为灰度图
  44.     img = cv2.imread(path)
  45.     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  46.     # 检测人脸
  47.     faces = face_cascade.detectMultiScale(
  48.         gray,
  49.         scaleFactor=1.15,  # 调整比例因子
  50.         minNeighbors=5,  # 保持默认值
  51.         #minSize=(100, 100)  # 设置较大的最小检测尺寸
  52.     )
  53.     if len(faces) == 0:
  54.         return "抱歉,未检测到人脸!"
  55.     for (x, y, w, h) in faces:
  56.         roi = gray[y:y + h, x:x + w]
  57.         roi = cv2.resize(roi, (128, 128), interpolation=cv2.INTER_LINEAR)
  58.         label, prob = model.predict(roi)
  59.         if prob > 0.5:
  60.             show_name = f"{new_names[label]} ({prob:.2f})"
  61.             res = f"识别为: {new_names[label]} 的概率为: {prob:.2f}"
  62.         else:
  63.             res = "抱歉,未识别出该人!请尝试增加数据量来训练模型!"
  64.         img = cv2ImgAddText(img, show_name, x + 5, y - 30)
  65.         cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
  66.     cv2.imwrite(path, img)
  67.     print(res)
  68.     return res
  69. @app.route('/upload', methods=['POST', 'GET'])
  70. def upload():
  71.     if request.method == 'POST' and 'photo' in request.files:
  72.         filename = photos.save(request.files['photo'])
  73.         return redirect(url_for('show', name=filename))
  74.     return render_template('upload.html')
  75. @app.route('/photo/<name>')
  76. def show(name):
  77.     if not name:
  78.         print('出错了!')
  79.         return redirect(url_for('upload'))
  80.     file_path = os.path.join(app.config['UPLOADED_PHOTOS_DEST'], name)
  81.     if not os.path.exists(file_path):
  82.         return f"文件 {name} 不存在", 404
  83.     start_time = time.time()
  84.     res = detectOnePicture(file_path)
  85.     end_time = time.time()
  86.     execute_time = round(end_time - start_time, 2)
  87.     tsg = f'总耗时为: {execute_time} 秒'
  88.     url = photos.url(name)
  89.     return render_template('show.html', url=url, name=name, xinxi=res, shijian=tsg)
  90. if __name__ == "__main__":
  91.     if not os.path.exists(app.config['UPLOADED_PHOTOS_DEST']):
  92.         os.makedirs(app.config['UPLOADED_PHOTOS_DEST'])
  93.     print('Face Recognition Demo')
  94.     app.run(debug=True)
复制代码
pyqt5 搭建可视化界面,实现图片辨认和摄像头辨认
完整代码如下
注意注意注意:在代码中的 cap = cv2.VideoCapture(1) 需要改为 cap = cv2.VideoCapture(0),0代表本电脑自带摄像头,1代码其他外接摄像头,因为我用的外接摄像头所示写 1,大家没有的话改成 0:
  1. import os
  2. import sys
  3. import cv2
  4. import numpy
  5. from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog
  6. from PyQt5.QtGui import QPixmap, QImage
  7. from PyQt5.QtCore import Qt
  8. from PIL import Image, ImageDraw, ImageFont
  9. from Demo import Camera_reader
  10. from train_model import Model
  11. os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
  12. os.environ['CUDA_VISIBLE_DEVICES'] = '0'
  13. # 解决cv2.putText绘制中文乱码
  14. def cv2ImgAddText(img2, text, left, top, textColor=(0, 0, 255), textSize=20):
  15.     if isinstance(img2, numpy.ndarray):
  16.         img2 = Image.fromarray(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
  17.     draw = ImageDraw.Draw(img2)
  18.     fontStyle = ImageFont.truetype(r"C:\WINDOWS\FONTS\MSYH.TTC", textSize, encoding="utf-8")
  19.     draw.text((left, top), text, textColor, font=fontStyle)
  20.     return cv2.cvtColor(numpy.asarray(img2), cv2.COLOR_RGB2BGR)
  21. # 新的名字列表
  22. new_names = ["张国荣", "王祖贤","彭于晏","特狼普","章子怡"]
  23. class FaceDetectionApp(QMainWindow):
  24.     def __init__(self, parent=None):
  25.         super().__init__(parent)
  26.         self.setWindowTitle("人脸检测应用")
  27.         self.setGeometry(100, 100, 800, 600)
  28.         self.central_widget = QWidget()
  29.         self.setCentralWidget(self.central_widget)
  30.         self.layout = QVBoxLayout()
  31.         self.upload_button = QPushButton("图片识别")
  32.         self.upload_button.clicked.connect(self.upload_image)
  33.         self.upload_button.setFixedSize(779, 50)
  34.         self.camera_button = QPushButton("摄像头识别")
  35.         self.camera_button.clicked.connect(self.start_camera_detection)
  36.         self.camera_button.setFixedSize(779, 50)
  37.         self.image_label = QLabel()
  38.         self.image_label.setAlignment(Qt.AlignCenter)
  39.         self.image_label.setFixedSize(779, 500)
  40.         self.result_label = QLabel("识别结果: ")
  41.         self.result_label.setAlignment(Qt.AlignCenter)
  42.         self.layout.addWidget(self.upload_button)
  43.         self.layout.addWidget(self.camera_button)
  44.         self.layout.addWidget(self.image_label)
  45.         self.layout.addWidget(self.result_label)
  46.         self.central_widget.setLayout(self.layout)
  47.         self.model = Model()
  48.         self.model.load()
  49.     def upload_image(self):
  50.         options = QFileDialog.Options()
  51.         options |= QFileDialog.ReadOnly
  52.         file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.png *.jpg *.jpeg *.bmp *.gif *.tiff)", options=options)
  53.         if file_name:
  54.             image = cv2.imread(file_name)
  55.             gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  56.             face_cascade = cv2.CascadeClassifier('config/haarcascade_frontalface_alt.xml')
  57.             faces = (face_cascade.detectMultiScale(
  58.                          gray,
  59.                          scaleFactor=1.15,  # 较小的比例因子
  60.                          minNeighbors=5,  # 保持默认值
  61.                          #minSize=(100, 100)  # 设置较大的最小检测尺寸
  62.                      )# (gray, 1.35, 5)
  63.                      )
  64.             if len(faces) > 0:
  65.                 for (x, y, w, h) in faces:
  66.                     roi = gray[y:y + h, x:x + w]
  67.                     roi = cv2.resize(roi, (128, 128), interpolation=cv2.INTER_LINEAR)
  68.                     label, prob = self.model.predict(roi)
  69.                     if prob > 0.5:
  70.                         show_name = new_names[label]
  71.                         res = f"识别为: {show_name}, 概率: {prob:.2f}"
  72.                     else:
  73.                         show_name = "陌生人"
  74.                         res = "抱歉,未识别出该人!请尝试增加数据量来训练模型!"
  75.                     frame = cv2ImgAddText(image, show_name, x + 5, y - 30)
  76.                     cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
  77.                     cv2.imwrite('prediction.jpg', frame)
  78.                     self.result = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
  79.                     self.QtImg = QImage(
  80.                         self.result.data, self.result.shape[1], self.result.shape[0], QImage.Format_RGB32)
  81.                     self.image_label.setPixmap(QPixmap.fromImage(self.QtImg))
  82.                     self.image_label.setScaledContents(True)  # 自适应界面大小
  83.                     self.result_label.setText(res)
  84.             else:
  85.                 self.result_label.setText("未检测到人脸")
  86.     def start_camera_detection(self):
  87.         self.camera = Camera_reader()
  88.         self.camera.build_camera()
  89. class Camera_reader(object):
  90.     def __init__(self):
  91.         self.model = Model()
  92.         self.model.load()
  93.         self.img_size = 128
  94.     def build_camera(self):
  95.         face_cascade = cv2.CascadeClassifier('config/haarcascade_frontalface_alt.xml')
  96.         cameraCapture = cv2.VideoCapture(0)
  97.         success, frame = cameraCapture.read()
  98.         while success and cv2.waitKey(1) == -1:
  99.             success, frame = cameraCapture.read()
  100.             gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  101.             faces = (face_cascade.detectMultiScale(
  102.                          gray,
  103.                          scaleFactor=1.05,  # 较小的比例因子
  104.                          minNeighbors=5,  # 保持默认值
  105.                          #minSize=(100, 100)  # 设置较大的最小检测尺寸
  106.                      )
  107.                      )
  108.             for (x, y, w, h) in faces:
  109.                 ROI = gray[x:x + w, y:y + h]
  110.                 ROI = cv2.resize(ROI, (self.img_size, self.img_size), interpolation=cv2.INTER_LINEAR)
  111.                 label, prob = self.model.predict(ROI)
  112.                 if prob > 0.7:
  113.                     show_name = new_names[label]
  114.                 else:
  115.                     show_name = "陌生人"
  116.                 frame = cv2ImgAddText(frame, show_name, x + 5, y - 30)
  117.                 frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
  118.             cv2.imshow("Camera", frame)
  119.         else:
  120.             cameraCapture.release()
  121.             cv2.destroyAllWindows()
  122. if __name__ == "__main__":
  123.     app = QApplication(sys.argv)
  124.     window = FaceDetectionApp()
  125.     window.show()
  126.     sys.exit(app.exec_())
复制代码
总结

完整源码+数据集+模子,地点: 源码下载
提取码: kagm
本文通过opencv+cnn网络模子联合实现人脸辨认,opencv实现人脸辨认,cnn实现人脸的特性提取,并辨认是某个人,cnn模子有待优化,你们可以自己需求更换其它的深度学习模子,增加训练数据集样本,实现更精准的人脸辨认模子,有题目批评区留言,谢谢观看
博主熬夜写博客写代码,已经掉一大把头发了,麻烦点个赞赞鼓励一下


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表