首页 > 编程知识 正文

opencv人脸识别流程(opencv人脸比对算法)

时间:2023-05-04 11:25:27 阅读:78375 作者:2023

目前,我正在研究脸部分类所涉及的计算机视觉问题。 因为这通常意味着应用深度学习,所以在将图像注入神经网络之前需要特殊的预处理阶段。

为了提高我们模型的精度,这是一项非常重要的任务,可以通过以下简单的步骤完成。 本文提供了OpenCV。 这是一个高度优化的计算机视觉开源库,可用于c、java和Python。

这是一篇简短的文章,其中包含基本准则、示例和代码,可能需要应用于每个脸部的分类和问题识别。

请注意,本文中使用的所有静止图像均来自https://imgflip.com/memetemplates

图片载入

imread (使用函数加载图像,并指定文件的路径和模式。 第二个参数对于动态执行基本通道和深度变换很重要。

mode :3359 docs.opencv.org/4.1.0/D4/da8/group _ img codecs.html # g a61 d9b 0126 a 3e 57 d 9277 AC 4832799 c 80 IMM

要查看图像,请使用imshow (有函数。

cv2.imshow(img ) ) ) ) ) ) ) )。

如果写为类型(img ),则可以看到大小为) height、weight、channels )。

我们的彩色图像有三个通道:蓝色、绿色和红色(在OpenCV中按此顺序)。

可以轻松显示一个通道。

# Example for green channel

img[:0]; img[:2]; cv2.imshow(img ) ) ) ) ) ) ) )。

灰度版本

为了在脸部图像分类中不分心,使用黑白图像是个好主意(两者都试试)。 要获得灰度版本,只需在图像加载函数中指定它,然后将相应的值作为第二个参数传递给:即可

img=cv2.imread('path/image.jpg ',cv2.IMREAD_GRAYSCALE ) )。

现在,我们的图像有另一条通道!

人脸和眼睛检测

在处理人脸分类问题时,我们可能想做个人脸检测验证(,裁剪我们的图像拉直。 使用基于OpenCV中包含的Haar特性的级联分类器进行对象检测。 (https://docs.opencv.org/2.4/modules/obj detect/doc/cascade _ class ification.html )

首先,选择预先训练好的脸部和眼睛检测分类器。 有可用XML文件的列表。 可以使用此列表:

3359 github.com/opencv/opencv/tree/master/data/Haar cascades1)对于面部检测,opencv提供以下(从最松散的先验到最严格的先验) :

Haar cascade _ frontal face _ default.xmlhaarcascade _ frontal face _ alt.xmlhaaarcascade _ frontal face _ alt2. xmlharara

Haar cascade _ eye.xmlhaarcascade _ eye _ tree _ eye gasses.XML以此方法加载预训练的分类器。

face _ cascade=cv2.cascade classifier (cv2.data.Haar cascades‘Haar cascade _ frontal face _ default.XML’)

eyes _ cascade=cv2.cascade classifier (cv2.data.Haar cascades‘Haar cascade _ eye.XML’) )

你能行

以测试几种组合。记住,在所有情况下,它们中没有一个是最优的(如果第一个分类器失败,你可以尝试第二个分类器,或者甚至尝试所有分类器)。

对于人脸检测,我们使用以下代码:

faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)

结果是一个数组,包含所有检测到的人脸。我们可以很容易地画出矩形:

(x, y, w, h) = faces_detected[0] cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1); cv2.imshow(img)

对于眼睛,我们以类似的方式进行搜索,但将搜索范围缩小到面部矩形:

eyes = eyes_cascade.detectMultiScale(img[y:y+h, x:x+w]) for (ex, ey, ew, eh) in eyes: cv2.rectangle(img, (x+ex, y+ey), (x+ex+ew, y+ey+eh), (255, 255, 255), 1)

成啦!

虽然这是预期的结果,但我们会遇到很多其他方面的问题。很多时候,我们没有正面和清晰的人的脸,甚至……

没有眼睛:

眼睛是被白色包围的黑色污点:

此处有4只眼,仅检测到3只眼:

拉直脸部

通过计算两只眼睛之间的角度,我们可以拉直脸部图像(这很容易)。计算后,我们仅需两个步骤即可旋转图像:

rows, cols = img.shape[:2] M = cv2.getRotationMatrix2D((cols/2, rows/2), <angle>, 1) img_rotated = cv2.warpAffine(face_orig, M, (cols,rows))

裁剪脸部

为了帮助我们的神经网络完成面部分类任务,最好去掉背景、衣服或配饰等外部干扰信息。在这种情况下,裁剪脸部是一个很好的选择。

我们需要做的第一件事是从拉直的图像中再次得到人脸矩形。然后我们需要做一个决定:我们可以按原样裁剪矩形区域,或者添加一个额外的填充,这样我们可以获得更多的空间。

这取决于要解决的具体问题(按年龄、性别、种族等分类);也许你想要更多的头发;也许不需要。

最后,裁剪(p表示填充):

cv2.imwrite('crop.jpg', img_rotated[y-p+1:y+h+p, x-p+1:x+w+p])

看!这张脸是孤立的,几乎可以进行深度学习了

图像缩放

神经网络需要所有的输入图像具有相同的形状和大小,因为GPU在同一时间对一批图像应用相同的指令,以达到超级快的速度。我们可以动态地调整它们的大小,但这可能不是一个好主意,因为在训练期间将对每个文件执行多个转换。

因此,如果我们的数据集有很多图像,我们应该考虑在训练阶段之前实现批量调整大小的过程。

在OpenCV中,我们可以使用resize()函数执行向下缩放和向上缩放,有几种可用的插值方法。指定最终尺寸的例子:

cv2.resize(img, (<width>, <height>), interpolation=cv2.INTER_LINEAR)

为了缩小图像,OpenCV建议使用INTER_AREA插值,而要放大图像,可以使用INTER_CUBIC(慢)或INTER_LINEAR(快,效果仍然不错)。

最后是质量和时间之间的权衡。

我做了一个快速的升级比较:

前两幅图像的质量似乎更高(但你可以观察到一些压缩伪像)。

线性方法的结果明显更平滑并且噪点更少。

最后一个是像素化的。

归一化

我们可以使用normalize()函数应用视觉归一化,以修复非常暗/亮的图片(甚至可以修复低对比度)。

该归一化类型(https://docs.opencv.org/3.4/d2/de8/group__core__array.html#gad12cefbcb5291cf958a85b4b67b6149f) 在函数参数中指定:

norm_img = np.zeros((300, 300)) norm_img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)

例子:

当使用图像作为深度卷积神经网络的输入时,不需要应用这种归一化。

在实践中,我们将对每个通道进行适当的归一化,比如减去平均值,然后除以像素级的标准差(因此我们得到平均值0和偏差1)。如果我们使用迁移学习,最好的方法总是使用预先训练的模型统计数据。

结论

在处理人脸分类/识别问题时,如果输入的图像不是护照图片,则检测和分离出人脸是一项常见的任务。

OpenCV是一个很好的图像预处理库,但不仅仅如此。它也是一个强大的工具,为许多计算机视觉应用…

来看文档吧!

https://docs.opencv.org/master/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。