使用opencv_haartraining.exe做样本训练时,会出现陷入死循环无法生成.xml文件这种情况。 如下图所示
训练到第八层之后再也没有反应了。 这是由于FA值已经达到0, 没有负样本能够进入下一层进行训练了。
解决方案之一是增加负样本的数量。
或者用convert_cascade.exe 生成xml文件。因为此时各层的训练信息已经有了,FA值达到0 也说明训练结果可用。 同样适用于FA值已经很低,而下一层的训练时间过长不想等待的情况。
convert_cascade.exe的使用格式如下。
convert_cascade.exe --size="
例如:
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#include void help() { printf("\n This sample demonstrates cascade's convertation \n" "Usage:\n" "./convert_cascade --size=\" x \" \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