Python人脸识别探索

前言

来啦老铁!

今天心血来潮,想用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,笔者一时半会没搞定环境问题,以后有机会可以再多研究研究,今天咱们就简单玩一下这个简单的人脸识别就好啦~

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

谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容