← Back to home
ExperienceProjectsContactResume

Open to software engineering roles.

Graduating April 2027. Reach out by email or LinkedIn.

Email meLinkedInDownload resume

Project · Course project

Road Surface Classification

An image classifier that predicts whether a road is dry, snowy, icy or mixed from a dashcam photo.

  • Machine learning
  • PyTorch
  • Computer vision
  • Course project
  • Team of three
GitHub↗(opens in a new tab)
Role
Built my own model, its experiments and the VGG16 comparison
When
Mar – Apr 2026
Team
Three students
Data
9,000 dashcam images
A dashcam photo of a snowy road goes into a CNN, which labels it snow out of dry, snow, ice and mixed

Overview

A team project for a machine learning course: teach a model to tell dry, snowy, icy and mixed roads apart, using dashcam images from the WinterSim Initiative.

On a team of three, I built my own model from scratch in PyTorch, ran six documented training experiments and compared the results against a pretrained VGG16.

Highlights

  • Accuracy by run
    0%
    50%
    100%
    Run 1 · Test set: 98.3%Run 2 · Test set: 81.5%Run 3 · Test set: 90.3%Run 4 · Test set: 92.3%Run 5 · Test set: 69.0%Run 6 · Test set: 75.2%Run 1 · Outside images: 23.3%Run 2 · Outside images: 25.0%Run 3 · Outside images: 21.7%Run 4 · Outside images: 16.7%Run 5 · Outside images: 26.7%Run 6 · Outside images: 33.3%Test setOutside images123456
    RunTest setOutside images
    198.3%23.3%
    281.5%25.0%
    390.3%21.7%
    492.3%16.7%
    569.0%26.7%
    675.2%33.3%

    Narrowed the gap

    Over six runs, test accuracy fell from 98% to 75% while accuracy on outside images rose from 23% to 33%, as the model memorized less.

  • Mixed-road accuracy, test set
    Before1.6%
    Before: 1.6%
    After weighted loss70.5%
    After weighted loss: 70.5%
    Before1.6%
    After weighted loss70.5%

    Fixed an ignored class

    Weighting the loss lifted accuracy on the rare mixed class.

  • Accuracy on outside images
    My model33.3%
    My model: 33.3%
    Pretrained VGG1636.7%
    Pretrained VGG16: 36.7%
    My model33.3%
    Pretrained VGG1636.7%

    Found the real limit

    A pretrained VGG16 barely beat my small model on outside images, which pointed to the data, not the model, as the limit.

Key challenges

98% accuracy that meant nothing +Result: Test accuracy dropped to 82% while outside accuracy held, which confirmed the 98% was memorization. From then on, I judged every run on outside images.

Problem

The first model scored 98% on the test set but only 23% on 60 outside images it had never seen.

What I did

Traced it to the model memorizing near-identical video frames. On a teammate's suggestion, I shrank it from 1.8 million to about 3,000 parameters and retested on outside images.

How it's built

Model

  • PyTorch
  • torchvision

Training

  • Jupyter
  • Google Colab
  • Kaggle GPUs

More projects

Back to all work →
VolleyNet app screens: sign-in, player profile and calendar

VolleyNet

  • Mobile app
  • iOS and Android
  • Flutter
  • Supabase
  • Stripe

Social app for volleyball players and hosts, live on iOS and Android with 500+ users. Players find teammates, chat and keep live scores; hosts run paid events with waivers and reminders.

View project →
Interactive Idlewild app icon over the town map, with the article list and an event screen

Interactive Idlewild

  • Mobile app
  • Flutter
  • Firebase
  • Built solo
  • Honors thesis

Mobile app preserving the history of Idlewild, Michigan, a historic Black resort community. Visitors explore an illustrated map, read community-written stories and find events, while admins review every post.

View project →