系统结构

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

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

LBP特征

原始LBP特征

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

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

圆形LBP特征

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

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

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

例如P=8时,最终获得256个数据,以上方法抛弃了空间特性,因此除了整体的直方图特征,还计算区域的直方图特征,将整个图片划分为m个方形区域,依次统计直方图特征:

此时获得最终LBP特征,包括像素级别的特征和区域级别的特征。

分类器

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

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

代码实践

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

使用默认模型测试

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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特征训练。