Пример кода из emgucv, создающего исключения??

Поэтому я использую emguCV для использования алгоритмов машинного обучения из OpenCV. Мой код выглядит следующим образом, и когда он входит в метод dtree.Train, он выдает мне исключение (exc1), и если я жду, ir выдает мне и сообщение об ошибке (err1). Если я пытаюсь отладить и перейти в этот метод, если дает мне другой исключение (exc2) и отладчик не продвигается. exc1: первое случайное исключение типа 'Emgu.CV.Util.CvException' произошло в Emgu.CV.dll

exc2: Шаг в: Перешагнуть через непользовательский код 'Emgu.CV.ML.RTrees.Train' Первое случайное исключение типа 'Emgu.CV.Util.CvException' произошло в Emgu.CV.dll Шаг в: Перешагнуть через -пользовательский код 'MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen'

err1: CLR не удалось перейти из контекста COM 0x795fa8 в контекст COM 0x796118 . Поток, который владеет целевым контекстом / квартирой, скорее всего либо выполняет некачивающее ожидание, либо обрабатывает очень длительную операцию без прокачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или постоянно накапливается использование памяти. Чтобы избежать этой проблемы, все потоки однопоточных квартир (STA) должны использовать примитивы перекачки (такие как CoWaitForMultipleHandles) и регулярно перекачивать сообщения во время длительных операций.

Мой код, используя этот пример - http://www.emgu.com/wiki/index.php/Mushroom_Poisonous_Prediction_(Decision_Tree)_in_CSharp

   public void train()
    {

        Matrix<float> data, response;
       // data = new Matrix<float>(15, 200);
       // response = new Matrix<float>(15, 200);
        Console.WriteLine("reading shroom data");
        ReadMushroomData(out data, out response);

        ///data = new Matrix<float>(1, 5);

        //Use the first 80% of data as training sample
        int trainingSampleCount = (int)(data.Rows * 0.8);

        Matrix<Byte> varType = new Matrix<byte>(data.Cols + 1, 1);
        varType.SetValue((byte)Emgu.CV.ML.MlEnum.VAR_TYPE.CATEGORICAL); //the data is categorical

        Matrix<byte> sampleIdx = new Matrix<byte>(data.Rows, 1);
        using (Matrix<byte> sampleRows = sampleIdx.GetRows(0, trainingSampleCount, 1))
            sampleRows.SetValue(255);

        float[] priors = new float[] { 1, 0.5f };
        GCHandle priorsHandle = GCHandle.Alloc(priors, GCHandleType.Pinned);

        MCvRTParams param = new MCvRTParams();
        param.maxDepth = 8;// max depth
        param.minSampleCount = 10;// min sample count
        param.regressionAccuracy = 0;// regression accuracy: N/A here
        param.useSurrogates = true; //compute surrogate split, no missing data
        param.maxCategories = 15;// max number of categories (use sub-optimal algorithm for larger numbers)
        param.cvFolds = 10;
        //param.use1seRule = true;
        param.truncatePrunedTree = true;
        param.priors = priorsHandle.AddrOfPinnedObject(); // the array of priors


        Console.WriteLine("starting train");
        using (RTrees dtree = new RTrees())
        {

            bool success = dtree.Train(data, 
                Emgu.CV.ML.MlEnum.DATA_LAYOUT_TYPE.ROW_SAMPLE, 
                response, 
                null, 
                sampleIdx, 
                varType, 
                null, 
                param);


            Console.WriteLine("starting tests");

            if (!success) return;
            double trainDataCorrectRatio = 0;
            double testDataCorrectRatio = 0;
            for (int i = 0; i < data.Rows; i++)
            {
                using (Matrix<float> sample = data.GetRow(i))
                {
                    double r = dtree.Predict(sample, null);
                    r = Math.Abs(r - response[i, 0]);
                    if (r < 1.0e-5)
                    {
                        if (i < trainingSampleCount)
                            trainDataCorrectRatio++;
                        else
                            testDataCorrectRatio++;
                    }
                }
            }

            trainDataCorrectRatio /= trainingSampleCount;
            testDataCorrectRatio /= (data.Rows - trainingSampleCount);

            Console.WriteLine(String.Format("Prediction accuracy for training data :{0}%", trainDataCorrectRatio * 100));
            Console.WriteLine(String.Format("Prediction accuracy for test data :{0}%", testDataCorrectRatio * 100));
        }
    }

2 ответа

Чтобы заставить его работать, вы должны просто использовать param = MCvRTParams.GetDefaultParameter(); Я получил его для работы с конфигурацией x64

После многих испытаний, проб и ошибок я обнаружил следующее: -i отладил emgucv с его исходным кодом и нашел описание ошибок (которые не очень помогли)

-Я начал видеть, где произошли ошибки, и я прокомментировал эту строку param.priors = priorsHandle.AddrOfPinnedObject(); // массив приоров

-Я получил поезд и тест на работу, хотя он не может ничего предсказать с RTrees. Даже с грибным примером я попытался просто поменять Dtrees на Rtrees, и с ними я тоже ничего не получил. Может быть, мне нужно настроить параметры. Во всяком случае, я решаю ошибку, комментируя эту строку.

Другие вопросы по тегам