Пример кода из 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, и с ними я тоже ничего не получил. Может быть, мне нужно настроить параметры. Во всяком случае, я решаю ошибку, комментируя эту строку.