人脸识别 | Hi 你说,彭于晏是猫咪还是人,还是?

一起用代码吸猫!本文正在参与【喵星人征文活动】

彭于晏又酷帅又积极向上,讨人喜欢,猫咪很粘人很可爱,也很讨人喜欢,那么强行发问,现在有一张彭于晏的帅照,我们怎么让机器知道这张照片描述是是猫还是人呢?本文借助于计算机视觉库,识别图片描述的内容是人还是猫?

一、前言

为了快速识别图片的内容,我们借助于Python的两个库,分别是opencvPillow

1.1 OpenCV

OpenCV全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。

OpenCV可用于解决如下领域的问题:

  • 增强现实
  • 人脸识别
  • 手势识别
  • 人机交互
  • 动作识别
  • 运动跟踪
  • 物体识别
  • 图像分割
  • 机器人

OpenCV已经包含脸部,眼睛,微笑等许多预先训练的分类器,这些XML文件存储在GitHub仓库上。

cat face
二选一即可

  • haarcascade_frontalcatface_extended.xml
  • haarcascade_frontalcatface.xml

human face

haarcascade_frontalface_default.xml

下载两个文件到工程目录,cat face 文件重命名为catface_detector.xml;human face 文件重命名为humanface_detector.xml。

1.2 Pillow

Python Imaging Library 是一个免费的开源附加库,可以支持打开、操作和保存多种不同的图像文件格式,刚开始名为PIL,但在2011年停止了开发,后面一个名为Pillow的项目基于PIL分支继续支持了图像的相关操作,并且支持了Python 3。

1.3 环境安装

在一个安装了Python 3环境的机器执行以下命令安装对应的库。

pip install opencv-python pillow
复制代码

1.4 图片准备

为了验证编写程序的准确性,我们下载两张图片,分别是彭于晏和猫咪。 彭于晏这张照片命名为test1.jpg。

test1.jpg

猫咪这张照片命名为test2.jpg。

test2.jpg

二、代码实践

2.1 代码分解

首先我们创建一个python的文件cv.py,文件先声明导入Python环境下我们要使用到的两个库。

import cv2
from PIL import Image
复制代码

然后加载工程目录下得脸部特征模型文件到程序。

catface_cascade = cv2.CascadeClassifier('catface_detector.xml')
humanface_cascade = cv2.CascadeClassifier('humanface_detector.xml')

复制代码

接下来首先让我们调整图像大小,以便它们的大小相同。接下来,我们将它们转换为灰度,我们的模型使用灰度图像更快。最后,让我们将编辑的准备图像导入我们的程序,以便我们可以运行猫面和人脸检测模型

newsize = (600, 600)
imgr1 = Image.open("test1.jpg")
imgr1 = imgr1.resize(newsize)
imgr1.save("resized1.jpg")

imgr2 = Image.open("test2.jpg")
imgr2 = imgr2.resize(newsize)
imgr2.save("resized2.jpg")

imgr1 = imgr1.convert('L') 
imgr1.save('ready1.jpg')

imgr2 = imgr2.convert('L')
imgr2.save("ready2.jpg")

# Read the input image
img1 = cv2.imread('ready1.jpg')
img2 = cv2.imread('ready2.jpg')
复制代码

现在是时候探测面孔了。我们将运行两行代码。第一个检测图像中的人面。第二行是检测图像中的猫面。

human_faces = humanface_cascade.detectMultiScale(img1, scaleFactor=1.3, minNeighbors=5, minSize=(75, 75))
cat_faces = catface_cascade.detectMultiScale(img2, scaleFactor=1.3, minNeighbors=5, minSize=(75, 75))
复制代码

接下来我们将在检测到的面上绘制矩形。这些矩形可以是不同的颜色,并且它们的厚度水平也是可调的。

for (i, (x, y, w, h)) in enumerate(human_faces):
   cv2.rectangle(img1, (x, y), (x+w, y+h), (220, 90, 230), 3)
   cv2.putText(img1, "Human Face - #{}".format(i + 1), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)

for (i, (x, y, w, h)) in enumerate(cat_faces):
   cv2.rectangle(img2, (x, y), (x+w, y+h), (0,255, 0), 3)
   cv2.putText(img2, "Cat Faces - #{}".format(i + 1), (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2)
复制代码

最后,我们将使用检测的面部保存图像。

cv2.imwrite("faces_detected1.png", img1)

cv2.imwrite("faces_detected2.png", img2)
复制代码

总的来说我们的工程目录结构如下。

image.png

2.2 执行结果

执行程序后,目录中多了许多文件,如下图所示。

image.png

看看最终结果。

faces_detected1.png

faces_detected2.png

从结果来看,这一组实验识别结果是准确的。

三、总结

本篇文章算是入门级别的计算机图像识别例子,对于整个OpenCV来说,算是小试牛刀吧!过程并不复杂,有兴趣的同学可以上手实践一把。

在整个实践过程中,OpenCV的模型文件对于识别的过程相当重要,有些猫咪是不能成功识别的,比如加菲猫,银渐层,可以去找找合适的模型文件。

还有由于篇幅的限制,本文的没有讲到对照实验,比如交换图片,用猫的模型文件去识别人,用人的模型文件去识别猫,读者自己去试试吧,过程不难得。

对于更加准确的识别,还是要用数据集训练机器,以便它可以为您提供更好的预测,期待大家评论交流。


少年,没看够?点击石头的主页,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!

おすすめ

転載: juejin.im/post/7027986121313222663