前言
来啦老铁!
今天心血来潮,想用Python做点“高大上”的东西,同时也借此机会分享给同事们,以提高大家编程的兴趣,我自己选了个话题:
-
人脸识别探索
整体步骤
- 下载opencv项目;
- 创建人脸识别项目;
- 拷贝人脸识别模型;
- 编写图片读取、展示Service;
- 编写人脸识别Service;
- 编写调用电脑视频能力的Service;
- 组装人脸识别业务代码;
- 准备人脸图片进行人脸识别实验;
- 使用电脑摄像头进行动态人脸识别实验;
1. 下载opencv项目;
git clone https://github.com/opencv/opencv.git
clone完成后,opencv项目的结构如下:
2. 创建人脸识别项目;
新建一个文件夹,例如face_rec,按照我们的预想,在face_rec文件夹下新建几个文件夹:
- image
- model
同时,在face_rec文件夹下创建一个python包:
- service
3. 拷贝人脸识别模型;
将步骤1中的data/haarcascade文件夹下的所有.xml文件拷贝到face_rec/model下,供后续步骤使用;
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下;
图片准备好之后,在开始实验前还需要安装相关的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后,程序将打开图片展示窗口,如:
可以看到,单张人脸的识别,还是挺容易的,而多张人脸,特别是有遮挡(如帽子、眼镜等)的人脸,就没那么容易了,不过作为初学者,这样已经很好了,可以拿来吹吹牛啦~
除了这个模型,读者还可自行替换识别模型.xml文件,比如用于识别眼睛、带眼镜的眼睛、笑容等人脸特征。
9. 使用电脑摄像头进行动态人脸识别实验;
在main.py中调用recognize_in_video()方法,传入图片路径,如:
if __name__ == "__main__":
recognize_in_video()
运行main.py后,程序将打开视频展示窗口,如:
我们看到,我们已经可以动态识别人脸啦,经试验,是可以同时识别多张人脸的,这也是我第一次在简书露脸,哈哈~
当然,我们这里使用了opencv已训练好的人脸识别模型,我们也可以自己训练准确度更高的人脸识别模型。
甚至,我们还可以自己训练自己的动物、物体、道路、交通工具等识别模型,用于制作物体分类器、照片分类器等,如果有资源,将这样的功能对外提供服务,貌似很快可以迎娶白富美,走上人生巅峰!
关于模型训练,涉及到深度学习,有机会咱们也是要研究研究的,毕竟人工智能对我来说还是挺有吸引力的!
我的项目已上传github,有兴趣的同学可以直接下载来玩一下:
P.S,网上还有一种人脸识别方式,那就是采用:face_recognition,笔者一时半会没搞定环境问题,以后有机会可以再多研究研究,今天咱们就简单玩一下这个简单的人脸识别就好啦~
如果本文对您有帮助,麻烦动动手指点点赞?
谢谢!