OpenCV-Python教程:58.使用Haar Cascades面部识别

基础

使用Haar基于特征的级联分类器记性物体检测是一个很有效的物体检测方法。它是一个基于机器学习的方法,从大量积极和消极的图像里训练一个级联函数。然后用来在其他图像里检测物体。

这里我们来做面部识别,初始状态下,算法需要大量积极图像(面部的图像)和消极图像(没有面部的图像)来训练分类器。然后我们需要从里面提取特征。这用到了下面的图像展示的haar特征。他们就像我们的卷积核一样,每个特征是从黑色矩形的像素和里减去白色矩形的像素和得到的一个值。

现在每个核的所有可能的大小和位置都用来计算很多的特征(可以想象一下需要多啊的计算量,即使是一个24x24的窗口的结果也是超过160000个特征)。对于每个特征计算,我们需要找到黑色和白色方块下的像素和。要解决这个,他们提出了全景图像。它只简单的计算像素和,像素的数量可能是多大,需要运算的只是4个像素。这会让事情变得很快。

但是所有这些要计算的特征里,大部分是无关的,比如下面这张图像,顶上的行显示出两个号的特征,第一个选择的特征看起来集中在眼睛的区域要比鼻子和脸颊的区域要暗这个属性上。第二个选择的特征依赖眼睛比鼻梁要暗这个属性。但是应用在脸颊或者其他地方的同样的窗口是无关的,所以我们如何从160000+个特整理找到最好的特征呢?可以用Adaboost。

我们在所有训练图像上应用每个特征,对每个特征,它找到最佳的阈值来把脸分类成积极的和消极的。但是显然,有误差和分类错误。我们选择错误率最小的特征,这表示这些特征能够最好的分类有脸的图和没脸的图。(这个过程没那么简单,每个图像在开始的权重都一样,每次分类后,错误分类的图像的权重都增加,然后再次执行同样的过程,计算新的错误率,新的权重。持续这个过程直到需要的准确度或者错误率达到标准或者直到了需要的数量的特征)

最后的分类器是这些弱分类器的加权和。他被叫做弱分类器是因为它不能分类图像,只能和其他在一起组成强分类器。论文说即使200个特征也能提供95%的准确率。他们的最终的设置有6000个特征(想象一下从160000+个特征到6000个特征,这是个巨大的节省)

所以现在你取一个图像,取出每个24x24的窗口,应用6000个特征。检查是否它是脸或者不是。这是不是很美效率?是的,作者有个好办法解决。

在图像里,大部分图像区域是非脸的区域,所以最好的办法是有一个简单办法来检查一个区域不是脸。如果不是脸,就把它扔掉。再也不处理。这样我们可以有更多时间来处理有脸的区域。

它们提出了一个概念级联分类器。不用把所有6000个特征应用到一个窗口上,而是把特征分组成不同的阶段,一个一个应用。(一般最开始的几个阶段会包含非常少的特征)。如果一个窗口在最开始阶段失败了,就丢弃,我们不再上面继续尝试剩下的特征,如果通过,应用第二个阶段的特征并持续这个过程。通过了所有阶段的窗口就是脸部区域。

作者的检测器有6000+个特征,38个阶段,最开始的5个阶段有1,10,25,25和50个特征(上面图像的两个特征实际上是从Adaboost得到的最好的两个特征)。根据作者说的,平均来说,对于每个子窗口6000+个特征中改的10个会被评估。

这就是简单直观的介绍Viola-Jones面部识别是如何工作的。

OpenCV里的Haar-cascade检测

OpenCV提供了检测器和训练器。如果你想训练你自己的分类器来识别诸如汽车啊,飞机什么的,你可以使用OpenCV来创建一个。详细内容见:Cascade Classifier Training

这里我们只看检测器,OpenCV已经包含了很多训练过的分类器,面部的,眼睛的,笑容的等。那些XML文件存在opencv/data/haarcascades/目录。让我们创建一张脸和眼的检测器吧。

首先我们需要加载必须的XML分类器,然后用灰度模式加载我们的输入图像(或者视频)。

import numpy as np
import cv2

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

img = cv2.imread('sachin.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

现在我们在图像里找到脸。如果找到脸,它会返回检测到的脸的位置(x, y, w,h)。当我们得到这些位置,我们可以为脸创建一个ROI然后在这个ROI上应用眼睛检测(因为眼睛总是在脸上的!)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容