ML.NETで実装した同様のプログラムはこちらの記事を参照してください。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Accord;
using Accord.Imaging;
using Accord.MachineLearning;
using Accord.MachineLearning.VectorMachines;
using Accord.MachineLearning.VectorMachines.Learning;
namespace SimpleImageFilpApp
{
public partial class FormMain : Form
{
const int CodeWordCount = 32;
private BagOfVisualWords bagofVW;
private MulticlassSupportVectorMachine msvm;
private List<ImageItem> ItemList;
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ItemList = new List<ImageItem>();
ImageItem ii;
ii = new ImageItem();
ii.FileName = "img\\windows-10.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 0;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-8.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 1;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-7.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 2;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-vista.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 3;
ItemList.Add(ii);
BinarySplit binarySplit = new BinarySplit(CodeWordCount);
bagofVW = new BagOfVisualWords(binarySplit);
Bitmap[] trainImages = new Bitmap[] { ItemList[0].bmp, ItemList[1].bmp, ItemList[2].bmp, ItemList[3].bmp};
bagofVW.Compute(trainImages);
for (int i = 0; i < ItemList.Count; i++) {
ItemList[i].codeWord = bagofVW.GetFeatureVector(ItemList[i].bmp);
for (int j = 0; j < ItemList[i].codeWord.Length; j++) {
textBox1.Text += Convert.ToString(ItemList[i].codeWord[j]) + ", ";
}
textBox1.Text += "\r\n\r\n";
}
}
private void button2_Click(object sender, EventArgs e)
{
int classes = 4;
var kernel = new Accord.Statistics.Kernels.ChiSquare();
msvm = new MulticlassSupportVectorMachine(0, kernel, classes);
double[][] input = { ItemList[0].codeWord, ItemList[1].codeWord, ItemList[2].codeWord, ItemList[3].codeWord };
int[] output = { ItemList[0].Classification, ItemList[1].Classification, ItemList[2].Classification, ItemList[3].Classification };
MulticlassSupportVectorLearning teacher = new MulticlassSupportVectorLearning(msvm, input, output);
teacher.Algorithm = func;
teacher.Run();
textBox1.Text = "Complete\r\n";
}
private void button3_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK) {
Bitmap bmp = new Bitmap(openFileDialog1.FileName);
double[] codeword = bagofVW.GetFeatureVector(bmp);
int classResult = msvm.Compute(codeword);
textBox1.Text = "Result:"+Convert.ToString(classResult) +"\r\n";
}
}
public ISupportVectorMachineLearning func(
KernelSupportVectorMachine machine,
double[][] inputs,
int[] outputs,
int class1,
int class2) {
SequentialMinimalOptimization smo = new SequentialMinimalOptimization(machine, inputs, outputs);
smo.UseComplexityHeuristic = true;
return smo;
}
}
}
ItemList = new List<ImageItem>();
ImageItem ii;
ii = new ImageItem();
ii.FileName = "img\\windows-10.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 0;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-8.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 1;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-7.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 2;
ItemList.Add(ii);
ii = new ImageItem();
ii.FileName = "img\\windows-vista.jpg";
ii.bmp = new Bitmap(ii.FileName);
ii.Classification = 3;
ItemList.Add(ii);
BinarySplit binarySplit = new BinarySplit(CodeWordCount);
bagofVW = new BagOfVisualWords(binarySplit);
BinarySplit | |
KMeans | k-means法 (k平均法) |
MeanShift | Mean shift法 |
GaussianMixtureModel | Mixture model によるクラスタリング |
Bitmap[] trainImages = new Bitmap[] { ItemList[0].bmp, ItemList[1].bmp, ItemList[2].bmp, ItemList[3].bmp};
bagofVW.Compute(trainImages);
for (int i = 0; i < ItemList.Count; i++) {
ItemList[i].codeWord = bagofVW.GetFeatureVector(ItemList[i].bmp);
for (int j = 0; j < ItemList[i].codeWord.Length; j++) {
textBox1.Text += Convert.ToString(ItemList[i].codeWord[j]) + ", ";
}
textBox1.Text += "\r\n\r\n";
}
int classes = 4;
var kernel = new Accord.Statistics.Kernels.ChiSquare();
msvm = new MulticlassSupportVectorMachine(0, kernel, classes);
double[][] input = { ItemList[0].codeWord, ItemList[1].codeWord, ItemList[2].codeWord, ItemList[3].codeWord };
int[] output = { ItemList[0].Classification, ItemList[1].Classification, ItemList[2].Classification, ItemList[3].Classification };
MulticlassSupportVectorLearning teacher = new MulticlassSupportVectorLearning(msvm, input, output);
teacher.Algorithm = func;
teacher.Run();
textBox1.Text = "Complete\r\n";
public ISupportVectorMachineLearning func(
KernelSupportVectorMachine machine,
double[][] inputs,
int[] outputs,
int class1,
int class2) {
SequentialMinimalOptimization smo = new SequentialMinimalOptimization(machine, inputs, outputs);
smo.UseComplexityHeuristic = true;
return smo;
}
if (openFileDialog1.ShowDialog() == DialogResult.OK) {
Bitmap bmp = new Bitmap(openFileDialog1.FileName);
double[] codeword = bagofVW.GetFeatureVector(bmp);
int classResult = msvm.Compute(codeword);
textBox1.Text = "Result:"+Convert.ToString(classResult) +"\r\n";
}