Громоздкий CvMat * в ANN с использованием OpenCV

0

Я пытаюсь использовать OpenCV для обучения нейронной сети в C++.

Я не могу преобразовать между cv :: Mat * (или Mat *, если используется пространство имен cv) в CvMat *, и я был бы признателен за некоторую помощь в этом.


Позвольте мне уточнить:

У меня две структуры данных типа cv :: Mat *. Первый - набор векторов признаков, а второй - набор ожидаемых результатов.

   cv::Mat *feat = new cv::Mat(3000, 100, CV_32F, featureData);
   cv::Mat *op = new cv::Mat(3000, 2, CV_32F, expectedOutput);

(Это 3000 точек данных длины вектор-функции = 100 и выходное состояние = 2)

Эти две матрицы были заполнены данными правильных размеров и, похоже, работают нормально, когда образцы данных были напечатаны на консоли.

Нейронная сеть была инициализирована как:

   int layers_array[] = {100,200,2};    //hidden layer nodes = 200

   CvMat* layer = cvCreateMatHeader(1, 3, CV_32SC1); 
   cvInitMatHeader(layer, 1,3,CV_32SC1, layers_array);

   CvANN_MLP nnetwork;
   nnetwork.create(layer, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);

Теперь метод поезда ANN имеет следующий шаблон:

   virtual int train( const CvMat* inputs, const CvMat* outputs,
                       const CvMat* sampleWeights, const CvMat* sampleIdx=0,
                       CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
                       int flags=0 );

Я попытался преобразовать между cv :: Mat * и CvMat *, используя следующий код:

   CvMat featMat,opMat;

   (&featMat)->cols = feat->cols;
   (&featMat)->rows = feat->rows;
   (&featMat)->type = CV_32F;
   (&featMat)->data.fl = (float *)feat->data;


   (&opMat)->cols = op->cols;
   (&opMat)->rows = op->rows;
   (&opMat)->type = CV_32F;
   (&opMat)->data.fl = (float *)op->data;

   //setting up the ANN training parameters

   int iterations = network.train(&featMat, &opMat, NULL, NULL, trainingParams);

Когда я запускаю этот код, на моей консоли появляется следующее сообщение об ошибке:

**OpenCV Error: Bad argument (input training data should be a floating-point matrix withthe number of rows equal to the number of training samples and the number
of columns equal to the size of 0-th (input) layer) in CvANN_MLP::prepare_to_train, file ..\..\OpenCV-2.3.0-win-src\OpenCV-2.3.0\modules\ml\src\ann_mlp.cpp, 
line 694**

Я понимаю сообщение об ошибке. Однако, насколько мне известно, я считаю, что я не делал беспорядка количества узлов на уровне ввода/вывода.

Не могли бы вы помочь мне понять, что происходит не так?

  • 0
    Я не слишком знаком со старым использованием C CvMat , но попробуйте вместо этого установить type в CV_32FC1 , хотя я думаю, что он обрабатывается так же.
  • 0
    @chappjc: попробовал. не работает.
Показать ещё 5 комментариев
Теги:
opencv
opencv-mat

1 ответ

2
Лучший ответ

старайтесь избегать указателей на cv :: Mat, а также CvMat * в целом.

к счастью, есть перегрузка в CvANN_MLP :: train, который принимает cv :: Mat как args, поэтому используйте это вместо:

   cv::Mat feat = cv::Mat(3000, 100, CV_32F, featureData);
   cv::Mat op = cv::Mat(3000, 2, CV_32F, expectedOutput);

   int layers_array[] = {100,200,2};    //hidden layer nodes = 200
   cv::Mat layers = cv::Mat (3, 1, CV_32SC1, layers_array );

   CvANN_MLP nnetwork;
   nnetwork.create(layers, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);

   int iterations = nnetwork.train(feat, op, cv::Mat(), cv::Mat(), CvANN_MLP_TrainParams());
  • 1
    Работает как шарм! Я не заметил перегруженный метод. Большое спасибо. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню