Projects
Square Scrambler
The first assignment in my artificial intelligence course was to implement a peg solitaire solver in Python and compare the breadth-first search, depth-first search, and A* search algorithms. Another similar assignment that is usually given in AI courses is the fifteen puzzle. I decided to implement an optimal fifteen puzzle solver in Java in order to further experiment with search algorithms.
Each time the shuffle button is pressed, 25 random moves will be applied to the puzzle. Try solving it yourself or use the solve button to see the optimal solution. This fifteen puzzle solver uses the Iterative Deepening A* search algorithm with a pattern database heuristic.
Square Scrambler
Shuffle
Reset
Solve
Separator
Separator is a command line tool I created which is able to remove vocals from a stereo mix.
Most vocal removal software uses a technique known as phase cancellation. In this method, the phase of one of the stereo channels is inverted and added to the other channel. This causes audio common to both channels to be cancelled out. Since vocals are usually centered in a mix, this technique can be effective in removing vocals. Unfortunately, this technique has a number of limitations, primarily of which the resulting audio is a single mono channel and it is not possible to isolate vocals.
The reason phase cancellation produces a mono mix is that it operates on individual samples only and makes no additional assumptions in the time domain. A more advanced technique that is able to produce a stereo mix is known as the ADRess algorithm (Azimuth Discrimination and Resynthesis), and this is the technique that is implemented in Separator. This algorithm takes the time domain into account by analyzing the input mix as a set of short overlapping time segments. The short-time Fourier transform is then used to convert each of these time segments to the frequency domain.
Once in the frequency domain, frequency values can be zeroed whose magnitude ratios between the left and right channels are within a certain range since these frequencies should correspond to audio that has been placed in the center of a mix. A range is used since a segment’s frequencies will generally overlap slightly with frequencies from the left or right channels. In Separator, a value for this range has been chosen subjectively and will be configurable in future versions. Once the center mixed audio’s frequencies have been zeroed, the inverse Fourier transform of each of the overlapping segments is taken. These segments are then added back together to produce a stereo output.
Download Separator: Separator.zip
Separator uses the open source Kiss FFT library for computing the FFT. The license for this library is available here: Kiss FFT License
Ray Caster
One of the assignments in my graphics course was to develop a ray caster. The program takes a configuration file as input, in which the user can add lighting and various object primitives. Each object can be translated, rotated, and scaled. When run, the program casts a ray for each pixel in the image, and the positions of the objects and the light sources are used to calculate the resulting pixel colors. Some of the renderings I created are shown below.
In addition to rendering static images, I also wrote code to generate multiple frames in order to render a short video of the objects rotating around.
Download the videos: RayCaster.zip
Neural Network Checkers
In my machine learning course, I worked on a group project to develop an artificial neural network that would play checkers. Checkers is a game that was recently solved in 2007 with Jonathan Schaeffer’s Chinook. This means that Chinook will always produce a win or a draw. The only problem with Chinook is that it requires large endgame databases and a lot of processing power. The advantage of an artificial neural network implementation is that it actually begins to make generalizations about game strategies much like a human would when playing the game. Although neural network implementations will probably never be able to play at the level of Chinook, they do not require much memory or processing power.
In 1999, David Fogel and Kumar Chellapilla developed a very good artificial neural network implementation called Blondie24. Our goal was to reimplement Blondie24 and try to replicate the results. Unfortunately, my group succeeded in only producing a novice player. This was partly due to the fact that weeks of processing time were required in order to evolve the artificial neural networks.
Since then, I have continued to work on the project. If I am eventually able to produce a player as good as Blondie24, I would like to release it as an engine for the CheckerBoard checkers interface.
Cilia Classification
For my capstone project, I worked on a group project to write code that would classify videos of ciliary motion as normal or abnormal. Cilia are hairlike structures found on cells throughout the body. When the motion of cilia is abnormal, it can lead to severe medical problems. Our final code was able to classify about 95% of the videos correctly as normal or abnormal motion.
My mentor for this project was Shannon Quinn, a CMU-Pitt Computational Biology Ph.D. student specializing in bioimage informatics. This project was a small portion of a project that Shannon has been working on with Dr. Chakra’s group at Pitt. The eventual goal is to implement a cloud-based service where doctors can upload videos of a patient’s cilia and receive statistics about the motion as well as recommendations for which drugs and treatment would work best. The advantage of an automated cloud-based service is that it not only eliminates the need for trained lab personnel to spend time analyzing the videos, but it also provides more accurate diagnoses and can possibly determine different types of abnormal ciliary motion.