SiaNet
SiaNet copied to clipboard
Image Classification using CNN
Hi, Thank you for the great work you did. I have the following simple CNN for image classification: ` featureShape = new Shape(new int[] { imageWidth, imageHeight, 3 }); var inputShape = new Shape(new int[] { imageWidth, imageHeight, 3 }); frameX = new DataFrame(featureShape);
labelShape = new Shape(new int[] { 3 });
frameY = new DataFrame(labelShape);
model = new Sequential(inputShape);
model.Add(new Conv2D(16, Tuple.Create(3, 3), Tuple.Create(2, 2), activation: new ReLU(), weightInitializer: new SiaNet.Model.Initializers.Xavier(), useBias: true, biasInitializer: new Model.Initializers.Ones()));
model.Add(new MaxPool2D(Tuple.Create(3, 3)));
model.Add(new Conv2D(32, Tuple.Create(3, 3), Tuple.Create(2, 2), activation: new ReLU(), weightInitializer: new SiaNet.Model.Initializers.Xavier(), useBias: true, biasInitializer: new Model.Initializers.Ones()));
model.Add(new MaxPool2D(Tuple.Create(3, 3)));
model.Add(new Flatten());
model.Add(new Dense(200, activation: new ReLU()));
// model.Add(new Dropout(0.5));
model.Add(new Dense(3, activation: new Softmax()));
var compiledModel = model.Compile(); compiledModel.EpochEnd += CompiledModel_EpochEnd; compiledModel.BatchStart += CompiledModel_BatchStart; compiledModel.BatchEnd += CompiledModel_BatchEnd; compiledModel.TrainingStart += CompiledModel_TrainingStart1; compiledModel.TrainingEnd += CompiledModel_TrainingEnd1;
// prepare dataset
trainingData = new DataFrameList(featureShape, labelShape);
PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Fire\", new float[] { 1,0,0 }, true);
PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Person\", new float[] { 0, 1, 0 }, true);
PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Police\", new float[] { 0,0,1 }, true);
compiledModel.Fit(trainingData, 40, 150, new Adam(), new CrossEntropy());
and the PrepareDataSet2 method:
static void PrepareDataSet2(string folderName, float[] classLabel, bool train = true)
{
int width = int.Parse(ConfigurationManager.AppSettings["ImageWidth"]);
int height = int.Parse(ConfigurationManager.AppSettings["ImageHeight"]);
Console.WriteLine("Loading dataset for class: " + classLabel);
var files = Directory.EnumerateFiles(folderName, "*.*", SearchOption.AllDirectories)
.Where(s => s.ToLower().EndsWith(".jpeg") || s.ToLower().EndsWith(".jpg") || s.ToLower().EndsWith(".bmp") || s.ToLower().EndsWith(".png") || s.ToLower().EndsWith(".gif"));
foreach (var file in files)
{
using (Bitmap full = (Bitmap)Bitmap.FromFile(file))
{
using (Bitmap bt = full.Resize(width, height, true))
{
float[] imgMatrix = bt.ParallelExtractCHW().ToArray();
//float[] imgMatrix = bt.ToByteArray().ToArray().Select(d => (float)d).ToArray();
if (imgMatrix.All(d => d == 0))
{
throw new Exception("All values in the image re 0!!");
}
//frameX.Add(imgMatrix);
if (train)
{
trainingData.AddFrame(imgMatrix, classLabel);
}
else
{
frameX.Add(imgMatrix);
}
}
}
}
Console.WriteLine("Finished loading dataset for class: " + classLabel);
}
` The issue is: i do training for this CNN and i use Predict method to do classification for new images but i always get the same result for prediction (0,0,1). Appreciate your support?
Thanks for your appreciation. I see the issue is there, I will check the issue and try to fix it.
Regards, Deepak
On Mon, Sep 24, 2018 at 4:48 PM malhosary [email protected] wrote:
Hi, Thank you for the great work you did. I have the following simple CNN for image classification: ` featureShape = new Shape(new int[] { imageWidth, imageHeight, 3 }); var inputShape = new Shape(new int[] { imageWidth, imageHeight, 3 }); frameX = new DataFrame(featureShape);
labelShape = new Shape(new int[] { 3 }); frameY = new DataFrame(labelShape); model = new Sequential(inputShape); model.Add(new Conv2D(16, Tuple.Create(3, 3), Tuple.Create(2, 2), activation: new ReLU(), weightInitializer: new SiaNet.Model.Initializers.Xavier(), useBias: true, biasInitializer: new Model.Initializers.Ones())); model.Add(new MaxPool2D(Tuple.Create(3, 3))); model.Add(new Conv2D(32, Tuple.Create(3, 3), Tuple.Create(2, 2), activation: new ReLU(), weightInitializer: new SiaNet.Model.Initializers.Xavier(), useBias: true, biasInitializer: new Model.Initializers.Ones())); model.Add(new MaxPool2D(Tuple.Create(3, 3))); model.Add(new Flatten()); model.Add(new Dense(200, activation: new ReLU())); // model.Add(new Dropout(0.5)); model.Add(new Dense(3, activation: new Softmax()));var compiledModel = model.Compile(); compiledModel.EpochEnd += CompiledModel_EpochEnd; compiledModel.BatchStart += CompiledModel_BatchStart; compiledModel.BatchEnd += CompiledModel_BatchEnd; compiledModel.TrainingStart += CompiledModel_TrainingStart1; compiledModel.TrainingEnd += CompiledModel_TrainingEnd1;
// prepare dataset trainingData = new DataFrameList(featureShape, labelShape); PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Fire\", new float[] { 1,0,0 }, true); PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Person\", new float[] { 0, 1, 0 }, true); PrepareDataSet2(@"C:\Authorized Model\Keras Dataset\Police\", new float[] { 0,0,1 }, true); compiledModel.Fit(trainingData, 40, 150, new Adam(), new CrossEntropy());and the PrepareDataSet2 method:
static void PrepareDataSet2(string folderName, float[] classLabel, bool train = true) { int width = int.Parse(ConfigurationManager.AppSettings["ImageWidth"]); int height = int.Parse(ConfigurationManager.AppSettings["ImageHeight"]); Console.WriteLine("Loading dataset for class: " + classLabel); var files = Directory.EnumerateFiles(folderName, "*.*", SearchOption.AllDirectories) .Where(s => s.ToLower().EndsWith(".jpeg") || s.ToLower().EndsWith(".jpg") || s.ToLower().EndsWith(".bmp") || s.ToLower().EndsWith(".png") || s.ToLower().EndsWith(".gif")); foreach (var file in files) { using (Bitmap full = (Bitmap)Bitmap.FromFile(file)) { using (Bitmap bt = full.Resize(width, height, true)) { float[] imgMatrix = bt.ParallelExtractCHW().ToArray(); //float[] imgMatrix = bt.ToByteArray().ToArray().Select(d => (float)d).ToArray(); if (imgMatrix.All(d => d == 0)) { throw new Exception("All values in the image re 0!!"); } //frameX.Add(imgMatrix); if (train) { trainingData.AddFrame(imgMatrix, classLabel); } else { frameX.Add(imgMatrix); } } } } Console.WriteLine("Finished loading dataset for class: " + classLabel); }` The issue is: i do training for this CNN and i use Predict method to do classification for new images but i always get the same result for prediction (0,0,1). Appreciate your support?
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/deepakkumar1984/SiaNet/issues/38, or mute the thread https://github.com/notifications/unsubscribe-auth/AGCQKQ3wtIB2ogmDUOk3RZ3-5jAHe8eZks5ueIcpgaJpZM4W2KLt .
-- Regards, Deepak
@deepakkumar1984 Thank you for your quick response, very appreciated.
I have modified the SiaNet rewriting from Scratch. Can you please share me your code so that I can test the scenario.