使用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="<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