3 BSc dissertation, awarded a First

Card Scanner

Point your phone at a Pokémon card and the app names it, looks up what it's worth today, and adds it to your collection. Two on-device models do the recognising. The harder design problem was making the camera do exactly what people expect.

Role
Solo designer and developer
Context
BSc dissertation, University of Lincoln. Awarded a First
Platform
Phone app (Flutter) with on-device AI
Timeline
October 2024 to May 2025

One photo instead of a hundred searches

A collection can run to hundreds of cards whose value changes week to week, and pricing it means searching for every card one at a time. The app turns that into a single step: photograph the card, confirm what it is, and it joins a collection that keeps its own prices up to date.

Four phone screens: a card lined up on the camera, an 'Is this your card?' dialog with the name, set and price and Yes and No buttons, a portfolio grid of cards with prices and percentage changes, and one card opened showing its current price, previous price and a red decrease
Scan, confirm, collect, check. Every card in the collection carries its price and how far it moved since the last refresh.

The outline is a promise

The camera screen shows a card-shaped outline to line the card up in. In testing, the photo didn't match it: it came out more zoomed in than the outline suggested, sometimes turned sideways, and the preview itself looked stretched. Each fix I was offered added more automatic processing, like smart cropping and orientation guessing, and each one made the result harder to predict.

I went the other way and set one rule: whatever is inside the outline is exactly what gets captured, with no automatic cropping and no zoom. The outline tells people what will happen, so the app has to keep its word.

Two models, one question each

Rather than one model choosing between hundreds of near-identical cards, the work is split in two. The first model answers "which set is this from?" and the second answers "which card in that set?". Both start from MobileNetV2, a model already trained to understand images in general, and are retrained on 488 card designs from five sets. That approach is called transfer learning.

Data flow diagram: the input image is preprocessed, the set model classifies it, a confidence check of 0.85 passes it to the card model for that set, a second check of 0.75 leads to the result with card details and value, and low confidence at either check goes to error handling with recapture options
From photo to price, with a confidence check after each model. When either one is unsure, the app offers a retake instead of guessing.
Confusion matrix for the set model across 151, Base, Fossil, Jungle and Wizards Black Star Promos, with nearly every prediction on the diagonal and two small errors
The set model's results. Almost everything lands on the diagonal, and both misses are between older Wizards-era sets that share a look.

Accurate enough to trust

The set model scored 97.4% on held-out cards, and the card model identified every one of the 488 cards it was tested on. Training on rotated and darkened copies of each card improved results on unseen photos by about 6%, because real photos are rarely straight or well lit.

Small enough to live on the phone

Converting the models to TensorFlow Lite roughly halved their size for a point or two of accuracy at most, so scanning works without a server and without waiting on a connection. Only the price lookup needs the internet.

A trade-off I made on purpose: the card model first predicted rarity too, but that extra output broke the model when it was converted for the phone. I removed it, kept the app working on-device, and documented why in the dissertation. And a perfect score on a clean test set says as much about the test set as the model. Photos taken in a dim room are the next thing I'd test.

A collection that shows movement

Collectors care about what changed, not just what they own. The home screen leads with the total value and the cards that moved most, the portfolio shows each card's price with its change in green or red, and pulling down refreshes every price from live market data. A search screen covers sealed products too, and a profile keeps a running count of cards and total value.

Three phone screens: home showing a collection value of $276.48 and a list of top movers with percentage changes, a search screen listing 151 sealed products with add buttons, and a profile with a Bulbasaur avatar, total cards and total value
Home, search and profile. The same five tabs sit at the bottom of every screen, with the camera one tap away.

Stack and methods