Inspiration

About a third of food is wasted, and fresh produce is the biggest share at home. People rarely throw it out because they don't care. They just don't notice what's about to turn until it's too late. We wanted a camera that answers one question: when should I eat this?

What it does

RipeRadar finds every fruit or vegetable in a photo and identifies it. It scores ripeness from 0 to 100, highlights bruises and sugar spots, and predicts how many days are left for counter or fridge storage. It gives a clear action (wait, eat now, cook or freeze, compost) and a use-it-up plan. A pantry tab keeps a live eat-first list and tracks how much waste you've avoided.

How we built it

  • Segmentation: OpenCV GrabCut, seeded by Lab colour distance from the estimated background plus saturation.
  • Measurement: per-item HSV analysis of skin colour, plus adaptive darkness and brown-hue detection to map spots.
  • Identification: CLIP ViT-B/32 zero-shot, running locally on CPU, predicts the produce type and its condition.
  • Fusion: a per-produce model combines both signals ("green" means unripe for a banana but fresh for an apple; "yellow" means decay for broccoli). A shelf-life model turns the score into days left.
  • Plan: Gemini writes a recipe from the structured results, with offline tips as a fallback.
  • Stack: FastAPI backend, vanilla JS frontend.

Challenges we ran into

Robust segmentation without a GPU or a trained segmentation model. Shadows at item edges looked like bruises until we eroded the masks. Colour rules don't transfer between produce types.

Accomplishments that we're proud of

It runs fully on a low-end laptop CPU in about 1–2 s per scan, and every score is explainable in the "Why this score?" panel.

What we learned

How to combine classical computer vision with foundation models, and why explainability matters for a consumer AI app.

What's next for RipeRadar

Fine-tuning on a labelled ripeness dataset, a phone PWA, and barcode or receipt import for the pantry.

Built With

Share this project:

Updates

Submission history