前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LBP特征物品识别系统系统结构代码实践

LBP特征物品识别系统系统结构代码实践

作者头像
月见樽
发布2018-08-03 09:55:56
6840
发布2018-08-03 09:55:56
举报

系统结构

structure.png

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

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

LBP特征

原始LBP特征

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

base_lpb.png

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

圆形LBP特征

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

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)。

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

代码语言:javascript
复制
$$
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特征,包括像素级别的特征和区域级别的特征。

分类器

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

代码语言:javascript
复制
$$
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

代码语言:javascript
复制
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特征训练。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系统结构
    • LBP特征
      • 原始LBP特征
      • 圆形LBP特征
      • 系统使用的LBP
    • 分类器
    • 代码实践
      • 使用默认模型测试
        • 训练
        相关产品与服务
        人脸识别
        腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档