Click here to Skip to main content
12,813,675 members (31,070 online)
Click here to Skip to main content
Add your own
alternative version


274 bookmarked
Posted 24 Jun 2007

Image Recognition with Neural Networks

, 30 Oct 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
This article contains a brief description of BackPropagation Artificial Neural Network and its implementation for Image Recognition
Screenshot - screen211.png


Artificial Neural Networks are a recent development tool that are modeled from biological neural networks. The powerful side of this new tool is its ability to solve problems that are very hard to be solved by traditional computing methods (e.g. by algorithms). This work briefly explains Artificial Neural Networks and their applications, describing how to implement a simple ANN for image recognition.


I will try to make the idea clear to the reader who is just interested in the topic.

About Artificial Neural Networks (ANNs)

Artificial Neural Networks (ANNs) are a new approach that follow a different way from traditional computing methods to solve problems. Since conventional computers use algorithmic approach, if the specific steps that the computer needs to follow are not known, the computer cannot solve the problem. That means, traditional computing methods can only solve the problems that we have already understood and knew how to solve. However, ANNs are, in some way, much more powerful because they can solve problems that we do not exactly know how to solve. That's why, of late, their usage is spreading over a wide range of area including, virus detection, robot control, intrusion detection systems, pattern (image, fingerprint, noise..) recognition and so on.

ANNs have the ability to adapt, learn, generalize, cluster or organize data. There are many structures of ANNs including, Percepton, Adaline, Madaline, Kohonen, BackPropagation and many others. Probably, BackPropagation ANN is the most commonly used, as it is very simple to implement and effective. In this work, we will deal with BackPropagation ANNs.

BackPropagation ANNs contain one or more layers each of which are linked to the next layer. The first layer is called the "input layer" which meets the initial input (e.g. pixels from a letter) and so does the last one "output layer" which usually holds the input's identifier (e.g. name of the input letter). The layers between input and output layers are called "hidden layer(s)" which only propagate the previous layer's outputs to the next layer and [back] propagates the following layer's error to the previous layer. Actually, these are the main operations of training a BackPropagation ANN which follows a few steps.

A typical BackPropagation ANN is as depicted below. The black nodes (on the extreme left) are the initial inputs. Training such a network involves two phases. In the first phase, the inputs are propagated forward to compute the outputs for each output node. Then, each of these outputs are subtracted from its desired output, causing an error [an error for each output node]. In the second phase, each of these output errors is passed backward and the weights are fixed. These two phases is continued until the sum of [square of output errors] reaches an acceptable value.

Screenshot - fig1_nnet_thinner.png


The network layers in the figure above are implemented as arrays of structs. The nodes of the layers are implemented as follows:

struct PreInput
    public double Value;
    public double[] Weights;            

struct Input
    public double InputSum;                
    public double Output;                
    public double Error;                
    public double[] Weights;        
struct Hidden        
    public double InputSum;                    
    public double Output;                
    public double Error;                
    public double[] Weights;        
struct Output<T> where T : IComparable<T>         
    public double InputSum;                
    public double output;                
    public double Error;                
    public double Target;     
    public T Value;   

The layers in the figure are implemented as follows (for a three layer network):

private PreInput[] PreInputLayer;
private Input[] InputLayer;
private Hidden[] HiddenLayer;
private Output<string>[] OutputLayer;

Training the network can be summarized as follows:

  • Apply input to the network.
  • Calculate the output.
  • Compare the resulting output with the desired output for the given input. This is called the error.
  • Modify the weights for all neurons using the error.
  • Repeat the process until the error reaches an acceptable value (e.g. error < 1%), which means that the NN was trained successfully, or if we reach a maximum count of iterations, which means that the NN training was not successful.

It is represented as shown below:

void TrainNetwork(TrainingSet,MaxError)
          foreach(Pattern in TrainingSet)
               ForwardPropagate(Pattern);//calculate output 
               BackPropagate()//fix errors, update weights

This is implemented as follows:

public bool Train()
    double currentError = 0;
    int currentIteration = 0;
    NeuralEventArgs Args = new NeuralEventArgs() ;

        currentError = 0;
        foreach (KeyValuePair<T, double[]> p in TrainingSet)
            NeuralNet.ForwardPropagate(p.Value, p.Key);
            currentError += NeuralNet.GetError();
        if (IterationChanged != null && currentIteration % 5 == 0)
            Args.CurrentError = currentError;
            Args.CurrentIteration = currentIteration;
            IterationChanged(this, Args);

    } while (currentError > maximumError && currentIteration < 
    maximumIteration && !Args.Stop);

    if (IterationChanged != null)
        Args.CurrentError = currentError;
        Args.CurrentIteration = currentIteration;
        IterationChanged(this, Args);

    if (currentIteration >= maximumIteration || Args.Stop)   
        return false;//Training Not Successful
    return true;

Where ForwardPropagate(..) and BackPropagate() methods are as shown for a three layer network:

private void ForwardPropagate(double[] pattern, T output)
    int i, j;
    double total;
    //Apply input to the network
    for (i = 0; i < PreInputNum; i++)
        PreInputLayer[i].Value = pattern[i];
    //Calculate The First(Input) Layer's Inputs and Outputs
    for (i = 0; i < InputNum; i++)
        total = 0.0;
        for (j = 0; j < PreInputNum; j++)
            total += PreInputLayer[j].Value * PreInputLayer[j].Weights[i];
        InputLayer[i].InputSum = total;
        InputLayer[i].Output = F(total);
    //Calculate The Second(Hidden) Layer's Inputs and Outputs
    for (i = 0; i < HiddenNum; i++)
        total = 0.0;
        for (j = 0; j < InputNum; j++)
            total += InputLayer[j].Output * InputLayer[j].Weights[i];

        HiddenLayer[i].InputSum = total;
        HiddenLayer[i].Output = F(total);
    //Calculate The Third(Output) Layer's Inputs, Outputs, Targets and Errors
    for (i = 0; i < OutputNum; i++)
        total = 0.0;
        for (j = 0; j < HiddenNum; j++)
            total += HiddenLayer[j].Output * HiddenLayer[j].Weights[i];

        OutputLayer[i].InputSum = total;
        OutputLayer[i].output = F(total);
        OutputLayer[i].Target = OutputLayer[i].Value.CompareTo(output) == 0 ? 1.0 : 0.0;
        OutputLayer[i].Error = (OutputLayer[i].Target - OutputLayer[i].output) *
                                       (OutputLayer[i].output) * (1 - OutputLayer[i].output);
private void BackPropagate()
    int i, j;
    double total;
    //Fix Hidden Layer's Error
    for (i = 0; i < HiddenNum; i++)
        total = 0.0;
        for (j = 0; j < OutputNum; j++)
            total += HiddenLayer[i].Weights[j] * OutputLayer[j].Error;
        HiddenLayer[i].Error = total;
    //Fix Input Layer's Error
    for (i = 0; i < InputNum; i++)
        total = 0.0;
        for (j = 0; j < HiddenNum; j++)
            total += InputLayer[i].Weights[j] * HiddenLayer[j].Error;
        InputLayer[i].Error = total;
    //Update The First Layer's Weights
    for (i = 0; i < InputNum; i++)
        for(j = 0; j < PreInputNum; j++)
            PreInputLayer[j].Weights[i] +=
                LearningRate * InputLayer[i].Error * PreInputLayer[j].Value;
    //Update The Second Layer's Weights
    for (i = 0; i < HiddenNum; i++)
        for (j = 0; j < InputNum; j++)
            InputLayer[j].Weights[i] +=
                LearningRate * HiddenLayer[i].Error * InputLayer[j].Output;
    //Update The Third Layer's Weights
    for (i = 0; i < OutputNum; i++)
        for (j = 0; j < HiddenNum; j++)
            HiddenLayer[j].Weights[i] +=
                LearningRate * OutputLayer[i].Error * HiddenLayer[j].Output;

Testing the App

The program trains the network using bitmap images that are located in a folder. This folder must be in the following format:

  • There must be one (input) folder that contains input images [*.bmp].
  • Each image's name is the target (or output) value for the network (the pixel values of the image are the inputs, of course) .

As testing the classes requires to train the network first, there must be a folder in this format. "PATTERNS" and "ICONS" folders [depicted below] in the Debug folder fit this format.

Screenshot - fig2_sampleInput_thinner.png Screenshot - fig3_sampleInput_thinner.png


  • 30th September, 2007: Simplified the app
  • 24th June, 2007: Initial Release

References & External Links


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Murat Firat
Software Developer (Senior)
Turkey Turkey
Has BS degree on computer science, working as software engineer in istanbul.

You may also be interested in...


Comments and Discussions

GeneralRe: Excellent! Pin
Murat Firat28-Mar-08 22:52
memberMurat Firat28-Mar-08 22:52 
GeneralYou are awesome! Pin
jadeburton20-Mar-08 15:52
memberjadeburton20-Mar-08 15:52 
GeneralRe: You are awesome! Pin
Murat Firat23-Mar-08 6:29
memberMurat Firat23-Mar-08 6:29 
Generalpattern recognition Pin
K|nS|ayer28-Feb-08 22:01
memberK|nS|ayer28-Feb-08 22:01 
AnswerRe: pattern recognition Pin
Murat Firat29-Feb-08 22:29
memberMurat Firat29-Feb-08 22:29 
Questionpattern recognition method Pin
rie athena6-Feb-08 15:00
memberrie athena6-Feb-08 15:00 
AnswerRe: pattern recognition method Pin
Murat Firat7-Feb-08 8:01
memberMurat Firat7-Feb-08 8:01 
GeneralThreshold Value Pin
cbc100031-Dec-07 15:40
membercbc100031-Dec-07 15:40 
AnswerRe: Threshold Value Pin
Murat Firat1-Jan-08 3:14
memberMurat Firat1-Jan-08 3:14 
GeneralAbout the pattern and input Pin
randy1014198326-Nov-07 3:51
memberrandy1014198326-Nov-07 3:51 
GeneralRe: About the pattern and input Pin
Murat Firat26-Nov-07 5:26
memberMurat Firat26-Nov-07 5:26 
GeneralAbout demo project Pin
newrocker24-Nov-07 21:27
membernewrocker24-Nov-07 21:27 
AnswerRe: About demo project Pin
Murat Firat25-Nov-07 11:08
memberMurat Firat25-Nov-07 11:08 
GeneralQuestions Pin
randy1014198324-Nov-07 17:43
memberrandy1014198324-Nov-07 17:43 
:-DI really think you work is really great.

I have some questions about the settings.

1. Is "Number of Layers" means that in addition to input, there are "Number of Layers" layers in the network? For example, if it is 1, the network consists one input and 1 output layer.

2.Number of Input Unit: why is it only for two or three layer net?

3.Number of Input Unit: Should it be the number of pixels of pattern? Why is its default value 295. It should be 27x33 that many.

4. What is the activation function f in this program?

Thank you very much. I appreciate your response. Thank you.

GeneralRe: Questions Pin
Murat Firat25-Nov-07 11:01
memberMurat Firat25-Nov-07 11:01 
QuestionDoubt in Input and Hidden Node. Pin
Vimalr18-Nov-07 20:24
memberVimalr18-Nov-07 20:24 
AnswerRe: Doubt in Input and Hidden Node. Pin
Murat Firat19-Nov-07 2:09
memberMurat Firat19-Nov-07 2:09 
GeneralReg deciding the layer units Pin
i_coder15-Nov-07 7:57
memberi_coder15-Nov-07 7:57 
GeneralRe: Reg deciding the layer units Pin
Murat Firat15-Nov-07 21:15
memberMurat Firat15-Nov-07 21:15 
QuestionCan I use your Neural network implementation for this... Pin
Jean-Francois Dufour12-Nov-07 23:42
memberJean-Francois Dufour12-Nov-07 23:42 
AnswerRe: Can I use your Neural network implementation for this... Pin
Murat Firat13-Nov-07 9:36
memberMurat Firat13-Nov-07 9:36 
GeneralExcellent Pin
merlin98131-Oct-07 5:01
membermerlin98131-Oct-07 5:01 
GeneralRe: Excellent Pin
Murat Firat1-Nov-07 0:10
memberMurat Firat1-Nov-07 0:10 
GeneralError in HiddenNum.cs Pin
CBrauer4-Oct-07 9:07
memberCBrauer4-Oct-07 9:07 
GeneralRe: Error in HiddenNum.cs Pin
Murat Firat30-Oct-07 14:16
memberMurat Firat30-Oct-07 14:16 
Questionerror in backpropagation code Pin
leeyang114012-Sep-07 10:01
memberleeyang114012-Sep-07 10:01 
AnswerRe: error in backpropagation code Pin
Murat Firat12-Sep-07 11:31
memberMurat Firat12-Sep-07 11:31 
GeneralRe: error in backpropagation code Pin
leeyang114012-Sep-07 12:40
memberleeyang114012-Sep-07 12:40 
GeneralRe: error in backpropagation code Pin
Murat Firat12-Sep-07 18:50
memberMurat Firat12-Sep-07 18:50 
QuestionAbout Question Of Hidden Layer Pin
cbc100011-Sep-07 22:49
membercbc100011-Sep-07 22:49 
AnswerRe: About Question Of Hidden Layer Pin
Murat Firat12-Sep-07 4:00
memberMurat Firat12-Sep-07 4:00 
QuestionQuestion Pin
belenong10-Sep-07 19:02
memberbelenong10-Sep-07 19:02 
AnswerRe: Question Pin
Murat Firat11-Sep-07 0:29
memberMurat Firat11-Sep-07 0:29 
Generalhelp Pin
shec3-Sep-07 11:42
membershec3-Sep-07 11:42 
GeneralFinding string Pin
brian256-Aug-07 15:30
memberbrian256-Aug-07 15:30 
AnswerRe: Finding string Pin
Murat Firat9-Aug-07 5:03
memberMurat Firat9-Aug-07 5:03 
GeneralGreat work! Pin
adkadkadkadk6-Jul-07 10:44
memberadkadkadkadk6-Jul-07 10:44 
GeneralRe: Great work! Pin
Murat Firat9-Jul-07 3:07
memberMurat Firat9-Jul-07 3:07 
GeneralSource code Pin
stuart.george29-Jun-07 5:44
memberstuart.george29-Jun-07 5:44 
GeneralRe: Source code Pin
Murat Firat4-Jul-07 4:18
memberMurat Firat4-Jul-07 4:18 
GeneralRe: Source code Pin
Member 1138720221-Jan-15 20:07
memberMember 1138720221-Jan-15 20:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170308.1 | Last Updated 30 Oct 2007
Article Copyright 2007 by Murat Firat
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid