Fun with Deconvolutions and Convolutional Neural Networks in Java

Restored Image

I’ve gotten to an interesting point in my latest project, inspired by Google’s fascinating recent work with convolutional neural networks. The project can now apply inverse convolution operations using multiple fitness functions.

Blurred Image

I wanted to explore the technology of image processing neural networks from the ground-up, so I started by building the fundamentals of a backpropagation neural network library. Building the basic components and solving the initial problems has been interesting, and surprisingly complex.

My first pretty-picture results are a demonstration of a deconvolution operation, which many people would recognize as a “deblur” operation. This is generally solved in the frequency domain using FFTs, however in this code we solve it directly in the spacial domain using the same learning algorithm used in other neural networks. The deconvolution problem is thus modeled as a learning task.

Original Image

In the images you can see a test image, it’s blurred counterpart, the recovered/de-blurred image, and a verification image produced by re-blurring the de-blurred image.

The blurred image shown uses a 5x5 convolution matrix, which does not preserve information. That means to reconstruct the image, the program is working with an incomplete set of constraints. The solution is further defined by constraints against negative-valued regions and a maximum entropy goal.

Deconvolutions have a lot of promise, but as far as I know they have not yet realized that potential in consumer applications. That makes it, for me, a very interesting point between science and engineering.