13,086,120 members (82,093 online)
alternative version

#### Stats

640.6K views
276 bookmarked
Posted 24 Jun 2007

# Image Recognition with Neural Networks

, 30 Oct 2007
 Rate this:
This article contains a brief description of BackPropagation Artificial Neural Network and its implementation for Image Recognition

## Introduction

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.

## Background

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.

## Implementation

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

```[Serializable]
struct PreInput
{
public double Value;
public double[] Weights;
};

[Serializable]
struct Input
{
public double InputSum;
public double Output;
public double Error;
public double[] Weights;
};

[Serializable]
struct Hidden
{
public double InputSum;
public double Output;
public double Error;
public double[] Weights;
};

[Serializable]
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)
{
while(CurrentError>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() ;

do
{
currentError = 0;
foreach (KeyValuePair<T, double[]> p in TrainingSet)
{
NeuralNet.ForwardPropagate(p.Value, p.Key);
NeuralNet.BackPropagate();
currentError += NeuralNet.GetError();
}

currentIteration++;

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.

## History

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

## About the Author

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

 Pro

## Comments and Discussions

 Re: layer 3 better or not Murat Firat20-Feb-11 20:34 Murat Firat 20-Feb-11 20:34
 Re: please help Murat Firat2-Feb-11 9:50 Murat Firat 2-Feb-11 9:50
 great work... :) kireina_301229-Jan-11 10:00 kireina_3012 29-Jan-11 10:00
 Re: great work... :) Bikash_coder30-Jan-11 0:17 Bikash_coder 30-Jan-11 0:17
 Re: great work... :) kireina_30121-Feb-11 7:59 kireina_3012 1-Feb-11 7:59
 Re: great work... :) Murat Firat2-Feb-11 9:42 Murat Firat 2-Feb-11 9:42
 Target output SeasickSailor20-Dec-10 2:14 SeasickSailor 20-Dec-10 2:14
 Displaying the image [modified] swathi65898-Oct-10 2:56 swathi6589 8-Oct-10 2:56
 Finger print Reconization waqas munim27-Jul-10 7:02 waqas munim 27-Jul-10 7:02
 blood cell images recognition [modified] kushagra.thakur11-Jul-10 16:36 kushagra.thakur 11-Jul-10 16:36
 Re: blood cell images recognition Murat Firat12-Jul-10 8:00 Murat Firat 12-Jul-10 8:00
 Re: blood cell images recognition [modified] Member 120039265-Nov-15 3:12 Member 12003926 5-Nov-15 3:12
 question diedou21-Jun-10 3:41 diedou 21-Jun-10 3:41
 Re: question Murat Firat23-Jun-10 3:04 Murat Firat 23-Jun-10 3:04
 Network...? mimi251313-Jun-10 6:36 mimi2513 13-Jun-10 6:36
 Re: Network...? Murat Firat14-Jun-10 20:11 Murat Firat 14-Jun-10 20:11
 Training image Minju8713-Jun-10 4:05 Minju87 13-Jun-10 4:05
 Re: Training image Murat Firat14-Jun-10 19:55 Murat Firat 14-Jun-10 19:55
 hight and low? [modified] yeah100028-Apr-10 7:43 yeah1000 28-Apr-10 7:43
 Re: hight and low? Murat Firat29-Apr-10 3:05 Murat Firat 29-Apr-10 3:05
 Train 2 by 2 and Then Join the .Net file ? subsari1222-Apr-10 21:40 subsari12 22-Apr-10 21:40
 Re: Train 2 by 2 and Then Join the .Net file ? Murat Firat25-Apr-10 11:56 Murat Firat 25-Apr-10 11:56
 Re: Train 2 by 2 and Then Join the .Net file ? subsari1230-Apr-10 4:12 subsari12 30-Apr-10 4:12
 great work Mikant8-Feb-10 10:51 Mikant 8-Feb-10 10:51
 Re: great work Murat Firat9-Feb-10 2:02 Murat Firat 9-Feb-10 2:02
 addition rasleen_136-Dec-09 5:04 rasleen_13 6-Dec-09 5:04
 high n low ? rasleen_136-Dec-09 5:00 rasleen_13 6-Dec-09 5:00
 Re: high n low ? Murat Firat6-Dec-09 23:08 Murat Firat 6-Dec-09 23:08
 How can i know what is desired output of each node? ranzan Pokhrel14-Nov-09 16:01 ranzan Pokhrel 14-Nov-09 16:01
 Complex Numbers KadirErturk22-Oct-09 19:59 KadirErturk 22-Oct-09 19:59
 Re: Complex Numbers Murat Firat24-Oct-09 7:55 Murat Firat 24-Oct-09 7:55
 identification value in Image Recognition with Neural Networks [modified] hankia14112-Oct-09 20:40 hankia1411 2-Oct-09 20:40
 Re: identification value in Image Recognition with Neural Networks Murat Firat4-Oct-09 6:19 Murat Firat 4-Oct-09 6:19
 Awesome!!!! zorou19-Aug-09 8:11 zorou 19-Aug-09 8:11
 what is the activation function?????? shanaprasad200910-Jun-09 12:16 shanaprasad2009 10-Jun-09 12:16
 Re: what is the activation function?????? Scott Benner25-Jun-09 8:36 Scott Benner 25-Jun-09 8:36
 webcame zulham9714-May-09 22:08 zulham97 14-May-09 22:08
 hey need help Member 45307714-May-09 0:03 Member 4530771 4-May-09 0:03
 Re: hey need help SafarTimura9-May-09 12:27 SafarTimura 9-May-09 12:27
 what is the convergence? onuriztech7-Apr-09 9:27 onuriztech 7-Apr-09 9:27
 Merhaba Murat Bey Ben bilgisayar mühendisliğinde okuyorum.Soft computing dersiyle alakalı ANN ödevi için kodunuzu örnek aldım.Hatta ödevi göndereyim. # Open source code of an ANN for learning & recognising patterns from images or videos # Specify the domain: problem, objective, solution approach, results # Document the basic concepts: neural architecture, learning algorithm, convergence # Develop a code versions, such that the algorithm still converges: * one version with modified neural architecture Bu ödevde bahsedildiği gibi koddaki convergence,results,objective lerimiz neler? ve modified neural architecture kısmını nasıl değiştirebilriz ki converge etmeye devam etsin? Şimdiden teşekkürler.İyi günler Onur FİDAN bil müh 4.sınıf
 Re: what is the convergence? Murat Firat8-Apr-09 1:20 Murat Firat 8-Apr-09 1:20
 Current Error jimbobmcgee30-Mar-09 9:00 jimbobmcgee 30-Mar-09 9:00
 problem running and compiling prophet8617-Mar-09 8:15 prophet86 17-Mar-09 8:15
 Re: problem running and compiling zimpzon15-Mar-10 22:37 zimpzon 15-Mar-10 22:37
 [Message Deleted] Member 453077115-Mar-09 3:15 Member 4530771 15-Mar-09 3:15
 Code in VB.Net mu'a7-Mar-09 9:44 mu'a 7-Mar-09 9:44
 what can i do to increase acuracy? Member 45307713-Mar-09 4:00 Member 4530771 3-Mar-09 4:00
 Re: what can i do to increase acuracy? SafarTimura9-May-09 12:21 SafarTimura 9-May-09 12:21
 Unhandled exception CristinaF8-Dec-08 7:41 CristinaF 8-Dec-08 7:41
 Last Visit: 31-Dec-99 18:00     Last Update: 16-Aug-17 16:36 Refresh 1234 Next »

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

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