HAAR级联分类器原理是什么如何训练特征模型
HAAR级联分类器信息介绍
HAAR级联分类器是一种基于机器学习的目标检测算法,2001年由Viola和Jones两位研究者提出,名字里的“HAAR”其实来源于 Haar wavelet(哈尔小波),因为它用的特征和小波分析有关联。这种算法最牛的地方在于能快速从图像里定位目标,比如人脸、行人、车牌这些我们想找的东西,它不是一下子把整个图像看个遍,而是用“级联”的方式一层层筛选,先把肯定不是目标的区域扔掉,再对剩下的区域仔细检查,所以速度特别快,在早期没有深度学习的时候,简直是目标检测领域的“扛把子”,我最早接触它是大学做课程设计,当时老师说“想做人脸检测?HAAR级联安排上”,那时候才知道原来手机相机里的人脸框背后藏着这么个厉害角色。
现在虽然深度学习模型越来越火,但HAAR级联分类器因为简单、速度快、对硬件要求低,依然在很多场景里发光发热,比如一些老旧的监控设备,或者手机上需要实时响应的小程序,用它就很合适,而且它的原理不复杂,理解起来门槛低,特别适合刚入门计算机视觉的同学学习,算是经典中的经典了。
HAAR特征核心原理
HAAR特征说白了就是图像里一些简单的矩形区域,通过计算这些区域的像素和差异来描述图像特征,你可以把它想象成给图像盖不同形状的“小印章”,每个印章就是一种HAAR特征,比如边缘特征(像两个相邻的黑白色块)、线段特征(竖条或横条)、斑点特征(中间亮四周暗或者反过来)。这些特征组合起来,就能勾勒出目标的大致轮廓。
光有特征还不够,关键是“级联分类器”这个设计,它就像工厂里的流水线,前面站着“粗筛员”,后面站着“精筛员”,最开始的分类器很简单,用几个特征就能把明显不是目标的区域(比如全是背景的地方)排除掉;中间的分类器稍微严格点,再筛掉一批;最后几个分类器特别“挑剔”,只有真正的目标才能通过所有关卡,这样一层层下来,既能保证检测准度,又大大减少了计算量,所以才能做到实时检测,我之前用它检测人脸时,发现它对正面人脸特别敏感,稍微侧脸一点就容易漏掉,后来才知道是因为训练时用的正面样本多,特征主要针对正面脸设计的。

HAAR模型训练步骤
训练一个HAAR级联模型,第一步得准备“食材”——样本。正样本是包含目标的图片,比如你要训练人脸检测模型,就收集几百上千张人脸图片,而且要统一大小,比如24x24像素;负样本是不包含目标的图片,可以是风景、建筑、动物这些,数量要比正样本多,最好是正样本的3-5倍,我第一次收集样本时偷懒,正样本只找了100张,结果训练出来的模型根本不认人脸,后来乖乖找了500张才好点。
样本准备好后,就用工具提取HAAR特征,每张图片能提取出超多特征,比如24x24的图片能有上万个特征,这么多特征没法直接用,得用Adaboost算法“挑”出最有用的,Adaboost会从所有特征里选那些区分能力强的(比如能准确分开人脸和非人脸的特征),训练成“弱分类器”,然后把这些弱分类器串起来,组成级联分类器,前面的弱分类器简单但快,后面的越来越复杂,训练时还要不断调整参数,比如每一级分类器的阈值、特征数量,直到模型在测试集上表现稳定,我当时用OpenCV的opencv_traincascade工具训练,跑了一晚上才出结果,虽然慢,但看到模型能准确框出人脸时,感觉值了。
HAAR级联应用场景
HAAR级联分类器的应用场景可不少,最经典的就是实时人脸检测,手机相机的“笑脸抓拍”、视频会议的人像框、门禁系统的人脸解锁,很多都用过它,我朋友公司做的廉价门禁设备,就是用HAAR级联做人脸检测,成本低还好用,老板开心得不行。
除了人脸,它还能用于监控行人追踪,马路上的监控摄像头需要实时数人数、追踪行人移动,HAAR级联因为速度快,能满足实时性要求,虽然 accuracy 不如深度学习模型,但胜在硬件要求低,老旧摄像头也能跑,还有车牌识别系统,先用车牌的HAAR模型定位车牌位置,再交给OCR识别字符,整个流程又快又稳,甚至在一些工业场景,比如检测产品表面的缺陷,只要缺陷形状比较固定,也能用HAAR级联来定位。
HAAR使用注意事项
用HAAR级联分类器时,有几个坑得注意,首先是样本质量影响检测效果,正样本如果拍得模糊、角度奇怪,或者负样本里混进了目标,模型训练出来就会“瞎认”,我之前试过用网上下载的模糊人脸图当正样本,结果模型把我家猫的脸都当成人脸框起来了,尴尬得不行。
它对光照变化很敏感,如果图片太亮或太暗,HAAR特征的像素差异会变弱,检测 accuracy 就下降,有次我在逆光环境下测试人脸检测,模型几乎失灵,后来在代码里加了个亮度均衡的预处理,才好一点。模型轻量化处理也很重要,特征数量太多会让模型变慢,尤其是在手机这类设备上,得适当减少特征数量,平衡速度和 accuracy,别指望它检测太复杂的目标,比如姿态多变的动物、不规则的物体,它更擅长“规矩”的目标。
HAAR与同类工具对比
和HAAR级联分类器比的工具,常见的有HOG特征和CNN(卷积神经网络),先看HOG特征,它是通过计算图像局部区域的梯度方向直方图来描述特征,比HAAR特征更丰富,能捕捉目标的形状细节,所以在行人检测上表现不错,但HOG特征计算量大,速度比HAAR慢,不适合对实时性要求高的场景,我之前用HOG做人脸检测,在电脑上跑一张图要半秒,HAAR只要0.1秒,差距明显。

再看CNN,现在深度学习的大热门, accuracy 甩HAAR几条街,能检测各种复杂目标,还能处理遮挡、变形,但CNN需要大量标注数据,训练时间长,而且跑起来需要GPU支持,对硬件要求高,HAAR的优势就很明显了:计算速度快适合实时应用,对硬件要求低,手机CPU、老旧设备都能跑,在简单场景下性价比高,比如做个小玩具、低成本设备,HAAR绝对是首选;要是追求高精度、复杂场景,那还是得上CNN。
HAAR特征训练实操案例
上个月我帮朋友做一个简单的“宠物猫检测”小程序,他想让程序能从照片里自动框出猫脸,我一想,HAAR级联正好合适,就动手试了试,第一步是收集样本,正样本我从网上找了300张不同品种的猫脸图片,统一裁剪成32x32像素;负样本找了500张风景、家具、狗的图片,确保里面没有猫,然后用OpenCV的opencv_createsamples工具生成vec文件,这里得注意正样本的路径不能错,不然生成的vec文件是空的,我第一次就踩了这个坑,白忙活半小时。
接着用opencv_traincascade训练,设置特征类型为HAAR,等级数15级,每级弱分类器数量20个,训练过程有点慢,我用的笔记本跑了5个小时才结束,生成了一个cascade.xml模型文件,然后写Python代码调用模型测试,一开始用朋友家猫的照片,结果模型把猫耳朵当成猫脸框了,漏了真正的脸,我分析是正样本里耳朵特写太多,负样本里没有类似耳朵的图片,于是又补了100张包含耳朵的负样本,重新训练,这次效果好多了,虽然偶尔还是会把圆形的闹钟认错,但大部分猫脸都能准确框出来,朋友直夸“牛啊,比我自己找还快”,这个过程让我明白,样本质量和数量真的太重要了,想偷懒是不行的。
常见问题解答
HAAR级联分类器是啥呀用来做什么的?
HAAR级联分类器就是一种能从图片或视频里快速找到特定目标的算法,比如找人脸、行人这些,它就像个超级侦探,用很多小方块特征当线索,一层层筛选,把不是目标的区域快速排除,留下可能是目标的地方再仔细看,手机相机里的人脸解锁、监控里的行人追踪,很多都是用它做的,又快又方便,对电脑配置要求还不高,学生党也能轻松上手玩起来~
HAAR特征和HOG特征有啥不一样啊?
HAAR特征和HOG特征都是描述图像的工具,但看东西的方式不一样,HAAR特征像用不同形状的小印章盖在图片上,算每个印章区域的像素和差异,比如找边缘、斑点这些简单特征,算得快;HOG特征是看图片里每个小区域的梯度方向,把这些方向信息统计起来,能描述更复杂的形状,不过算起来慢一点,打个比方,HAAR是速写,几笔勾勒轮廓;HOG是工笔画,细节更丰富,各有各的好~
怎么用OpenCV训练自己的HAAR模型啊?
用OpenCV训练HAAR模型分四步走,超简单!第一步,找正样本(你要检测的目标图片,比如猫脸)和负样本(不是目标的图片,比如风景),正样本要统一大小,负样本越多越好,第二步,用opencv_createsamples工具把样本做成vec文件,就像把食材打包好,第三步,用opencv_traincascade工具训练,设置好特征类型、训练轮数这些参数,等着它跑完就行,第四步,得到.xml模型文件,就能用代码调用检测目标啦,是不是很 easy?我第一次练的时候花了一天,现在熟了两小时搞定~
HAAR级联分类器适合检测什么样的目标呀?
HAAR级联分类器适合检测那些特征明显、形状变化不大的目标,比如人脸、眼睛、车牌、书的封面这些,因为它是用简单的矩形特征拼起来的,太复杂或者老变形状的目标,比如跳舞的人、姿势多变的小狗,它可能就懵了,不过在固定场景里,比如监控拍门口的人脸,它跑得又快又准,性价比超高,很多小设备都爱用它,毕竟又便宜又好用~
HAAR模型能在手机上用吗会不会很卡?
HAAR模型在手机上用完全没问题,甚至比很多算法都流畅!因为它计算量小,不需要手机有多么强的芯片,普通的CPU就能轻松带起来,你看手机相机打开时,人脸框是不是秒出现?很多就是用的HAAR级联,不过要是模型里特征太多、太复杂,可能会有点卡,所以训练的时候记得“减肥”,少用点特征,保证速度的同时不影响检测效果,这样手机用起来就丝滑得很~


欢迎 你 发表评论: