美文网首页机器学习算法
Python人脸识别探索

Python人脸识别探索

作者: 狄仁杰666 | 来源:发表于2021-04-20 00:06 被阅读0次

前言

来啦老铁!

今天心血来潮,想用Python做点“高大上”的东西,同时也借此机会分享给同事们,以提高大家编程的兴趣,我自己选了个话题:

  • 人脸识别探索

整体步骤

  1. 下载opencv项目;
  2. 创建人脸识别项目;
  3. 拷贝人脸识别模型;
  4. 编写图片读取、展示Service;
  5. 编写人脸识别Service;
  6. 编写调用电脑视频能力的Service;
  7. 组装人脸识别业务代码;
  8. 准备人脸图片进行人脸识别实验;
  9. 使用电脑摄像头进行动态人脸识别实验;

1. 下载opencv项目;

git clone https://github.com/opencv/opencv.git

clone完成后,opencv项目的结构如下:

opencv项目结构

2. 创建人脸识别项目;

新建一个文件夹,例如face_rec,按照我们的预想,在face_rec文件夹下新建几个文件夹:

  • image
  • model

同时,在face_rec文件夹下创建一个python包:

  • service

3. 拷贝人脸识别模型;

将步骤1中的data/haarcascade文件夹下的所有.xml文件拷贝到face_rec/model下,供后续步骤使用;

data/haarcascade文件夹

4. 编写图片读取、展示Service;

在service包下创建imageService.py,imageService.py内的代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/4/18 11:06 下午
# @Author : 狄仁杰666
# @Site : 
# @File : imageService.py
# @Software: PyCharm
import cv2
import matplotlib.pyplot as plt


def show_image(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()


def read_image(path):
    image = cv2.imread(path)
    return image


if __name__ == "__main__":
    image = read_image("../image/1.jpeg")
    show_image(image)

5. 编写人脸识别Service;

在service包下创建recognitionService.py,recognitionService.py内的代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/4/18 11:10 下午
# @Author : 狄仁杰666
# @Site : 
# @File : recognitionService.py
# @Software: PyCharm
import cv2

from service.imageService import read_image


def recognize_faces(image, model='../model/haarcascade_frontalface_default.xml'):
    detector = cv2.CascadeClassifier(model)
    rectangles = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=20, minSize=(10, 10), flags=cv2.CASCADE_SCALE_IMAGE)
    for (x, y, w, h) in rectangles:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
    return image


if __name__ == "__main__":
    image = read_image("../image/1.jpeg")
    recognize_faces(image)

6. 编写调用电脑视频能力的Service;

在service包下创建recognitionService.py,recognitionService.py内的代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/4/18 11:10 下午
# @Author : 狄仁杰666
# @Site : 
# @File : recognitionService.py
# @Software: PyCharm
import cv2

from service.imageService import read_image


def recognize_faces(image, model='../model/haarcascade_frontalface_default.xml'):
    detector = cv2.CascadeClassifier(model)
    # 图片进行灰度处理
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    rectangles = detector.detectMultiScale(gray_image)
    for (x, y, w, h) in rectangles:
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
    return image


if __name__ == "__main__":
    image = read_image("../image/1.jpeg")
    recognize_faces(image)

7. 组装人脸识别业务代码;

在face_rec根目录创建main.py,并在其中编写组装人脸识别的业务代码,如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/4/18 11:26 下午
# @Author : 狄仁杰666
# @Site : 
# @File : main.py
# @Software: PyCharm
import cv2

from service.imageService import read_image
from service.recognitionService import recognize_faces
from service.videoService import open_video_capture


def recognize_in_file(image_path):
    image = read_image(image_path)
    image = recognize_faces(image, './model/haarcascade_frontalface_default.xml')
    while True:
        cv2.imshow('Face Recognition Demo 1', image)
        if cv2.waitKey(1) & 0xff == ord('q'):
            break
    cv2.destroyAllWindows()
    return


def recognize_in_video():
    cap = open_video_capture()
    if not cap:
        return
    while True:
        ret, frame = cap.read()
        image = recognize_faces(frame, './model/haarcascade_frontalface_default.xml')
        cv2.imshow('Face Recognition Demo 2', image)
        if cv2.waitKey(1) & 0xff == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
    return


if __name__ == "__main__":
    recognize_in_file("image/1.jpeg")
    # recognize_in_video()


我一共组装了2个人脸识别的业务代码,一个用于识别已有照片中的人脸,即:recognize_in_file() 方法;

另一个用于识别电脑摄像头捕获到的人脸,即recognize_in_video();

8. 准备人脸图片进行人脸识别实验;

准备几张人脸照片,放至face_rec/image下;

人脸照片1 人脸照片2

图片准备好之后,在开始实验前还需要安装相关的python依赖:

  • face_rec下创建文件requirements.txt;
  • 在requirements.txt;声明我们所使用的python包:
numpy==1.20.2
matplotlib~=3.4.1
opencv-python==4.5.1.48
  • 命令行安装依赖:
pip3 install -r requirements.txt

安装完成后,准备开始实验,在main.py中调用recognize_in_file()方法,如:

if __name__ == "__main__":
    recognize_in_file("image/1.jpeg")

或:

if __name__ == "__main__":
    recognize_in_file("image/2.jpeg")

运行main.py后,程序将打开图片展示窗口,如:


人脸识别1 人脸识别2

可以看到,单张人脸的识别,还是挺容易的,而多张人脸,特别是有遮挡(如帽子、眼镜等)的人脸,就没那么容易了,不过作为初学者,这样已经很好了,可以拿来吹吹牛啦~

除了这个模型,读者还可自行替换识别模型.xml文件,比如用于识别眼睛、带眼镜的眼睛、笑容等人脸特征。

9. 使用电脑摄像头进行动态人脸识别实验;

在main.py中调用recognize_in_video()方法,传入图片路径,如:

if __name__ == "__main__":
    recognize_in_video()

运行main.py后,程序将打开视频展示窗口,如:


动态人脸识别1 动态人脸识别2

我们看到,我们已经可以动态识别人脸啦,经试验,是可以同时识别多张人脸的,这也是我第一次在简书露脸,哈哈~

当然,我们这里使用了opencv已训练好的人脸识别模型,我们也可以自己训练准确度更高的人脸识别模型。

甚至,我们还可以自己训练自己的动物、物体、道路、交通工具等识别模型,用于制作物体分类器、照片分类器等,如果有资源,将这样的功能对外提供服务,貌似很快可以迎娶白富美,走上人生巅峰!

关于模型训练,涉及到深度学习,有机会咱们也是要研究研究的,毕竟人工智能对我来说还是挺有吸引力的!

我的项目已上传github,有兴趣的同学可以直接下载来玩一下:

P.S,网上还有一种人脸识别方式,那就是采用:face_recognition,笔者一时半会没搞定环境问题,以后有机会可以再多研究研究,今天咱们就简单玩一下这个简单的人脸识别就好啦~

如果本文对您有帮助,麻烦动动手指点点赞?

谢谢!

相关文章

网友评论

    本文标题:Python人脸识别探索

    本文链接:https://www.haomeiwen.com/subject/gcnplltx.html