2019 Discriminator Confidence -
Instead of using the task classifier's softmax confidence for weighting samples for pseudo labeling, use the discriminator's / domain classifier's confidence based on how source-like the feature representations of the samples appear. In other words, we multi-purpose the discriminator to not only aid in producing domain-invariant representations (like in DANN) but also to provide pseudo labeling confidence. Implemented in TensorFlow 2.0.
2018-2019 Deep Activity Learning -
Compare random forest activity learning with deep activity learning. Try various feature sets. Try adding domain adaptation and/or generalization to the deep network for further improvement. Random forest with Scikit-learn, deep learning with TensorFlow 2.0, hyperparameter tuning with Nevergrad.
2018-2019 Egg Drop Vision Landing Drone -
An autonomous egg drop entry: train an object detection neural network (SSD MobileNet v1) to detect frying pans using TensorFlow, export this model to TF Lite, and run this on images live captured on a Raspberry Pi Zero mounted on a drone and streamed to my laptop (since as of yet I haven't gotten it to run fast enough on the Pi). The laptop then sends back the target information via the MAVLink landing target message to the drone autopilot, a Pixhawk running ArduCopter. When the system is armed, it creates a flight plan going forward at the current heading and then as soon as the target is detected, switches to precision landing mode.
2017-2019 Robotic Activity Support -
Worked on a robotics project for the CASAS lab with the goal of helping older adults remain functionally independent longer with the help of this robot. Autonomous navigation using 2D lidar with Google Cartographer on Turtlebot 2. Object (and human) detection using TensorFlow and YOLO networks running in real time on Nvidia Jetson TX2. Calculate position of object/human in map with the depth channel of the camera and some coordinate transforms. Detection of user errors with Estimotes attached to key objects. Components mostly written by me: CNN training (v1), CNN training (v2), Jetson ROS nodes, ROS Python 3 versions, Tablet interface.
2018 Variational Recurrent Adversarial Domain Adaptation (VRADA) -
In TensorFlow 1.x implemented an existing domain adaptation method from another paper since they did not publicly release their code. Also included a CNN option for comparing with image domain adaptation in addition to time-series domain adaptation. Experimented with VRNNs, CNNs, TCNs, and LSTMs. Used on 5 real-world and 2 synthetic time-series datasets and 2 image datasets.
2018 Control Lights with Raspberry Pi -
Creates a web hook for turning on/off my lights with a Raspberry Pi connected to a USB-to-serial adapter and then to a circuit controlling the lights. This web hook then works with IFTTT (if this then that), allowing me to trigger the lights on a variety of events such as time of day, a button press on your phone, or when I enter or leave an area.
2018 Linux Control for Google Assistant -
Allows you to setup a server on a computer (e.g. Raspberry Pi) that your Linux desktop and laptop computers will connect to and then allow some remote commands to be run via Google Assistant, e.g. power on via Wake-on-LAN, lock or unlock the screen, put to sleep, open or close a program, etc.
2016-2017 Teaching High School Math -
I taught high school math for the 2016/2017 school year. I ended up using LibreOffice for keeping track of grades but wanted an easy way to view a summary of the grades. I wrote a Python script that will update a Calc sheet that can be printed for showing whole-class grades to other teachers and output an individual file per student listing exactly what he or she got on everything and what he or she is missing to show the students individually.
2016 CPU Scheduler -
I created a Python discrete event simulation of a CPU scheduler for an Operating Systems class. It compares a variety of multilevel queue configurations using different algorithms such as first-come first-served, shortest process next, highest response ratio next, and round robin and then plots the wait time, response time, turnaround time, and throughput for these different configurations for CPUs containing different numbers of cores.
2016 Inverted Pendulum -
We tried 4th order, 6th order, and 8th order state space models for controlling the inverted pendulum at Walla Walla University. The output of our controller was a motor voltage converted to PWM, and the inputs were the cart position and pendulum angle. We determined our 8th order system was not observable nor controllable and the 4th order performed better than the 6th order when balancing a single pendulum, so we primarily used the 4th order system. We used LQR control from Octave and also implemented a Kalman-like unbiased FIR filter but were unsuccessful in getting the UFIR filter to work. Also, on the side I worked through how to rewrite a PID controller in terms of state space.
2016 Predicting Next Word with a Bayesian Network -
Using a discrete Bayesian network of n nodes, use up to n-1 previous words of a sentence to find the probability of what the next word may be. The network is trained on Project Gutenburg text documents of public domain books. This is kind of going for the autocomplete idea, but instead of operating as you type, it slowly computes (for like 13 seconds) when you finish a word. In other words, this is a proof-of-concept and not something actually useful.
2016 Simple Calculator Compiler Frontend with Spirit and LLVM -
We wrote a compiler frontend that could take in simple programs consisting of +, -, *, and / with parenthesis, assignment statements, and multiple lines separated by semicolons. For the parser we used Boost Spirit, and then we generated an intermediate representation using LLVM for our compiler output. This is not particularly useful as is except for learning more about how compilers work.
2015-2016 Machine Learning for a Thermal Soaring UAV -
This project was to develop improvements to thermal soaring algorithms for a UAV glider. I compared Bayesian parameter estimation and Gaussian process regression (GPR) to predict what a thermal's vertical velocity profile looks like, ending up choosing to use GPR in simulation. I also researched Bayesian networks, which could offer a great improvement, taking into account more than just vertical velocity, but this has been left for future work. Another team member implemented the centroid method for determining where a thermal is and another higher-level decision making with reinforcement learning and dynamic programming. Our parts have been developed separately and haven't yet been fully integrated.
2015 DHCP Spoofing Prevention -
Rather than setting up our own network in the real world, we decided to make our testing more repeatable by creating a virtual network with Mininet. My portion of the project focused on DHCP spoofing. I prevented the attack with ebtables on a switch blocking DHCP packets from non-whitelisted MACs. This required that I setup Linux per-process filesystem mounts for virtual computers in Mininet.
2014 GigaPlayer Plugin for LMMS -
I wanted to use the Maestro Concert Grand available on Linux Sampler's website in LMMS, but LMMS didn't support .gig files. I added a plugin for this using libgig to load and extract the audio data from the .gig files support. It supports multiple bit depths and sample rates and a subset of Linux Sampler's features, the ones I found most immediately useful. It is included in LMMS 1.2.
2013 Sprouts, a game - Github
For third quarter Intro to Programming class, we continued the yearly project of developing Conway's Game of Sprouts. We developed a potentially-useful base for future years to build upon and provided a functional GUI and very, very basic AI.
2012-2014 Image Processing for Bubble-form Grading -
This grades a particular variant of bubble forms. You upload a PDF of scanned scantron forms to a website served from CppCMS, the software extracts the images from the PDF using PoDoFo, analyzes each image finding what bubbles were filled in while showing a progress bar on the website, and then lets you download the results as a CSV file.
2011-2014 Bell System - Documentation,
We built a computer-controlled bell system for my school, which currently uses a Raspberry Pi computer. There is a website providing easy modification of the bell schedules remotely, and a C++ daemon that watches the config file ringing the bell at the correct times. It currently uses a USB-to-Serial converter, but it will eventually use the GPIO on the Raspberry Pi to operate the triac.
2011-2014 Management of Unsupported Packages -
I use Arch Linux, which has this thing called the Arch User Repository (AUR) where users can upload build scripts to share with others. To make people's lives easier, there are a ton of "AUR helpers." The few that I have tried out seemed a little bit big, so I decided to write my own in Bash. I tried to do it in as little code as possible. Since then, it grew. At the time I hadn't found any other that was designed around batch installation.
2011 Leet Speak Translator - Github
A long time ago I became interested in artificial intelligence. I created this XMPP chat bot in C# using some AIML library. When I switched to Linux, I redid a lot of it to work in Mono. It still ran, but it really wasn't all that great, so I decided to start coding Garot Bot 2.0 in Python. Unfortunately, this project kind of died due to the extreme difficulty and my lack of time. However, for part of this project, I did write the most robust multi-threaded Leet-to-English translator I've ever seen. I put it on Github so you can play with it if you like. It looks at the probability of word usage to determine what a message might be.
2007-2013 Pathfinder Bible Achivement Quiz Website -
This provided an online resource where users could contribute questions for specific chapters of the Bible that they and others were quizzed over and where users could also take computer-generated fill-in-the-blank quizzes. Data was stored in a MySQL database, and the website used AJAX to communicate with a PHP RPC.