人脸识别
人脸识别对于我们今天已经不是什么稀奇的事,人脸识别无论是在门禁还是手机上都是必备的一项功能。今天我们就来聊一聊如何实现一个人脸识别系统。现在有很多库都支持人脸识别功能。今天用到是 MTCNN 结合 faceNet 来实现。
MTCNN (Multi-task Cascaded Convolutional Networks)
Multi-task Cascaded Convolutional Networks 多任务级联卷积神经网络,从字面上看就是这个意思。这里相对比较陌生的单词是 Cascaded,有瀑布落下和串联的意思。也就是说明我们图片进入到 MTCNN 后会被顺序处理,分别是图片缩放、P-Net、R-Net 和 O-Net,随后我们会按阶段给大家分析一下每一个阶段都做了哪些事情。
图片金字塔
mtcnn_001.jpg我们都知道图片中的人脸尺寸有大有小,我们如何选择合适的预测框来框住人脸,这是我们第一个要解决的问题。我们通过使用不同尺寸的预测框,在图片上移动预测框来作为人脸检测的候选框。但是这个预测框需要最后需要输入到卷积通过 softmax 来进行判断,所以需要预测框大小一致,这样才可以进行卷积运算。所以可以通过调整图片大小而保持预测框大小不变来达到相同目的。
通常在 MTCNN 会定义一个 尺寸的预测框作为候选框。图片按一定系数进行缩放,知道缩放尺寸小于 12 为止。
import cv2
img = cv2.imread('face_dataset/ironman_actor.jpg')
img_lvl_01 = cv2.pyrDown(img)
img_lvl_01 = cv2.cvtColor(img_lvl_01,cv2.COLOR_BGR2RGB)
img_lvl_02 = cv2.pyrDown(img_lvl_01)
plt.imshow(img_lvl_01)
plt.show()
plt.imshow(img_lvl_02)
plt.show()
output_1_0.png
output_1_1.png
output_1_1.png
以上就是下图(Resize)的步骤,有了这些尺寸不同图片了,我们就可以开始使用预测框在图片上按照一定步长来进行移动。通过 P-Net 我们会筛选掉一些预测框。每一个预测框五个数据,分别是表示预测框左上角和右下角的点坐标值和一个预测框的置信度的值。我们看一看如何通过计算来筛选掉一些不合适的框。这里介绍两个技术用于去掉多余的预测框。这里有许多预测框,这些预测框彼此两两重叠。
mtcnn_003.png
这里介绍一下 IOU 其实很简单就是两个矩形面积的交集除以这两个矩形的并集。这是用来衡量两个矩形重叠率,为什么要除以他们面积并集呢。这是为了将不同大小的矩形进行归一化所以除以面积来得到一个概率而不是单纯地考虑他们之间面积交集。通过计算重叠度我们就可以容易地检测出图片中的多个检测目标(人脸)。也就是将多个两两重叠预测框视为一个目标。这个如果大家不能理解,随后留言我通过图示给大家解释一下。
网友评论