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


theme: scrolls-light

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

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

一、前言

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

1.1 OpenCV

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

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

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

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

cat face
二选一即可 - haarcascadefrontalcatfaceextended.xml - haarcascade_frontalcatface.xml

human face

haarcascadefrontalfacedefault.xml

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

1.2 Pillow

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

1.3 环境安装

在一个安装了Python 3环境的机器执行以下命令安装对应的库。 python pip install opencv-python pillow

1.4 图片准备

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

test1.jpg

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

test2.jpg

二、代码实践

2.1 代码分解

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

python import cv2 from PIL import Image

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

```python catfacecascade = cv2.CascadeClassifier('catfacedetector.xml') humanfacecascade = cv2.CascadeClassifier('humanfacedetector.xml')

```

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

```python 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') ```

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

python 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))

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

```python for (i, (x, y, w, h)) in enumerate(humanfaces): 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.FONTHERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)

for (i, (x, y, w, h)) in enumerate(catfaces): 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.FONTHERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2) ``` 最后,我们将使用检测的面部保存图像。

```python 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的模型文件对于识别的过程相当重要,有些猫咪是不能成功识别的,比如加菲猫,银渐层,可以去找找合适的模型文件。

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

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


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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>