Classifying Images

So we can convert a picture to numbers in an array, but we can also create a picture from numbers in an array.

 

Open 5.5 Classifying Images/Pic to and From Data/Generate image from array.py

Figure 67. Turning numbers into images

Here, we’ve reduced the colour palate from 255 colours to just 4. Here, black is 0 and white is 3, and we have two shades of grey between.

 

Run 1. Generate_image_from_array.py

Figure 68. Output from number to image algorithm

Your task

Now experiment with the numbers in the array.

'Round-Trip" Image Data.

Now let’s bring picture into an array, then turn it back into a picture. The purpose of this is just to illustrate how we can process a full cycle of image processing.

 

Open and run 5.5 Classifying Images/Pic to and From Data/2. Image_to_array_to_csv_and_back.py

 

The process works like this:

 

First the program reads the file, in this case ‘Face.png’

 

Next, the array is exported as a .txt file

 

Then this external text file is read by the program, and a new array is created, from which a picture can be plotted.

Figure 69. Image to data and back to image

Let’s look at how the code works -

Figure 70. Image 'round-trip' code analysis

Handwriting Recognition.

So now we know how images can be processed, lets now explore a practical application – handwriting recognition. We will do this by classifying images.

 

In the following exercise, we are going explore how we can compare arrays to find similarities in order to recognise an image.

 

Will use 10 image files, each with a handwritten digit between 0 and 9.

 

We will then bring in another digit and see if the algorithm can find the correct match.

 

Note that this is an extremely crude version of image recognition, but it shows some basic techniques.

In the first instance, we are looking for a handwritten digit ‘8’.

Classifying Images

 

First look in the folder - 5.5 Classifying Images/Digit Recognition/

 

Note that 0.png - 9.png is the training data.

10.png, 11.png, and 12.png are test data.

 

Click on 10.png to Open it using Image Viewer.

Figure 72. Handwritten digits - open with Image Viewer

Test data 10.png looks like digit '8'.

 

Now open and run Digit_recogniser.py and note that the image that appears is the same as 8.png in the Training Data.

Figure 73. Image recognition code recognises a hand written digit

It worked!

 

Let’s now see how this happened.

 

The goal of the code is to turn the training images and test data into arrays, simplify, compare and find the closet fit.

Figure 74. Test, training and recognised digits

Looking deeper, we see that the algorithm is searching through arrays to find the training data array with the best fit for the test data.

 

The test data (10.png) array has a value of 14479...

 

The Array for training data 0.png has a value of 54479...

 

The Array for training data 8.png has a value of 14481... which is the closet fit

Figure 75. The recognition mechanism

Let’s now look at the code in Digit_recogniser.py

 

The 4th line, starting with traindigits = [] sets up the first set of arrays. It reads each training file and the test image file, turns it into a numbered array.

 

traindigits = []

for i in range(11):

 

It then calculates a coefficient for each array, in other words it finds patterns which it enumerates and assigns to the array. This makes it easier to compare arrays.


  B, c, D = np.linalg.svd(A, full_matrices=False) 

 

We next feed in the number of the test image file.

 

testdig = traindigits[10] 

 

Then, we look for the training data array that has the lowest difference between itself and the test digit array

 

recogniseddigit = min(traindigits[:10], key=lambda e: sum((e['singular']-testdig['singular'])**2))

 

Finally, we show the test data image file that corresponds to the test data array with the lowest difference.

 

plt.imshow(recogniseddigit['original'], interpolation='nearest', cmap=plt.cm.Greys_r)

plt.show()

 

Looking at it all together

Figure 76. Digit recogniser code analysis

It's critical to note that a commercial application of image recognition would use much more training data than we have done here. For example, each of the digits below may have been inputted as hundreds, thousands or even millions of different images. This way, accuracy can be greatly increased.

Your Task.

Try different images by renaming them to 10.png

Figure 77. Sequence for trying the digit recogniser with other digits

Complete and Continue