本篇内容介绍如何使用opencv,scipy,tensorflow来实现计算机人脸检测。(用一点也是用 =.=)
先声明一下,本篇内容是在图片中的人脸检测,
调动计算机摄像头的人脸识别链接:
链接:https://blog.csdn.net/weixin_43582101/article/details/88913164
SciPy模块。 安装方法 pip install scipy
SciPy是一款方便、易于使用、专为科学和工程设计的Python工具包.它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等.它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
模块名 | 功能 |
---|---|
scipy.constants | 数学常量 |
scipy.integrate | 插值 |
scipy.misc | 数据输入输出 |
scipy.linalg | 线性代数 |
scipy.ndimage | N维图像 |
scipy.optimize | 优化算法 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.stats | 统计函数 |
还有一些我没有往上写,比如scipy.io,看起来有点多了,我们这里只使用scipy中的misc,跟scipy.io一样都是一种用于输入和输出的实用模块,以图像形式保存数组。因为我们需要对图像进行操作,并且需要使用数组对象来做运算,所以将数组直接保存为图像文件非常有用。
tensorflow。 安装方法 pip install tensorflow
这个先不介绍太多,简单说下。
tensorFlow 是目前世界上最受欢迎的开源机器学习框架。
是一种计算图模型,即用图的形式来表示运算过程的一种模型。Tensorflow程序一般分为图的构建和图的执行两个阶段。图的构建阶段也称为图的定义阶段,该过程会在图模型中定义所需的运算,每次运算的的结果以及原始的输入数据都可称为一个节点。
opencv。 安装方法 pip install opencv-python
装起来可能会有点麻烦,有一些版本兼容问题。安装详情可以看这,python3.6安装open-cv
opencv全称是 open source computer vision library (开源计算机视觉库)
OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口 OpenCV 是跨平台的,可以在
Windows、Linux、Mac OS、Android、iOS 等操作系统上运行。 OpenCV
的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。 OpenCV
还提供了机器学习模块,你可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。
matplotlib。 安装方法 pip install matplotlib
这个应该很熟悉的,最python的绘图库,没啥多说的。下面开始分析代码。
我按照顺序从头到尾来分析这段代码
首先导入库:
from scipy import misc # pip install scipy
import tensorflow as tf # pip install tensorflow
from face_check import detect_face
import cv2 # pip install opencv-python
import matplotlib.pyplot as plt # pip install matplotlib
设置默认值:
minsize = 20 # minimum size of face 最小尺寸
threshold = [ 0.6, 0.7, 0.7 ] # three steps's threshold 阈值
factor = 0.709 # scale factor 网格参数
print('Creating and loading')
tf.Graph().as_default() 表示将这个类实例
tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。
with tf.Graph().as_default(): #将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图
sess = tf.Session(config=tf.ConfigProto(log_device_placement=False))
with sess.as_default():
pnet, rnet, onet = detect_face.create_mtcnn(sess, None)
detect_face函数之图像金字塔
人脸检测的函数是就是detect_face,这个就是人脸检测的核心的难点了。
这个文件是本地导入的,他和全部代码我在最后会补上githup的链接。
检测人脸,返回人脸框和五个关键点的坐标
detect_face在图像中它们返回包围框和点。创建一个扩展的因素金字塔检测图像
image_path = '1.jpg'
img = misc.imread(image_path) #读取图片
bounding_boxes, _ = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)
nrof_faces = bounding_boxes.shape[0] #人脸数目
print('找到人脸数目为:{}'.format(nrof_faces)) #返回检测结果
print(bounding_boxes) ##返回关键点的坐标
通过上面获取的坐标来在我们的要绘制的图中进行数据标注。
astype(int) 变量类型转换
cv2.rectangle通过对角线来画矩形
cv2.resize图片缩放,参数输入是 宽×高×通道
crop_faces=[]
for face_position in bounding_boxes: #遍历一下
face_position=face_position.astype(int) #变量类型转换
print(face_position[0:4])
#通过对角线来画矩形
cv2.rectangle(img, (face_position[0], face_position[1]), (face_position[2], face_position[3]), (0, 255, 0), 2)
crop=img[face_position[1]:face_position[3],
face_position[0]:face_position[2],]
#cv2.resize图片缩放,参数输入是 宽×高×通道
crop = cv2.resize(crop, (96, 96), interpolation=cv2.INTER_CUBIC )
print(crop.shape) #查看矩阵结构
crop_faces.append(crop)
# plt.imshow(crop)
plt.show() #展示
plt.imshow(img) #显示图片
plt.show()
代码从头到尾结束了。其中的from_check import detect_face贴不了
detect_face文件我已经上传到githup
链接:https://github.com/lixi5338619/face_check