This game was my final project for COMP 521 "Modern Computer Games," developed in collaboration with Benedicte Leonard-Cannon. Our main purpose was to make an engaging and challenging game with interesting character abilities and puzzles to solve; we based our level design on game flow criteria and user feedback. You can read the full report here.
Want to play the game? Using a browser equipped with the Unity plugin, click here!
Language: C#
Game Engine: Unity
Where Am I?
Predicting Montreal neighbourhoods from Google street view images.
For the final project in COMP 598, "Applied Machine Learning," we were asked to use public data about the city of Montreal to make interesting predictions. My team and I observed that Montreal's neighbourhoods tend to look very distinctive, as the sample images below suggest. We gathered Google street view images of Montreal, and labeled them with the appropriate neighbourhood. We used this data to train three predictors. Notably, the convolutional neural network outperformed humans at the task of predicting neighbourhood from a street view image.
The full report for this project can be found here, and the code is here.
Language: Python
Library: Theano
I Can Walk!
An application of genetic algorithms to the development of quadruped gaits.
This was my final project for COMP 417, "Introduction to Robotics". The webpage for this project, which includes bloopers, is here.
Language: C++
Library: Open Dynamics Engine (ODE)
Maze Game
The cake is not a lie!
The player's goal is to reach a very large slice of cake. However, it is across a dangerous river, which can only be crossed via a maze hidden behind the waterfall.
The maze is randomly procedurally generated at the start of each play-through. There are three coloured barriers which must be passed before the end of the maze can be reached. The barriers can only be destroyed by throwing the appropriately-coloured ball of magic at them.
The placement of each door and magic ball is algorithmically determined to ensure that all instances of the maze are solvable.
Want to play the game? Using a browser equipped with the Unity plugin, click here!
Language: C#
Game Engine: Unity
Difficult Digit Classification
Classifying distorted images of numbers.
The University of Montreal, with the aim of renewing the challenge of digit classification, introduced a new dataset: one where various distorting transformations are applied to the traditional images. For the third project in COMP 598 "Applied Machine Learning," we were challenged to obtain competitive results with this new dataset.
My teammates and I decided to focus our efforts on a convolutional neural network (whose architecture, arrived at through cross-validation, is shown above), winning 4th place among 21 teams in the classroom Kaggle competition with 92.8% accuracy.
The code for this project is here, and the full report can be found here
Language: Python
Library: Theano
Ray Tracer
This was one of the later assignments in the course COMP 557, "Fundamentals of Computer Graphics." Students were asked to implement a ray tracer with Blinn-Fong lightning model, leading to visually interesting results with multiple light sources.
An implementation of game physics and collision handling
This project implemented many concepts. The background terrain was generated using the midpoint bisection method with brownian motion roughness. I also implemented my own game physics for the projectile rocks (coming out of the right-side cannon) and the cat ragdolls simulated using verlet integration (coming out of the left-side cannon). Moreover, I implemented my own collision detection and resolution. My code is available here.
Want to see it in action? Using a browser equipped with the Unity plugin, click here!
Language: C#
Game Engine: Unity
Zombies
An application of finite state machines, behaviour trees, and A* path planning
The simulation consists of a survivor character (blonde head pictured above) who must collect all swirly candies before exiting throught the pink gate while remaining out of the sight of zombie slimes. The survivor is controlled by a behaviour tree AI and plans its path to goal locations using A* path planning. There are four types of zombies whose behaviours are controlled through finite state machines; the simulation is set to have a ratio of difficult to easy zombies such that the survivor wins approximately 50% of the time. Both the zombies and the survivor also exhibit collision avoidance behaviours. The zombies that are visible to the survivor via raycasting are highlighted in magenta. My code is available here.
Want to see it in action? Using a browser equipped with the Unity plugin, click here!
Language: C#
Game Engine: Unity
Pacman Tracker
Object tracking using hybridized top-down and bottom-up methods
We applied blob-tracking methods and supplemented them with a colour-based particle filter to help distinguish between game entities when blobs merged and split. A full project report can be found here, and the code is available here.
Language: Python
#Emotion
A Twitter sentiment analysis dataset using a neurotransmitter-based model of emotion
As one of my earliest forays in machine learning, my teammates and I developed a new dataset with the aim of predicting sentiment from tweets. Our goal was to reach better granularity than simply positive vs negative emotion, so we used a 9-label classication system based on Lovheim's cube (pictured above). After collecting tweets and labelling them, we performed preliminary tests on our preprocessed dataset using basic machine learning algorithms. A full project report can be found here.
Language: Python
Thematic Classification of Scientific papers from Abstracts
An exercise in preprocessing text data
This project took place in the context of an in-class Kaggle competition; my team won first place. Having learned from my experience in the #Emotion project, I suggested to my teammates that we focus our efforts on preprocessing the scientific abstracts. Notably, we removed stop words (those that appeared most often in the training dataset), applied the Porter stemming algorithm, and removed words that appeared only once in the training dataset. Using unigram, bigram, and TF-IDF features, we compared the performance of naive Bayes, AdaBoost, and SVM learning algorithms. The full project report can be found here, and the code is available here.