【opencv】4.使用opencv进行分类器训练
模式识别期末作业,对一个视频中的nemo鱼进行目标跟踪,我是使用opencv完成的。要进行目标跟踪,首先得把目标识别出来,我选用的是基于haar特征的模式识别,要进行模式识别,首先得训练分类器,好在opencv自带了训练分类器的软件,可以在opencv安装目录中找到,如:F:\opencv\build\x86\vc12\bin\opencv_haartraining.exe因为下面正样本描述
模式识别期末作业,对一个视频中的nemo鱼进行目标跟踪,我是使用opencv完成的。要进行目标跟踪,首先得把目标识别出来,我选用的是基于haar特征的模式识别,要进行模式识别,首先得训练分类器,好在opencv自带了训练分类器的软件,可以在opencv安装目录中找到,如:
F:\opencv\build\x86\vc12\bin\opencv_haartraining.exe
因为下面正样本描述文件需要的是特征向量描述文件,所以还需要另外一个程序来生成,也在同目录下:
F:\opencv\build\x86\vc12\bin\opencv_createsamples.exe
可以将这两个程序文件拷贝到训练的目录下备用,如:
1.正样本和负样本
正样本就是你要识别的那个东西的图片,告诉分类器什么是正确的分类,也就是告诉程序你要识别的什么,我要做的是nemo鱼的识别,所以就是nemo鱼的图片了,如下:
负样本是区别于正样本的图片,告诉分类器什么是错误的分类,也及时告诉程序不能识别什么,我是直接将视频的背景截了一些图片,如下:
正负样本图片的数目越多越好了,越多速度越快,识别越准确。可以先到网上中找找有没有你需要的样本库,像人脸识别,车辆识别都有现成的样本库,有的练分类器都有,直接用就行。如果没有那只有自己使用截图工具截了,截图时尽量保持宽高比,因为训练时程序会进行归一化,保存为bmp格式,截完之后使用图片格式转换工具。正负样本图片以数字命名后分别放到positive和negative目录下。
2.正样本描述文件
首先需要一个过渡描述文件,包含每张图片的图片路径、数目、图片位置信息。如:
路径 图片数目 左上点坐标 宽 高
positive/1.bmp 1 0 0 30 30
positive/2.bmp 1 0 0 30 30
positive/3.bmp 1 0 0 30 30
positive/4.bmp 1 0 0 30 30
positive/5.bmp 1 0 0 30 30
positive/6.bmp 1 0 0 30 30
positive/7.bmp 1 0 0 30 30
positive/8.bmp 1 0 0 30 30
positive/9.bmp 1 0 0 30 30
positive/10.bmp 1 0 0 30 30
positive/11.bmp 1 0 0 30 30
positive/12.bmp 1 0 0 30 30
positive/13.bmp 1 0 0 30 30
positive/14.bmp 1 0 0 30 30
positive/15.bmp 1 0 0 30 30
positive/16.bmp 1 0 0 30 30
positive/17.bmp 1 0 0 30 30
positive/18.bmp 1 0 0 30 30
positive/19.bmp 1 0 0 30 30
positive/20.bmp 1 0 0 30 30
positive/21.bmp 1 0 0 30 30
positive/22.bmp 1 0 0 30 30
…….
可以使用dos,在正样本目录下使用dir /b>pos.txt命令来生成文件名,然后再将bmp替换为“bmp 1 0 0 20 20”,不过这样生成的只有文件名,没有路径,你就必须在样本目录下进行训练,如果你需要加入路径,只能手动天剑或者去了解一下shell脚本,写一个简单脚本来自动完成。
还有一个简单的解决办法是写一个简单的c++程序来生成:
#include <iostream>
#include <string>
#include <fstream>
#define STR "positive/"
using namespace std;
int main(int argc, const char** argv){
fstream f("./src/training_data/pos.txt",ios::out);
string str;
int i = 1;
while (1){
str = STR + to_string(i)+".bmp 1 0 0 30 30";
cout << str << endl;
f << str << endl;
i++;
if (i == 201)//我的正样本数目是200,有点少,手动截的orz
break;
}
return 0;
}
过渡文件生成之后,拷贝到之前放opencv自带的那个软件的目录下,开始生成特征向量文件,在目录下按住shift+鼠标右键,选择在此处打开命令窗口,输入命令运行:
opencv_createsamples.exe -info pos.txt -vec pos.vec -num 200 -w 30 -h 30
此时在同目录下应该生成了一个pos.vec文件。
3.负样本描述文件
负样本描述文件要简单的多,只需要文件路径就行了,如下:
negative/1.bmp
negative/2.bmp
negative/3.bmp
negative/4.bmp
negative/5.bmp
negative/6.bmp
negative/7.bmp
negative/8.bmp
negative/9.bmp
negative/10.bmp
negative/11.bmp
negative/12.bmp
……
可以使用之前的方法生成,此时你的文件应该都齐了,如下:
4.训练
使用之前的方法打开命令窗口,输入如下命令:
opencv_haartraining.exe -data cascade -vec pos.vec -bg neg.txt -sym -npos 200 -nneg 120 -mem 2000 -mode ALL -w 30 -h 30
等待…..
完成之后在同目录下会得到一个xml文件,也就是分类器,就能使用了。
关于使用方法,后面再说。
更多推荐
所有评论(0)