SciSharp / SiaNet

An easy to use C# deep learning library with CUDA/OpenCL support
https://scisharp.github.io/SiaNet
MIT License
380 stars 83 forks source link

Image Classification using CNN #38

Open malhosary opened 5 years ago

malhosary commented 5 years ago

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?

deepakkumar1984 commented 5 years ago

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 notifications@github.com 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

malhosary commented 5 years ago

@deepakkumar1984 Thank you for your quick response, very appreciated.

deepakkumar1984 commented 5 years ago

I have modified the SiaNet rewriting from Scratch. Can you please share me your code so that I can test the scenario.