LBP特征物品识别系统

公式完整版请移步个人博客

系统结构

7241055-6cadd09d3c6d5762.png
structure.png

LBP是一种常规的人脸识别使用的特征,系统架构如上图所示,主要分为三个部分:

  • 滑动框:滑动框在图片上滑动,产生不同的子图
  • LBP特征提取器:针对滑动框产生的子图,计算LBP特征
  • 分类器:根据LBP特征,判断当前图片是否是人脸

LBP特征

原始LBP特征

原始LBP特征是一个3X3区域的区域特征。考虑一个像素的特征值,该特征值与周围的8个像素(3X3区域)有关,对于像素值大于该像素的周围像素赋值1,其他赋值0,如下图所示:

7241055-9fc637835e282aa4.png
base_lpb.png

如图中红框的中心像素,像素值为134,使用134和红框的其他像素(周围像素)比较,若大于134为1,否则为0,最后周围的8个像素的值依次为00101010,将其视为二进制数,转化为十进制就是42。

圆形LBP特征

圆形LBP特征与原始LBP特征类似,只是周围像素为一个圆形环绕的,如下图所示:

7241055-29b93c0fb0db5f4d.png
c_lbp.png

LBP使用如图所示8个实心点位置的像素计算,其中四个红色实心点不落在像素上,使用双线性插值的方法计算对应的值,最后带入原始LBP的计算方法中计算中间像素的值。该LBP使用(P,R)表示,P表示带入计算的像素点数,R表示半径,如上图即为(8,2)

系统使用的LBP

系统使用的LBP表示为LBP^{u2}_{P,R},其中u2表示统一LBP特征,即像素点的特征值的二进制最多有两次0到1或1到0跳变,如00001111为统一LBP,而10101010不为统一LBP,非统一LBP会被统一复位到一个特定值;P,R即为圆形LBP的(P,R)。

最终计算出所有统计的特征值后可统计出直方图特征,使用以下公式:

$$
H_i  = \sum\limits_{x,y}I\{f_l(x,y)==i\},i = 0,1,...,n-1 \\
I\{A\} = \begin{cases} 1 & A \ is \ true \\ 0 & A \ is \ false
\end{cases}
$$

例如P=8时,最终获得256个数据,以上方法抛弃了空间特性,因此除了整体的直方图特征,还计算区域的直方图特征,将整个图片划分为m个方形区域,依次统计直方图特征:
H_{i,j} = \sum\limits_{x,y} I\{f_l(x,y)=i\}I\{(x,y) \in R_j\},i=0,1,2,...,n-1,j=0,1,...,m-1
此时获得最终LBP特征,包括像素级别的特征和区域级别的特征。

分类器

原论文中使用近邻分类器分类,提出了以下几种计算距离的方法:

$$
Histogram \ intersection:D(S,M) = \sum_imin(S_i,M_i) \\
Log-likelihood \ statistic:L(S,M) = - \sum_iS_ilog(M_i) \\
Chi square \ statistic:\chi^2(S,M) = \sum_i\cfrac{(S_i - M_i)^2}{S_i + M_i} \\
Chi square \ statistic \ with\ weight:\chi^2_w(S,M) = \sum_{i,j}\cfrac{(S_{i,j} - M_{i,j})^2}{S_{i,j} + M_{i,j}}
$$

根据以上距离公式结合近邻分类器可以完成是否是物品的分类。

代码实践

OpenCV中自带LBP+级联分类器的人脸识别模型,同时也提供了训练的相应工具

使用默认模型测试

该代码与使用Harr+级联分类器完全相同,唯一需要改变的是调用的模型文件改为LBP特征模型lbpcascade_frontalface_improved.xml

import cv2

def detectFaces(
        img, path="./haarcascades/haarcascade_frontalface_alt2.xml"):
    face_cascade = cv2.CascadeClassifier(path)
    if img.ndim == 3:
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    else:
        gray = img  
    faces = face_cascade.detectMultiScale(
        gray, scaleFactor=1.3, minNeighbors=2, minSize=(60, 60), maxSize=(300, 300))
    print(faces)
    result = []
    for (x, y, width, height) in faces:
        result.append((x, y, x + width, y + height))
    return result


def drawFaces(img, draw, color=(255, 0, 0)):
    for (x1, y1, x2, y2) in draw:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
    return img

if __name__ == '__main__':
    cap = cv2.VideoCapture(0)
    while(1):
        # get a frame
        ret, frame = cap.read()

        frame_face1 = detectFaces(frame,"haarcascades/lbpcascade_frontalface_improved.xml")
        frame = drawFaces(frame, frame_face1)
        cv2.imshow("capture", frame)
        if cv2.waitKey(1) == 0:
            break

训练

训练部分也与Harr+级联分类器完全相同,唯一需要改变的是使用opencv_traincascade.exe时,添加命令行参数-featureType LBP,含义为指定是利用LBP特征训练。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值