opencv默认提供了haar特征和lbp特征训练的人脸分类器,但是效果不太好,所以我们可以用opencv提供的跑opencv_traincascade函数来训练一个LBP特征的分类器。(由于opencv3中hog与hog文章定义的不同,因此在opencv3 的opencv_traincascade函数中被删掉了详情

LBP特征

按照官方文档的训练流程:

1. 准备训练数据

首先把正例和负例样本按下面的结构存放:

train
-pos
-- info.dat
-- img
---- 1.jpg
---- 2.jpg
---- ... -neg
-- info.dat
-- img
---- 1.jpg
---- 2.jpg
---- ...

其中正例的info.dat格式如下:其中路径为必须为相对路径,1为图片中目标的个数,x,y为bounding box左上角的坐标;w,h为bounding box的长和宽

img/1.jpg 1 x y w h
img/2.jpg 1 x y w h
# img/3.jpg 2 100 200 50 50 50 30 25 25 # 如果同一图片有多个目标

而负例的格式只是文件名,但*必须为全路径**(opencv坑1):

/path/to/img/1.jpg
/path/to/img/2.jpg

一般来说样本需要覆盖多种大小才能使模型比较鲁棒,对于负例样本来说,需要保证图片尺寸比训练时候的window size大,而从一张负例图片中可以截出许多个负例的window进行训练,因此负例的图片数量与正例差不多的时候可以在训练的时候设定比正例超过10倍的数目。

2. 利用opencv_createsamples生成训练数据集

opencv_createsamples -vec face.vec \   # 输出的数据集vec文件
-info /startdt_data/face_datasets/opencv_face_dataset/train/pos/info.dat \ # 正例的annotation文件,这里需要用全路径,避免报错
-w 112 -h 112 -num 5000 \ # 正例的图片大小和数量
-maxxangle 20 \ # 数据增强:允许的最大的x方向的偏转角
-maxyangle 20 \ # 允许的最大的y方向的偏转角

3. 利用opencv_traincascade训练检测器(以xml文件保存)

opencv_traincascade -data data \  # 模型xml文件保存的目录
-vec face.vec \ # 数据集文件
-bg /startdt_data/face_datasets/opencv_face_dataset/train/neg/info.dat \
-numPos 4200 \ # 这里的数量需要比实际写入的正例图片要小,不然可能会报错
-numNeg 32000 \ # 负例图片数
-numStages 5 \ # stage数越多,训练效果越好,但是耗时也越长
-numThreads 6 \
-featureType LBP \ # 官方文档里面没有说支持HOG,但是在opencv3.4中,通过命令行可以看到有这个参数 ,虽然可以训练,但是已经不支持
-w 112 \
-h 112 \
-precalcValBufSize 4096 \ # (in Mb) Size of buffer for precalculated feature values; size larger, training faster
-precalcIdxBufSize 4096

4. 测试

import cv2

face_detector = cv2.CascadeClassifier("cascade.xml")

img = "test.jpg"
frame = cv2.imread(img)
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_detector.detectMultiScale(frame, 1.3, 3)
for face in faces:
cv2.rectangle(frame, (face[0], face[1]), (face[0]+face[2],face[1]+face[3]), (0, 0, 255), 2)
cv2.imshow("test", frame)
cv2.waitKey(0)

HOG特征

虽然cascade classifier的HOG特征在3.x版本是不能用了(2.4版本还是可以的),但是可以用opencv samples/cpp/train_HOG.cpp(或者是这个库)

首先需要编译.cpp文件获得.o文件(编译opencv的sample文件可以看这里):

g++ `pkg-config --cflags --libs opencv` -o train_HOG opencv/samples/cpp/train_HOG.cpp

训练:

train_HOG --dw=112 \      # 图像的检测窗口高度
--dh=112 \ # 图像的检测窗口高度(与图像有关,但是必须为8的整数倍--脚本内划窗方式决定)
-d \ # 训练2次(提高精度)
--fn=hog_face_detector.xml \ # 输出训练模型文件
-f \
--nd=opencv_face_dataset/train_hog/neg \ # 负例文件目录
--pd=opencv_face_dataset/train_hog/pos \ # 正例文件目录
--td=opencv_face_dataset/train_hog/val \ # 测试文件目录
--tv=test.mp4 # 测试视频文件

测试:

import cv2

hog_face_file = "hog_face_detector.xml"
hog_model = cv2.HOGDescriptor()
hog_model.load(hog_face_file) win_stride = (8, 8)
padding = (16, 16)
scale = 1.05 cam = cv2.VideoCapture(0)
while cam.isOpened():
ret, frame = cam.read()
if ret:
detect_region = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = hog_model.detectMultiScale(detect_region, winStride=win_stride, padding=padding, scale=scale) # 返回tuple(array of bounding box, array of bounding box confidence)
faces = list(faces[0])
if len(faces):
face = faces[0] # 只取概率最高的一个人脸
cv2.rectangle(frame, (face[0], face[1]), (face[0]+face[2], face[1]+face[3]), (0, 0, 255), 2)
cv2.imshow("test", frame)
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()

具体参数意义可以参考这里

参考:

cascade classifier:

train_HOG

opencv利用Cascade Classifier训练人脸检测器的更多相关文章

  1. 【计算机视觉】如何使用opencv自带工具训练人脸检测分类器

    前言 使用opencv自带的分类器效果并不是很好,由此想要训练自己的分类器,正好opencv有自带的工具进行训练.本文就对此进行展开. 步骤 1.查找工具文件: 2.准备样本数据: 3.训练分类器: ...

  2. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  3. 【dlib代码解读】人脸检测器的训练【转】

    转自:http://blog.csdn.net/elaine_bao/article/details/53046542 版权声明:本文为博主原创文章,转载请注明.   目录(?)[-] 综述 代码解读 ...

  4. 【从零学习openCV】IOS7下的人脸检測

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  5. Python 3 利用 Dlib 和 sklearn 人脸笑脸检测机器学习建模

    0. 引言 利用机器学习的方法训练微笑检测模型,输入一张人脸照片,判断是否微笑: 精度在 95% 左右( 使用的数据集中 69 张没笑脸,65 张有笑脸 ): 图1 测试图像与检测结果 项目实现的笑脸 ...

  6. 我的opencv之旅:ios人脸识别

    学习opencv有一年多了,这本来是我的毕业设计的一部分,但是因为不能突出专业重点,所以换了个课题. opencv在vc.android.ios下都能用,其中vc和android下的教程和主题贴最多, ...

  7. 从零到一:caffe-windows(CPU)配置与利用mnist数据集训练第一个caffemodel

    一.前言 本文会详细地阐述caffe-windows的配置教程.由于博主自己也只是个在校学生,目前也写不了太深入的东西,所以准备从最基础的开始一步步来.个人的计划是分成配置和运行官方教程,利用自己的数 ...

  8. 利用百度接口进行人脸识别并保存人脸jpg文件

    利用百度接口进行人脸识别,根据返回的人脸location用opencv切割保存. # coding : UTF-8 from aip import AipFace import cv2 import ...

  9. Cascade Classifier Training 没有基础也会目标检测啦

    Cascade Classifier Training 具体自己看: http://docs.opencv.org/2.4.13.2/doc/user_guide/ug_traincascade.ht ...

随机推荐

  1. C++程序设计方法3:数组下标运算符重载

    数组下标运算符重载 函数声明形式 返回类型operator[](参数): 如果返回类型是引用,则数组运算符调用可以出现在等式的左边,接受赋值,即: Obj[index] = value; 如果返回类型 ...

  2. js 基本包装类型 String

    为了操作基本类型值,ECMAScript提供了三个特殊的引用类型: Boolean , Number , String 举例: var s1 = "some text"; var ...

  3. 设置字体格式,加粗,regular,light

    设置文字大小和字体的途径有两个: 第一种,直接使用xib设置   ,   ,  第二种,使用代码 Label.font = [UIFont fontWithName:.f];//加粗 Label.fo ...

  4. redis:string字符串类型的操作

    1. string字符串类型的操作: 1.1. set 设置单个值 语法:set key value [EX seconds] [PX milliseconds] [NX|XX] 注: EX seco ...

  5. 关于#!/bin/bash和#!/bin/sh

    关于#!/bin/bash和#!/bin/sh   #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只 ...

  6. 【二分】Base Station Sites @ICPC2017HongKong/upcexam5559

    时间限制: 1 Sec 内存限制: 128 MB 5G is the proposed next telecommunications standards beyond the current 4G ...

  7. lettcode笔记--Valid Parentheses

    20.Valid Parentheses Given a string containing just the characters '(', ')', '{', '}', '[' and ']', ...

  8. Hibernate非主键关联

    一. 非主键关联,我们进行外键关联时,通常使用的是主键,但有时候需要使用到其他列时可以通过以下方法设置: 注解中:@JoinColumn(name="city", referenc ...

  9. django之MTV模型(urls,view)

    今天就进入到python最重要的阶段了django框架,框架就像胶水一样会将我们前面学的所有知识点粘合在一起,所以以前有哪些部分模糊的可以看看前面的随笔.本篇主要介绍djangoMTV模型,视图层之路 ...

  10. SQL Server 性能优化实战系列(一)

    数据库服务器主要用于存储.查询.检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性.可靠性和稳定性等方面都有很高的要求.        下面是进行笼统的技术点说明,为的是让大家有一个整 ...