LBP特征检测算子-人脸检测

简介

继续跟着datawhale组织学习LBP特征检测算子,人脸检测算法,虽然现在主流都是用深度学习了,但是学一下传统的方法,对于未来学习深度学习也会更加得心应手一些~

LBP是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性的特点,有点像vslam中的计算ORB的方法,再考虑描述子,来判断图像的旋转。LBP常用于人脸检测和目标检测,也可以使用LBP特征训练目标检测分类器的方法,

算法理论介绍

LBP原理介绍

我就大概总结一下原理吧,就不贴具体公式了,LBP特征就死利用图像的局部的联合概率分布,来描述图像的特征,也即当前的像素点和周围一圈像素之间的关系,我们认为中信的像素和局部邻域像素是相互独立的,那么就可以表示成

T = t ( g c , g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1 ≈ t ( g c ) t ( g 0 − g c , … , g p − 1 − g c ) \begin{aligned} T &=t\left(g_{c}, g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1 \\ & \approx t\left(g_{c}\right) t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \end{aligned} T=t(gc,g0gc,,gp1gc)p=0,,P1t(gc)t(g0gc,,gp1gc)

最后经过整理得上式说明,将纹理特征定义为邻域像素和中心像素的差的联合分布函数

一般通俗解释为,周围一圈像素与它进行比较,分为比它大的和比他小的,然后产生8为二进制数。8位二进制数就反映了像素周围区域的纹理信息。

圆形的LBP算子

基本的LBP算子只能覆盖一个固定范围的小区域,为了适应不停尺度的纹理,可以将3*3邻域拓展到任意大的邻域,并用圆形邻域代替了正方形邻域,这样可以得到采样半径范围内的点。

LBP的旋转不变性

以上的LBP只实现了灰度不变,但是并未实现旋转不变,同一副图像旋转后,特征差异很大,具体实现方法如下:
不断旋转图形邻域得到一系列初始定义的LPB值,取最小值作为该邻域的值


求取旋转不变的LPB特征示意图

等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。

  比如:00000000,11111111,11110010,10111111都是等价模式。

  检查某种模式是否是等价模式:
U ( G p ) = ∣ s ( g p − 1 − g c ) − s ( g 0 − g c ) ∣ + ∑ p = 1 P − 1 ∣ s ( g p − g c ) − s ( g P − 1 − g c ) ∣ (2-8) U\left(G_{p}\right)=\left|s\left(g_{p_{-1}}-g_{c}\right)-s\left(g_{0}-g_{c}\right)\right|+\sum_{p=1}^{P_{-1}}\left|s\left(g_{p}-g_{c}\right)-s\left(g_{P-1}-g_{c}\right)\right|\tag{2-8} U(Gp)=s(gp1gc)s(g0gc)+p=1P1s(gpgc)s(gP1gc)(2-8)

  将其和其移动一位后的二进制模式按位相减。并绝对值求和。若U ( G p ) \left(G_{p}\right) (Gp) 小于等于2,则为等价模式。

通俗将就是认为最多有两次跳变,我们认为是等价的

人脸检测流程

  人脸检测过程采用多尺度滑窗搜索方式,每个尺度通过一定步长截取大小为20x20的窗口,然后将窗口放到分类器中进行是不是人脸的判决,如果是人脸则该窗口通过所有分类器;反之,会在某一级分类器被排除。


图 2.3.5 人脸检测流程图

基于opencv的实现

  • 使用OpenCV的LBP于预训练模型
  • 将haarcascade_frontalface_default.xml下载至本地以方便调用,下载链接:https://github.com/opencv/opencv/blob/master/data/lbpcascades/lbpcascade_frontalface_improved.xml
#coding:utf-8
import cv2 as cv

# 读取原始图像
img= cv.imread('*.png')
#face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

face_detect = cv.CascadeClassifier("lbpcascade_frontalface_improved.xml")
# 检测人脸
# 灰度处理
gray = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)

# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 2, minNeighbors = 2) # maxSize = (55,55)
print ('识别人脸的信息:\n',face_zone)

# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
    # 绘制矩形人脸区域
    cv.rectangle(img, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)
    # 绘制圆形人脸区域 radius表示半径
    cv.circle(img, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)

# 设置图片可以手动调节大小
cv.namedWindow("Easmount-CSDN", 0)

# 显示图片
cv.imshow("Easmount-CSDN", img)

# 等待显示 设置任意键退出程序
cv.waitKey(0)
cv.destroyAllWindows()

总结

  以LBP为特征的检测及识别算法并不具有竞争力,但是作为学习案例还是很有借鉴意义的,有助于理解深度学习做人脸检测相关的概念~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值