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

news/2024/10/18 14:21:10/

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

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

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


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


http://www.ppmy.cn/news/330593.html

相关文章

【学习笔记】[AGC002E] Candy Piles

这种不对称操作还挺恼人的。 写了一个看着很对的贪心做法,但是好像是伪的,看来我是纯纯的 joker \text{joker} joker了。 这题难点在于将博弈问题转化为图论问题。但是不看题解好像真的很难往这方面去想。 不妨考虑原数组的差分序列,每次操…

【Linux】浅谈文件原理与操作

目录 问题引入 浅谈文件原理 文件操作 文件的打开与关闭 open close write与read 再谈C库文件操作 问题引入 🌸以前我们学过C语言的文件操作,而不同语言的文件操作都是不一样的,我们该如何理解这一现象,能不能用一种统一…

尚硅谷项目三 TSUtility和Data

尚硅谷项目三 TSUtility和Data TSUtility package com.atguigu.team.view;import java.util.*; /*** * Description 项目中提供了TSUtility.java类,可用来方便地实现键盘访问。* author * version * date **/ public class TSUtility {private static Scanner sca…

JAVA项目开发团队分配管理软件的开发与心得体会

这次开发的项目开发团队分配管理软件是一个基于JAVA面像对象的一个基于文本界面的一个开发项目,它主要是用到我们之前所学的封装,继承,多态,其次考验了我们对异常的使用处理以及数组,arraylist集合的使用 这个项目主要…

java课程设计——开发团队调度软件

尚硅谷java项目三 文章目录 domain文件ArchitectDesignerEmployeeEquipmentNoteBookPCPrinterProgrammer service文件DataNameListServiceStatusTeamExceptionTeamService view文件TeamViewTSUtility domain文件 Architect package work3.domain;public class Architect exte…

JAVA基础小结(项目三)

• 模拟实现一个基于文本界面的 《 开发团队调度软件 》 • 熟悉 Java 面向对象的高级特性,进一步掌握编程技巧和调试技巧 • 主要涉及以下知识点: 类的继承性和多态性 对象的值传递、接口 static 和 final 修饰符 特殊类的使用:包装类 、…

java项目三之开发团队调度软件

一、 team.uti包的设计 此包只包含一些工具类TSUtility类。 TSUtility类的设计 此类为一个工具类,用来进行键盘的交互。 package team.uti;import java.util.Scanner;public class TSUtility {private static Scanner sc new Scanner(System.in);/*** * Descri…

# Java-day17(项目三 1、开发团队调度软件实现部分)

# Java-day17(项目三 1、开发团队调度软件实现部分) com.atguigu.team.domainArchitect.javaDesigner.javaEmployee.javaEquipment.javaNoteBook.javaPC.javaPrinter.javaProgrammer.java com.atguigu.team.serviceData.javaNameListService.javaStatus.…