Haar-like特征之人脸检测

    技术2022-07-20  72

    Haar特征之人脸检测

    haar特征人脸检测的4个步骤:

    提取人脸的haar-like特征每个haar-like特征使用类似cart的二分类决策树判别区域是否为人脸【两类:人脸 | 非人脸】,每个haar-like特征经过判别训练得到判别阈值构成多个最优弱分类器(且挑选了最优的haar-like特征)多个弱分类器级联构成强分类器【此步实际是在进行多个弱分类投票进行二分类的过程】级联多个强分类器进行人脸检测与分类

    弱分类器指的是效果比盲猜好的分类器

    1.提取Haar特征

    Haar特征是指把图像划分成多个长方形区域,对这些长方形区域计算像素值的总和,并比较与此长方形区域的其他邻接长方形区域像素总和的差异,并把差异值做为haar-like的特征值

    haar-like特征最初有三种类型 haar 后来新增的几个模式 在提取Haar-Like特征的时候,我们利用不同尺寸的不同模式的Haar-like特征对图像进行提取,这就导致提取到大量的特征,且这些特征之间几乎没有相关性,所以我们需要确定对分类最有用的特征 对分类最有用的特征: 拿人脸举例来说,额头的区域总是比眼睛区域亮很多,鼻梁总是比两边的眼睛部分亮很多。因为这些特点的存在,当我们拿下图所示的两种模式提取haar特征,能得到最大的haar特征值 更多模式用于提取人脸特征

    2.每个haar-like特征构成弱分类器

    每个弱分类器只包含一个Haar-like特征,经过分类训练的每个Haar特征会获得一个阈值,(只有图片提取的该Haar特征值大于阈值,才会判定为人脸)

    注:决策树的功能是选择最优分类特征,并分类, 只是对于弱分类器来说,分类只是简单的区分是不是人脸

    构造一个最优弱分类器(此部分只会简述cart决策树的做法) 比如构造haar_like特征f1作为弱分类器的阈值,会计算每个样本的f1特征值,然后对所有样本的f1特征值进行排序,然后按顺序依次选择每个样本的f1特征值作为分类阈值,最后比较按照每个样本阈值进行分类的分类误差,选择分类误差最小的作为最终该弱分类器阈值

    3.多个最优弱分类器根据投票权重构成强分类器

    强分类器的生成: 1.初始化所有样本权重为1/N (N为样本总数) 2.迭代训练N个样本得到第一个最优分类器 3. 如果是非首次的弱分类器,接收了上一弱分类器的把负样本错分为正样本的样本进行训练,那在被训练前,该类样本会被提高权重,然后和被正确分类为正样本的样本一起被用来训练本次的弱分类器 4.将被本次的弱分类器分类为正样本的样本集送入下一弱分类器,循环3,4,直至得到T个最优弱分类器 5.组合T个最优弱分类器得到强分类器

    训练好的强分类器的分类是由多个最优弱分类器共同决定的,多个最优弱分类器在进行投票时具有不同的投票权重,最终按权重加和得到分类结果 对于训练一个强分类器最重要的一点,就是当某个分类器判别出该区域或该图像无目标(无人脸),就不进行下一步的分类,直接判定为无目标(无人脸) 如下图假定有三个haar-like特征(f1,f2,f3)

    4.多个强分类器进行级联进行多阶段分类与检测

    对多个训练好的强分类器进行级联,对人脸图片进行检测。每个强分类器在检测过程按照顺序被称作stage,stage1表示第一个强分类器,下图展示强分类器训练的过程,其中false-postive表示原来是负样本被错分为正样本。

    如何进行检测

    haar人脸检测采用固定图像大小,采用不同尺度的滑动窗口依次滑动整张图像进行检测

    人脸检测步骤 1.选取当前滑动窗口对应的图像区域进行检测和分类,把对应的区域放入第一个强分类器,只要强分类器的任意弱分类器判别此区域不含人脸,就结束检测,并滑动窗口至下一区域。若第一个强分类器判别出该部分含有人脸,就会送入下一强分类器进行再检测和分类,【此后的过程和第一个强分类器,检测为无人脸即滑动检测下一区域,若检测为有人脸,则传至下一强分类器判别为有人脸】,如果最后一个强分类器判别为有人脸,则以窗口作为整张图片的人脸检测框。 2.从小到大,尝试不同尺寸的滑动窗口进行检测,并都进行步骤1.

    此部分参考Haar Cascade

    opencv下的haar人脸检测

    import cv2 as cv from matplotlib import pyplot as plt filename = '1234.jpg' face_cascade = cv.CascadeClassifier(r'C:\software\anaconda3\envs\ML\Library\etc\haarcascades\haarcascade_frontalface_default.xml') img = cv.imread(filename)[:,:,::-1] gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) print(faces) for (x, y, w, h) in faces: img = cv.rectangle(img.copy(), (x, y), (x+w, y+h), (255, 0, 0), 2) plt.imshow(img)

    推荐阅读 https://www.cnblogs.com/BlueFire-py/p/9396837.html

    Processed: 0.008, SQL: 9