本教程基于以下环境 macOS 10.12.6,OpenCV 3.3.0,python 3.6。由于网上基于masOS系统的教程太少,想出一篇相关教程造福大家~本文旨在学习如何在opencv中基于haar-like特征训练自己的分类器,并且用该分类器用于模式识别。
1. 安装OpenCV和OpenCV源代码
OpenCV至少要保证下载好2.4.5以上的版本,同时源码要对应好自己所安装的版本。
brew tap homebrew/science brew install --with-tbb opencv
2. 在github上clone一个工程,里面有相关训练脚本和训练样本文件夹等等,后面会用到,在terminal输入
git clone https://github.com/mrnugget/opencv-haar-classifier-training
3. 把正例训练集放入./positive_images,并且将正例的照片名称存入positives.txt里
本训练的正例只有43张,非常少,若想训练完全需要样本量很大,有见过600-2000张不等的。再输入以下命令把名称存入positives.txt,效果图下
find ./positive_images -iname "*.jpg" > positives.txt
4. 同理,把反例训练集放入./negative_images,并且将正例的照片名称存入negative.txt里
find ./negative_images -iname "*.jpg" > negatives.txt
5. 通过bin/createsamples.pl脚本和opencv_createsamples工具创建正例样本集,再将其放入./samples 文件夹里
perl bin/createsamples.pl positives.txt negatives.txt samples 43 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 0.5 -maxyangle 0.5 maxzangle 0.5 -maxidev 40 -w 40 -h 40"
6. 把在/samples 文件夹里的样本集合成到samples.vec文件中
python ./tools/mergevec.py -v samples/ -o samples.vec
7. 使用opencv_traincascade工具进行训练,并把结果保存到./classifier
opencv_traincascade -data classifier -vec samples.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 43 -numNeg 43 -w 40 -h 40 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024
然后开始阶段性训练,每一层训练都会打印到控制台,其中,如果每一层只能训练出1-2个特征点,那说明训练集有问题,不够大或特征不明显。需要等待的时候比较久,取决于样本大小和样本集大小。
8. 在classifier文件夹里找到cascade.xml文件,就是训练好的分类器了~
9. 本文用python做了实时检测训练的物体,也可以使用Node.js + Opencv 去识别,方法很多。博主可惜由于训练集不足的原因效果不是很好,不过代码附下,如果有训练成功或有疑问朋友,欢迎交流~
import cv2 face_cascade = cv2.CascadeClassifier('cascade.xml') cap = cv2.VideoCapture(0) while 1: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray) for (x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] cv2.imshow('img',img) k = cv2.waitKey(30) & 0xff if k == 27: break cap.release() cv2.destroyAllWindows()
Useful Material:
1. http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
2. http://note.sonots.com/SciSoftware/haartraining.html#w0a08ab4