1. 程式人生 > >使用opencv_haartraining.exe做樣本訓練死迴圈無法生成.xml檔案的解決辦法--convert_cascade.exe

使用opencv_haartraining.exe做樣本訓練死迴圈無法生成.xml檔案的解決辦法--convert_cascade.exe

使用opencv_haartraining.exe做樣本訓練時,會出現陷入死迴圈無法生成.xml檔案這種情況。 如下圖所示


訓練到第八層之後再也沒有反應了。 這是由於FA值已經達到0, 沒有負樣本能夠進入下一層進行訓練了。

解決方案之一是增加負樣本的數量。

或者用convert_cascade.exe 生成xml檔案。因為此時各層的訓練資訊已經有了,FA值達到0 也說明訓練結果可用。 同樣適用於FA值已經很低,而下一層的訓練時間過長不想等待的情況。


convert_cascade.exe的使用格式如下。

convert_cascade.exe --size=&quot;<sample_width>x<sampe_height>&quot; <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