0.安装OpenCV
此处不多说了,不是重点。网上下载。
1.找到OpenCV里面的函数
保证opencv_createsamples和opencv_traincascade能够使用。
2.通过网上下载需要训练的素材
我们下载人脸和非人脸的图片。
在树莓派中建立三个文件夹:
neg放消极图片(非人脸图片),pos放积极图片(人脸图片),xml里放最后生成的分类器。
使用
vec数量>=(numspose+(numstages-1)*(1-minhitrate)*numspose)+s
numspose-用于训练每个阶段的阳性样本计数(不要将其与vec文件中所有样本的计数混淆!)
numstages-培训后级联分类器将具有的阶段计数。
minhitrate-每个阶段的培训限制。
vec-file has to contain >= (numPos + (numStages-1) * (1 - minHitRate) * numPos) + S
7000 >= (numPos + (20-1) * (1 - 0.999) * numPos) + 2973
haartraining.exe -data data\cascade -vec pos.vec -bg neg_img.txt -npos 100 -nneg 250 -nstages 5 -mem 1280 -nonsym -w 24 -h 24 -mode all
也是提示缺少什么文件,就往目录下添加什么文件。
各个参数的含义:
-data
存放训练好的分类器的路径名。
-vec
正样本文件名(由trainingssamples 程序或者由其他的方法创建的)
-bg
背景描述文件。
-npos
-nneg
用来训练每一个分类器阶段的正/负样本,需要自己调整,-npos 正样本数目,-nneg 负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的 -nneg张图 这个参数一般设置为正样本数目的1~3倍
-nstages
训练的阶段数,这也是可以改的。
-nsplits
决定用于阶段分类器的弱分类器。如果1,则一个简单的stump classifier 被使用。如果是2 或者更多,则带有number_of_splits 个内部节点的CART 分类器被使用。
-mem
预先计算的以MB 为单位的可用内存。内存越大则训练的速度越快。
-sym(default)
-nonsym
-data 指定生成的文件目录, -vec vec文件名, -bg 负样本描述文件路径, -nstage 20 指定训练层数,推荐15~20,层数越高,耗时越长。-nsplits 分裂子节点数目,选取默认值 2 -minhitrate 最小命中率,即训练目标准确度。-maxfalsealarm最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练,-npos 正样本数目,-nneg 负样本数目 这个值可以设置大于真正的负样本图像数目,程序可以自动从负样本图像中切割出和正样本大小一致的 -nneg张图 这个参数一半设置为正样本数目的1~3倍, -w -h意思很明确, -mem 程序可使用的内存,这个设置为256即可,实际运行时根本就不怎么耗内存。 -mode ALL指定haar特征的类型数目
opencv_createsamples -vec pos.vec -info pos/pos.txt -bg neg/neg.txt -w 20 -h 20 -num 1500
出现错误
=====TRAINING0-stage=====
POScount:consumed2000:
2000
Traindatasetfortempstagecannotbefilled.Branchtrainingterminated
Cascadeclassifiercan'tbetrained.Checktheusedtrainingparameters.
解决方法:
neg.txt文件中xxx.jpg全部改成./neg/xxx.jpg
错误:
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 2000 : 2000
NEG count : acceptanceRatio 1000 : 1
OpenCV Error: Insufficient memory (Failed to allocate 941520000 bytes) in OutOfMemoryError, file /home/pi/opencv-3.3.0/modules/core/src/alloc.cpp, line 55
OpenCV Error: Assertion failed (u != 0) in create, file /home/pi/opencv-3.3.0/modules/core/src/matrix.cpp, line 436
terminate called after throwing an instance of 'cv::Exception'
what(): /home/pi/opencv-3.3.0/modules/core/src/matrix.cpp:436: error: (-215) u != 0 in function create
解决方法:
因为树莓派内存不足,网上说不是64位,故在windows上执行此操作。