theme: scrolls-light
一起用代码吸猫!本文正在参与【喵星人征文活动】。
彭于晏又酷帅又积极向上,讨人喜欢,猫咪很粘人很可爱,也很讨人喜欢,那么强行发问,现在有一张彭于晏的帅照,我们怎么让机器知道这张照片描述是是猫还是人呢?本文借助于计算机视觉库,识别图片描述的内容是人还是猫?
一、前言
为了快速识别图片的内容,我们借助于Python的两个库,分别是opencv
和Pillow
。
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。
猫咪这张照片命名为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) ```
总的来说我们的工程目录结构如下。
2.2 执行结果
执行程序后,目录中多了许多文件,如下图所示。
看看最终结果。
从结果来看,这一组实验识别结果是准确的。
三、总结
本篇文章算是入门级别的计算机图像识别例子,对于整个OpenCV来说,算是小试牛刀吧!过程并不复杂,有兴趣的同学可以上手实践一把。
在整个实践过程中,OpenCV的模型文件对于识别的过程相当重要,有些猫咪是不能成功识别的,比如加菲猫,银渐层,可以去找找合适的模型文件。
还有由于篇幅的限制,本文的没有讲到对照实验,比如交换图片,用猫的模型文件去识别人,用人的模型文件去识别猫,读者自己去试试吧,过程不难得。
对于更加准确的识别,还是要用数据集训练机器,以便它可以为您提供更好的预测,期待大家评论交流。
少年,没看够?点击石头的主页,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!