OpenCV случайный лес CvRTrees ошибка

0

Я получил эту ошибку при использовании случайного леса внутри OpenCV:

OpenCV Error: Bad argument (5273-th value of 220-th (ordered) variable (=-1.70141e+38) is too large) in CvDTreeTrainData::set_data, file /home/XXX/Downloads/opencv-2.4.6.1/modules/ml/src/tree.cpp, line 551
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/XXX/Downloads/opencv-2.4.6.1/modules/ml/src/tree.cpp:551: error: (-5) 5273-th value of 220-th (ordered) variable (=-1.70141e+38) is too large in function CvDTreeTrainData::set_data

Aborted (core dumped)

Странно, потому что напечатанное число не выходит из диапазона с плавающей запятой (-3.4E +3 8 - +3.4E +3 8)

Я узнал, где печатается в источнике opencv, но я не могу понять, в чем проблема:

файл - tree.cpp

for( i = 0; i < sample_count; i++ )
        {
            float val = ord_nan;
            int si = sidx ? sidx[i] : i;
            if( !mask || !mask[(size_t)si*m_step] )
            {
                if( idata )
                    val = (float)idata[(size_t)si*step];
                else
                    val = fdata[(size_t)si*step];

                if( fabs(val) >= ord_nan )
                {
                    sprintf( err, "%d-th value of %d-th (ordered) "
                        "variable (=%g) is too large", i, vi, val );
                    CV_ERROR( CV_StsBadArg, err );
                }
                num_valid++;
            }

            if (is_buf_16u)
                udst[i] = (unsigned short)i; // TODO: memory corruption may be here
            else
                idst[i] = i;
            _fdst[i] = val;

        }

Может ли кто-нибудь дать мне подсказку?

  • 0
    В вашем сообщении может быть ошибка, потому что вы показываете строку ~ 400, однако в вашем сообщении об ошибке указывается строка 551.
  • 0
    Вы правы, но код взят из интернета, и я также проверил источники opencv, скопированные на моей машине, и это то же самое. Однако спасибо.
Теги:
random-forest
opencv

1 ответ

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

Если вы проверите строку 551 в файле tree.cpp, вы увидите, что требуется ord_nan = FLT_MAX*0.5f fabs(val) >= ord_nan где ord_nan = FLT_MAX*0.5f. Поэтому он терпит неудачу, когда val == -1.70141e+38 поскольку он больше этого предела.

  • 0
    Да, но если вы посмотрите на ошибку, проблема заключается в следующем: if (val == INT_MAX), глубоко взглянув вчера вечером, я понял, что проблема, вероятно, в том, что этот код был перенесен в Linux из Windows, поэтому, возможно, вычисления, сделанные до использует различную точность с плавающей точкой.
  • 0
    @ Баччи Я не думаю, что ты прав. Сообщения об ошибках разные! Если if(val==INT_MAX) потерпел неудачу, сообщение об ошибке было бы "... -ой (категориальной) переменной ...", как вы включили в свой пост (строка 418). Но полученное вами сообщение об ошибке: «... -я (упорядоченная) переменная ...», которое находится в строке 549. Они не совпадают.
Показать ещё 1 комментарий

Ещё вопросы

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