您的位置:首页 > 大数据 > 人工智能

使用opencv_haartraining.exe做样本训练死循环无法生成.xml文件的解决办法--convert_cascade.exe

2016-09-16 21:20 591 查看
使用opencv_haartraining.exe做样本训练时,会出现陷入死循环无法生成.xml文件这种情况。 如下图所示



训练到第八层之后再也没有反应了。 这是由于FA值已经达到0, 没有负样本能够进入下一层进行训练了。

解决方案之一是增加负样本的数量。

或者用convert_cascade.exe 生成xml文件。因为此时各层的训练信息已经有了,FA值达到0 也说明训练结果可用。 同样适用于FA值已经很低,而下一层的训练时间过长不想等待的情况。



convert_cascade.exe的使用格式如下。

convert_cascade.exe --size="<sample_width>x<sampe_height>" <haartraining_ouput_dir> <ouput_file>

例如:

convert_cascade.exe 位于D:\Training
文件夹下,正样本大小20*20像素, 0-8 层的训练结果(上图)位于D:\Training\cascade下, 输出结果希望在D:\Training\cascade\result 下

cmd中运行下面的命令

cd D:\Training

convert_cascade.exe
--size="20x20" D:\Training\cascade D:\CE-5\Training\cascade\haar_adaboost.xml

haar_adaboost.xml即为最后的训练结果。

convert_cascade.exe 在哪里找?

我在opencv的库里没有找到这个程序,于是在网上找到了源码,自己编译运行得到了exe程序, 源码如下,建一个工程并配置好opencv,把代码粘进工程运行即可。或者下载我编译好的: http://download.csdn.net/download/u010603823/9631703
 (没有币可以留言或私信邮箱,我给你发)。

如有错误欢迎批评指正

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <ctype.h>
#include <stdio.h>

void help()
{
printf("\n This sample demonstrates cascade's convertation \n"
"Usage:\n"
"./convert_cascade --size=\"<width>x<height>\"<convertation size> \n"
"                   input_cascade_path \n"
"                   output_cascade_filename\n"
"Example: \n"
"./convert_cascade --size=640x480 ../../opencv/data/haarcascades/haarcascade_eye.xml ../../opencv/data/haarcascades/test_cascade.xml \n"
);
}

int main( int argc, char** argv )
{
const char* size_opt = "--size=";
char comment[1024];
CvHaarClassifierCascade* cascade = 0;
CvSize size;

help();

if( argc != 4 || strncmp( argv[1], size_opt, strlen(size_opt) ) != 0 )
{
help();
return -1;
}

sscanf( argv[1], "--size=%ux%u", &size.width, &size.height );
cascade = cvLoadHaarClassifierCascade( argv[2], size );

if( !cascade )
{
fprintf( stderr, "Input cascade could not be found/opened\n" );
return -1;
}

sprintf( comment, "Automatically converted from %s, window size = %dx%d", argv[2], size.width, size.height );
cvSave( argv[3], cascade, 0, comment, cvAttrList(0,0) );
return 0;
}

#ifdef _EiC
main(1,"facedetect.c");
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: