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. Flask 三方组件 Flask-Session

    使用 from flask import session, Flask from flask_session import Session from redis import Redis app = ...

  2. python-循环小练习

    作业:登录程序,最多循环输入三次,账号密码校验输入为空的情况: 知识点总结 1.while和for循环的区别是,1个需要定义计数器,1个不需要定义计数器: 2.break正常循环结束后会用到,意思是不 ...

  3. sort函数比较cmp写法

    hihocoder1566http://hihocoder.com/problemset/problem/1566 一直WA因为cmp的写法写错了,未能正确实现排序功能. #include<io ...

  4. IDEA手工添加webapp目录

    自己手工建目录,是没法识别的,在自己手工建的webapp文件夹上右键菜单,Make Directory As也没有相应的选项 解决方案是 File->Project Structure

  5. C# SemaphoreSlim 实现

    当多个任务或线程并行运行时,难以避免的对某些有限的资源进行并发的访问.可以考虑使用信号量来进行这方面的控制(System.Threading.Semaphore)是表示一个Windows内核的信号量对 ...

  6. Linux系统下分析内存使用情况的管理工具

    有许多办法可以获得Linux系统上所安装内存的信息,并查看其中有多少内存正在使用中.有的命令会展示大量的细节,而有的命令则提供了简洁(但不一定容易理解)的结果.在这篇文章中将介绍一些更有用的工具,帮助 ...

  7. Android必学之数据适配器BaseAdapter

    什么是数据适配器? 下图展示了数据源.适配器.ListView等数据展示控件之间的关系.我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的.数据适配器正是建立了数据源与 ...

  8. SQLServer Always On FCI 脑裂及可疑状态修复

    FCI 双节点集群,因为晚上集群节点间的网络中断过.两个节点都觉得还有一个节点宕机,在各节点的集群管理中都看到对方已宕机. 连接到集群IP.提示 msdb 数据库有问题: watermark/2/te ...

  9. vue前端知识点整理

    1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter, ...

  10. [k8s]debug模式启动集群&k8s常见报错集合(on the fly)

    debug模式启动-支持sa 集群内(pod访问api)使用443加密 no1 no2 安装flanneld kubelet/kube-proxy m1 安装etcd/ api/contruller/ ...