openCV c ++: Problemas ao trabalhar com o CvBoost (classificador de Adaboost)

Estou criando um aplicativo para classificar humanos em imagens de ambiente urbano.

Eu treino um classificador da seguinte maneira:

int main (int argc, char **argv)
{

/* STEP 2. Opening the file */
//1. Declare a structure to keep the data
  CvMLData cvml;
//2. Read the file
  cvml.read_csv ("directory/train_rand.csv");
//3. Indicate which column is the response
  cvml.set_response_idx (0);

/* STEP 3. Splitting the samples */
//1. Select 4000 for the training
  CvTrainTestSplit cvtts (4000, true);
//2. Assign the division to the data
  cvml.set_train_test_split (&cvtts);

  printf ("Training ... ");
/* STEP 4. The training */
//1. Declare the classifier
  CvBoost boost;
//2. Train it with 100 features
  boost.train (&cvml, CvBoostParams (CvBoost::REAL,100, 0, 1, false, 0),
           false);

/* STEP 5. Calculating the testing and training error */
// 1. Declare a couple of vectors to save the predictions of each sample
  std::vector<float> train_responses, test_responses;
// 2. Calculate the training error
  float fl1 = boost.calc_error (&cvml, CV_TRAIN_ERROR, &train_responses);
// 3. Calculate the test error
  float fl2 = boost.calc_error (&cvml, CV_TEST_ERROR, &test_responses);

  cout<<"Error train: "<<fl1<<endl;

  cout<<"Error test: "<<fl2<<endl;

/* STEP 6. Save your classifier */
// Save the trained classifier
  boost.save ("./trained_boost_4000samples-100ftrs.xml", "boost");

  return 0;
}

train_rand.csv é um arquivo onde a primeira coluna é a categoria. O restante das colunas serão as características do problema. Por exemplo, eu poderia ter usado três recursos. Cada um deles representa a média de vermelho, azul e verde por pixel na imagem. Então meu arquivo csv deve ficar assim. Note que na primeira coluna eu estou usando um personagem, então o OpenCV reconhece isso como uma categoria.

B,124.34,45.4,12.4
B,64.14,45.23,3.23
B,42.32,125.41,23.8
R,224.4,35.34,163.87
R,14.55,12.423,89.67
...

Para o meu problema real, estou usando 100 recursos e 8000 amostras. Eu treino o classificador com metade dos dados e testei com o resto.

Após o treinamento, recebo um erro de teste de cerca de 5% (o que é muito bom para apenas 100 recursos).

Agora quero usar o classificador em novos dados:

CvBoost boost

boost.load("directory/trained_boost_4000samples-100ftrs.xml");

float x = boost.predict(SampleData,Mat(),Range::all(),false,false);
cout<<x;

Estou executando esse código em milhares de amostras e sempre gera o mesmo valor, que é 2. Eu realmente não entendo o que estou fazendo errado aqui, mas mesmo se eu treinei para classificá-lo de forma errada, ele não classificaria 100% das vezes da mesma maneira, também, o erro de teste que eu calculei antes mostra que o classificador deve funcionar bem.

Uma coisa que está me incomodando é que SampleData tem que ter o mesmo número de colunas que a amostra que eu usei para treinar. A coisa é, os dados usados ​​para treinar tem 100 colunas + 1 resposta, e se eu tentar executar o classificador com apenas 100 recursos, ele lança uma exceção dizendo que os tamanhos não correspondem. Se eu executar o classificador com 101 recursos (o que é absolutamente arbitrário) ele funciona, mas os resultados não fazem sentido.

Alguém pode me ajudar com isso? Desde já, obrigado!

Saudações

questionAnswers(1)

yourAnswerToTheQuestion