这段时间在学openCV,准备做一个头部检测,但是openCV自带的分类器只有人脸检测的,而且准确度不高,就准备
自己训练一个分类器
。在网上看了很多的博客,都讲得不是很清楚,而且
全是在windows上训练的
,对与用
习惯linux
的我来说,
用cmd
实在是太痛苦了,而我没有在网上找到这方面的博客,甚至连
opencv_createsamples
和
opencv_traincascade
在哪都没说只说在openCV目录下,但是直接安装的openCV下很多是没有的,对于新手来讲会非常迷茫,完全搞不懂。
然后我就到github上看
openCV的仓库
,发现仓库的apps目录下有分类器源码,觉得可以自己在linux下编译一个训练器
进过几次尝试,我发现openCV4以上版本源码编译出来是没有我需要的这两个训练器的,3一下版本的会报错,具体什么原因我不清楚,openCV-3.4.9版本的完全没有问题
一、安装Cmake
1、安装方法一
sudo apt install cmake
2、安装方法二
2.1 CMake 下载地址
官网
:
https://cmake.org/files
或者执行命令
wget https://cmake.org/files/v3.16/cmake-3.16.5-Linux-x86_64.tar.gz
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt-get install build-essential
解压:
unzip mirrors-opencv-3.4.9.zip
cd opencv
mkdir build
http://woshicver.com/Eleventh/10_2_%E7%BA%A7%E8%81%94%E5%88%86%E7%B1%BB%E5%99%A8%E8%AE%AD%E7%BB%83/
2、准备样本
以上参数的含义如下:
-
vec
<vec_file_name>:训练好的正样本的输出文件名。
-
img
<image_file_name>:源目标图片
-
bg
<background_file_name>:背景描述文件。
-
num
<number_of_samples>:要产生的正样本的数量,和正样本图片数目相同。
-
bgcolor
<background_color>:背景色。背景色制定了透明色。对于压缩图片,颜色方差量由bgthresh参数来指定。则在bgcolor-bgthresh 和bgcolor+bgthresh 中间的像素被认为是透明的。
-
bgthresh
<background_color_threshold>
-
inv
:如果指定,颜色会反色
-
randinv
:如果指定,颜色会任意反色
-
maxidev
<max_intensity_deviation>:背景色最大的偏离度。
-
maxangel
<max_x_rotation_angle>,
-
maxangle
<max_y_rotation_angle>,
-
maxzangle
<max_x_rotation_angle>:最大旋转角度,以弧度为单位。
-
show
:如果指定,每个样本会被显示出来,按下"esc"会关闭这一开关,即不显示样本图片,而创建过程
继续。这是个有用的debug 选项。
-
w
<sample_width>:输出样本的宽度(以像素为单位)
-
h
<sample_height>:输出样本的高度(以像素为单位)
只需要对正样本进行以上操作,负样本不需要生成vec文件。。。
注意:
这里要找一台好一点的电脑训练,我训练一万的样本,从最开始一天训练一级,然后每级的时间增加半天,到第五级已经差不多需要三天了,预计到20级没一两月搞不定
./opencv_traincascade -data xml -vec pos.vec -bg neg.txt -numPos 2000 -numNeg 7370 -numStages 20 -featureType HAAR -w 50 -h 50
像我这里输入-numPos 2000 ,在训练到第三级时就需要2018个正样本,如果.vec里只有2000个就会找不到新的正样本,从而报错
以上参数的含义如下:
-
data
<cascade_dir_name>:目录用于保存训练产生的分类器xml文件和中间文件,如不存在训练程序会创建它;
-
vec
<vec_file_name>:由 opencv_createsamples 程序生成的包含正样本的vec文件名;
-
bg
<background_file_name>:背景描述文件,也就是包含负样本文件名的那个描述文件
-
numPos
<number_of_positive_samples>:每级分类器训练时所用的正样本数目(默认值为2000);
-
numNeg
<number_of_negative_samples>:每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目(默认值为1000);
-
numStages
<number_of_stages>:训练的分类器的级数(默认值为20级);
-
precalcValBufSize
<precalculated_vals_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征值(feature values),单位为MB(默认值为256);
-
precalcIdxBufSize
<precalculated_idxs_buffer_size_in_Mb>:缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB(默认值为256);
内存越大,训练时间越短。
-
baseFormatSave
:这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储(默认不指定该参数项,此时其值为false;一旦指定则其值默认为true);
级联参数:CvCascadeParams类,定义于cascadeclassifier.h
-stageType <BOOST(default)>:级别(stage)参数。目前只支持将BOOST分类器作为级联的类型;
-
featureType
<{HAAR(default), LBP}>:特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征(默认Harr);
-
w
<sampleWidth>
:训练样本的宽(单位为像素,默认24);
-
h
<sampleHeight>
:训练样本的高(单位为像素,默认24);
训练样本的尺寸必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
Boosted分类器参数:CvCascadeBoostParams类,定义于boost.h
-
bt
<{DAB, RAB, LB, GAB(default)}>:Boosted分类器的类型(DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost为默认);
-
minHitRate
<min_hit_rate>:分类器的每一级希望得到的最小检测率(默认值为0.995),总的检测率大约为 min_hit_rate^number_of_stages;
-
maxFalseAlarmRate
<max_false_alarm_rate>:分类器的每一级希望得到的最大误检率(默认值为0.5),总的误检率大约为 max_false_alarm_rate^number_of_stages;
-
weightTrimRate
<weight_trim_rate>:Specifies whether trimming should be used and its weight,一个还不错的数值是0.95;
-
maxDepth
<max_depth_of_weak_tree>:弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps);
-
maxWeakCount
<max_weak_tree_count>:每一级中的弱分类器的最大数目(默认值为100)。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate;
五、测试程序
import cv2
face = cv2.CascadeClassifier("./data/cascade.xml")