Emgucv 3.* 下的SVM示例
2018-03-02 02:07
127 查看
不想吐槽Emgucv了,版本更新太快,教程又跟不上。 官网上的SVM示例是基于2.4.*之前的,唯一的差别是SVMParams 这个单独的类不见了,换直接在SVM类里面设置。
改完这部份后还报一个:System.DivideByZeroException:“尝试除以零。”的错误,这个错误比较简单,分类标签的类型从float改为int就行了(外网上看到的,反正改完能用就没管原理。)
以下代码在Emgucv 3.2版本下编译通过了,3.3版本没试过,用过的同学给个回复。图片中的前几个ML的例子都调通了,唯独最后的一个EM算法没调通,和SVM一样的问题,但资料太少,以后再尝试了。 int trainSampleCount = 150;
int sigma = 60;
#region Generate the training data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<int> trainClasses = new Matrix<int>(trainSampleCount, 1);
Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);
Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount / 3, 1);
trainData1.GetCols(0, 1).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
trainData1.GetCols(1, 2).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
trainData2.SetRandNormal(new MCvScalar(400), new MCvScalar(sigma));
Matrix<float> trainData3 = trainData.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
trainData3.GetCols(0, 1).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
trainData3.GetCols(1, 2).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
Matrix<int> trainClasses1 = trainClasses.GetRows(0, trainSampleCount / 3, 1);
trainClasses1.SetValue(1);
Matrix<int> trainClasses2 = trainClasses.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
trainClasses2.SetValue(2);
Matrix<int> trainClasses3 = trainClasses.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
trainClasses3.SetValue(3);
#endregion
using (SVM model = new SVM())
{
model.SetKernel(SVM.SvmKernelType.Linear);
model.Type = SVM.SvmType.CSvc;
model.C = 1;
model.TermCriteria = new MCvTermCriteria(100, 0.00001);
//bool trained = model.Train(trainData, trainClasses, null, null, p);
TrainData td = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses);
bool trained = model.TrainAuto(td, 10);
//changes up to this point
for (int i = 0; i < img.Height; i++)
{
for (int j = 0; j < img.Width; j++)
{
sample.Data[0, 0] = j;
sample.Data[0, 1] = i;
float response = model.Predict(sample);
img[i, j] =
response == 1 ? new Bgr(90, 0, 0) :
response == 2 ? new Bgr(0, 90, 0) :
new Bgr(0, 0, 90);
}
}
// changed the GetSupportVectors()
Mat supvec = model.GetSupportVectors();
int c = supvec.Height;
for (int i = 0; i < c; i++)
{
// The way the data is received changed as well
byte[] b = supvec.GetData(i);
float[] v = new float[] { (float)b[0], (float)b[1] };
PointF p1 = new PointF(v[0], v[1]);
img.Draw(new CircleF(p1, 4), new Bgr(128, 128, 128), 2);
}
}
//display the original training samples
for (int i = 0; i < (trainSampleCount / 3); i++)
{
PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
img.Draw(new CircleF(p1, 2.0f), new Bgr(255, 100, 100), -1);
PointF p2 = new PointF(trainData2[i, 0], trainData2[i, 1]);
img.Draw(new CircleF(p2, 2.0f), new Bgr(100, 255, 100), -1);
PointF p3 = new PointF(trainData3[i, 0], trainData3[i, 1]);
img.Draw(new CircleF(p3, 2.0f), new Bgr(100, 100, 255), -1);
}
this.pictureBox1.Image = img.Bitmap;
新开博客,目的为学习交流,本人QQ:273651820。
改完这部份后还报一个:System.DivideByZeroException:“尝试除以零。”的错误,这个错误比较简单,分类标签的类型从float改为int就行了(外网上看到的,反正改完能用就没管原理。)
以下代码在Emgucv 3.2版本下编译通过了,3.3版本没试过,用过的同学给个回复。图片中的前几个ML的例子都调通了,唯独最后的一个EM算法没调通,和SVM一样的问题,但资料太少,以后再尝试了。 int trainSampleCount = 150;
int sigma = 60;
#region Generate the training data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<int> trainClasses = new Matrix<int>(trainSampleCount, 1);
Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);
Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount / 3, 1);
trainData1.GetCols(0, 1).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
trainData1.GetCols(1, 2).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
trainData2.SetRandNormal(new MCvScalar(400), new MCvScalar(sigma));
Matrix<float> trainData3 = trainData.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
trainData3.GetCols(0, 1).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
trainData3.GetCols(1, 2).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
Matrix<int> trainClasses1 = trainClasses.GetRows(0, trainSampleCount / 3, 1);
trainClasses1.SetValue(1);
Matrix<int> trainClasses2 = trainClasses.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
trainClasses2.SetValue(2);
Matrix<int> trainClasses3 = trainClasses.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
trainClasses3.SetValue(3);
#endregion
using (SVM model = new SVM())
{
model.SetKernel(SVM.SvmKernelType.Linear);
model.Type = SVM.SvmType.CSvc;
model.C = 1;
model.TermCriteria = new MCvTermCriteria(100, 0.00001);
//bool trained = model.Train(trainData, trainClasses, null, null, p);
TrainData td = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses);
bool trained = model.TrainAuto(td, 10);
//changes up to this point
for (int i = 0; i < img.Height; i++)
{
for (int j = 0; j < img.Width; j++)
{
sample.Data[0, 0] = j;
sample.Data[0, 1] = i;
float response = model.Predict(sample);
img[i, j] =
response == 1 ? new Bgr(90, 0, 0) :
response == 2 ? new Bgr(0, 90, 0) :
new Bgr(0, 0, 90);
}
}
// changed the GetSupportVectors()
Mat supvec = model.GetSupportVectors();
int c = supvec.Height;
for (int i = 0; i < c; i++)
{
// The way the data is received changed as well
byte[] b = supvec.GetData(i);
float[] v = new float[] { (float)b[0], (float)b[1] };
PointF p1 = new PointF(v[0], v[1]);
img.Draw(new CircleF(p1, 4), new Bgr(128, 128, 128), 2);
}
}
//display the original training samples
for (int i = 0; i < (trainSampleCount / 3); i++)
{
PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
img.Draw(new CircleF(p1, 2.0f), new Bgr(255, 100, 100), -1);
PointF p2 = new PointF(trainData2[i, 0], trainData2[i, 1]);
img.Draw(new CircleF(p2, 2.0f), new Bgr(100, 255, 100), -1);
PointF p3 = new PointF(trainData3[i, 0], trainData3[i, 1]);
img.Draw(new CircleF(p3, 2.0f), new Bgr(100, 100, 255), -1);
}
this.pictureBox1.Image = img.Bitmap;
新开博客,目的为学习交流,本人QQ:273651820。
相关文章推荐
- SVM 代码示例
- matlab svmtrain和svmclassify函数使用示例
- [Apache commons系列]DBUtils简介-3.示例代码
- 人头检测代码示例:SVM+HOG
- Android ApiDemos示例解析(128):Views->Layout Animation->3. Reverse Order
- SVM -- R的演示及应用示例
- ngRx 官方示例分析 - 3. reducers
- 3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例
- SPSS Modeler 建模示例---细胞样本分类(SVM)学习
- 3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例
- Python 3.x读写csv文件中数字的方法示例
- 机器学习之支持向量机SVM及代码示例
- 【OpenCV3.3】SVM与字符分类示例
- svm理论与实验之17: libsvm最简单Java示例(2行)
- libgdx示例-SuperJumper分析 3. 游戏中的物体与主游戏逻辑
- Python SVM(支持向量机)实现方法完整示例
- 3行程序搞定SVM分类-用JAVA程序调用LibSVM API 最简单的示例
- opencv SVM示例代码
- 人头检测代码示例:SVM+HOG
- SVM+MFCC在0-9单词识别应用示例