一、开发工具简介
1、opencv分类器
基于图像HAAR与LBP特征训练的级联分类器,只需要简单的正负样本数据集图片,就可以训练一个检测正样本的级联分类器。最重要的是,经过编译好的的exe类文件训练出来的分类器,在C++,Python,Js几种语言环境中都可以调用。训练方法很简单,跟着教程按部就班即可。网上也有很多教程,具体方法如下:
训练方法
1、获取opencv_createsamples.exe和opencv_traincascade.exe
链接:https://pan.baidu.com/s/1fGX8RBnL5HiHKkfPv-K5iw?pwd=2vis 提取码:2vis
2、制作正负样本数据集、需要转灰度图
gray = cv.cvtColor(resize, cv.COLOR_BGR2GRAY)
path='*/”图片文件路径”'
pathdir=os.listdir(path)
for i in pathdir:
#遍历目录下子文件夹
imgpath=path+i
img=cv.imread(imgpath)
gray=cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imwrite(imgpath,gray, [cv.IMWRITE_PNG_COMPRESSION, 0])
3、进入正负样本数据集、制作图片路径txt文件
dir /b/s/p/w *.jpg > pos.txt #当前目录所有文件夹绝对路径保存到pos.txt中。或使用下面4中的方法制作txt说明文件。
4、为txt文件中的路径添加后缀1 0 0 224 224,后两位为正样本图片尺寸
path='*/”图片文件路径”'
for img in os.listdir(path):
line = path+img+' 1 0 0 224 224\n'
with open('pos.txt','a') as f:
f.write(line)
5、生成vec文件,
opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -num 299 -w 20 -h 20
参数: -info:样本说明文件 -vec:描述文件的名字及路径 -num:正样本数 -w -h:样本缩放尺寸。
6、训练
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 200 -numNeg 700
-numStages 50 -featureType HAAR -w 20 -h 20
参数: -data:存放训练好的xml文件的文件夹,需提前创建 -vec:正样本vec文件路径 -bg:负样本neg.txt说明文件路径 -numPos:正样本的数量 -numNeg:负样本的数量 -numStages:训练步数 -featureTyp:特征类型,HAAR最常用 -w -h 是正样本的宽高 -minHitRate:最小命中率,即分类器每一级希望得到的最小检测率。本文希望分类器每一级得到的最小检测率是0.9999 -maxFalseAlarmRate :分类器每一级希望得到的最小误检率。本文希望分类器每一级得到的最小检测率是0.5。影响每个强分类器中弱分类器的个数,设置的如果较大,每级可以滤除负样本的比例就会较小,这样就在测试过程中虚警率就较高;如果设置的较小,每级强分类器中弱分类器的个数就较多,检测的时间就会相对要长。 -All:会加载所有的Haar特征模板
7、测试、读取训练好的参数进行测试
CASE: (1)出现报错:Traincascade Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.)
分析原因:设置的numPos太大,因为POS_count会随着设置的numPos正样本数增加而增加,每个级别都会按照一定的顺序增加。 以后可能超过样本库中的所有正样本数,就会报这个错误。为了避免opencv报错,在使用opencv_traincascade.exe时,-numPos应该比实际的正样本数略低。 比如如果有2100的正样本,可以设置numpos为1900-2000
(2) 每次修改参数重新训练需将之前训练保存的xml文件移除。
(3) 支持断点训练,若模型未移除,可输入同样代码从上次训练停止步数numStages开始训练。 (4) 训练到最后分类器总是卡到某一层就不在继续进行,当剩下所有的negtive样本在临时的cascade Classifier中evaluate的结果都是0(也就是拒绝了),随机取样本的数目到几百万都是找不到误检测的neg样本了,因而没法跳出循环! 解决方法是,增大负样本数目,增大负样本之间的变化!P.S. 因为负样本原则应该是数量越多而且越具多样性越好,这在现实中是不可行的,所以我们采集的负样本一般无论从数量上还是多样性上都很难满足要求,所以出现上述问题就很正常了,不过此时的分类器已经完全额、可以使用,因为它的误检率已经很低,从实用性上时没有任何问题的。 参考链接: https://www.jianshu.com/p/e35260f7cbf0?
HbuilderX
H5+,Uniapp调试打包软件,不多赘述,傻瓜式安装,然后打开项目即可。
二、Demo(一个简单的级联分类器识别人脸图片项目)
源码来自opencv.js官网的Demo,这里稍微对其进行简单的修改成Hbuilder项目,一个图像检测,一个视频流,然后测试到打包成app到手机上 项目地址:https://github.com/sk8boi/OpencvJSDemo.git
总结
很多二分类的图像识别任务不用想着立马上神经网络,可以用简单的级联分类器解决。
|