博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv利用Cascade Classifier训练人脸检测器
阅读量:5812 次
发布时间:2019-06-18

本文共 3860 字,大约阅读时间需要 12 分钟。

opencv默认提供了haar特征和lbp特征训练的人脸分类器,但是效果不太好,所以我们可以用opencv提供的跑来训练一个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 himg/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 cv2face_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 cv2hog_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.05cam = 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"):            breakcv2.destroyAllWindows()

具体参数意义可以参考

参考:

cascade classifier:

train_HOG

转载于:https://www.cnblogs.com/arkenstone/p/8119153.html

你可能感兴趣的文章
Scrum之 Sprint计划会议
查看>>
svn命令在linux下的使用
查看>>
Gradle之module间依赖版本同步
查看>>
java springcloud版b2b2c社交电商spring cloud分布式微服务(十五)Springboot整合RabbitMQ...
查看>>
10g手动创建数据库
查看>>
Windwos Server 2008 R2 DHCP服务
查看>>
UVa 11292 勇者斗恶龙(The Dragon of Loowater)
查看>>
白话算法(7) 生成全排列的几种思路(二) 康托展开
查看>>
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
【ES6】数值的扩展
查看>>
性能测试之稳定性测试
查看>>
ES6的 Iterator 遍历器
查看>>
2019届高二(下)半期考试题(文科)
查看>>
nginx 301跳转到带www域名方法rewrite(转)
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
network
查看>>