This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
I asked a small AI model on my laptop to tell me how the sky changed between two sunsets. It told me there were more clouds in the first photo. Then I swapped the photos, and it said the exact same thing.
What I Built π
Same Spot is a "what changed?" machine for the sky. π€οΈ
Every evening the sky puts on a different show. Same terrace, same skyline, completely different mood. I wanted to know whether a small AI model running on my own laptop could notice those differences the way I do: more clouds, a pinker sky, a hazier horizon, or the camera simply pointing somewhere else.
How it gets you outside πΆββοΈ
The photos are the whole point. You step outside at sunset, take a picture from the same spot, and go back to your life. The laptop only comes in afterwards, so the screen is the shortest part of the experience.
Who it's for πΏ
Anyone who keeps a loose record of a place: gardeners watching a patch of soil, hikers returning to a viewpoint, bird watchers, or people who just like watching the same sky.
The twist ππ§
I don't trust the model's first answer. Every pair of photos is compared twice, in both directions, and I then check each claim against my own eyes. That's how I caught it inventing shadows, missing camera movement, and giving the same answer no matter which photo came first.
Everything runs offline on a CPU-only laptop, with no cloud, no account and no uploads. βοΈπ«
Demo
Code
# Same Spot
A local, no-cloud tool that compares photos of the same outdoor spot taken on different evenings, using an open-weight model (Gemma 3 4B via Ollama) on a CPU-only laptop.
## How it works
- run\_all.py sends each pair of photos to Gemma 3 in both directions (forward and reversed)
- results are saved to SQLite and rendered in results.html
- a claim only counts if it survives the swap AND matches what I can see
## Run it
1. Install Ollama and run ollama pull gemma3:4b
2. pip install ollama pillow
3. Edit the PHOTOS list in run\_all.py, then python run\_all.py
Findings
- Brightness and warmth: often right, but not always (it once called the 9 Sept sky more orange, which was wrong).
- Framing: after the prompt fix it notices the framing differs in every run, but understates it ("slightly different").
- Position bias: in one pair itβ¦
Screenshots of the comparison
How I Built It π οΈπ€
- Model: Gemma 3 4B, an open-weight model that can read images, run through Ollama.
- Hardware: an Intel i7-13620H laptop with 16 GB RAM and no GPU. Each comparison took about 60 seconds (58 to 64 s across my runs).
-
Pipeline: a Python script resizes each photo, sends a pair to Gemma, saves the result in SQLite, and builds a plain
results.htmlpage with the photos and findings side by side. - The method that mattered: every pair is compared in both directions (A to B, then B to A). A real finding should flip when I swap the order, and I then check each claim against my own eyes.
What went wrong first. My first prompt made the model invent shadows in silhouette scenes, say "city skyline remains consistent" when the foreground had completely changed, and treat a placeholder I forgot to replace ("EDIT TIME") as a real time of day. It also mixed up two causes: my photos were taken on different days and at different minutes relative to sunset, so "brighter" could mean either.
What I changed. I told the model roughly when sunset is, asked it to say whether the framing differs before comparing anything, removed shadows from the prompt, and made it put anything it couldn't judge into an "uncertain" list.
Results after the fix π, scored by me against the photos:
| Pair | Direction | β Correct | β οΈDebatable | βWrong |
|---|---|---|---|---|
| 9 Sept to 16 Sept | forward | 3 | 1 | 1 |
| 9 Sept to 16 Sept | reverse | 2 | 2 | 0 |
| 16 Sept to 19 Sept | forward | 4 | 1 | 0 |
| 16 Sept to 19 Sept | reverse | 2 | 1 | 2 |
11 of 19 claims correct, 5 debatable, 3 wrong: useful, but not trustworthy on its own.
What improved: no more invented shadows, the model now notices that the framing differs in every run, and it names specific foreground objects correctly (a dark metal beam in one photo, a blue roof in another).
What still fails: it understates the framing change ("slightly different" when the camera angle is clearly different), and in one pair it said "more clouds in Image 1" in both directions, attaching the claim to whichever photo came first. It also got the sky colour wrong in one run. That is exactly the kind of mistake the both-directions check exists to catch.
What I'd try next: describe each photo on its own first, then compare the two text descriptions, so the model never sees two images in a fixed order. I'd also mount my phone in one spot on the terrace, so the framing stays the same and the sky is the only thing that changes.
Why Does Open Innovation Matter? ππ»
Because the best thing I found only happened because I was allowed to poke the model. π
Catching the position bias meant running every pair twice, rewriting the prompt again and again, and reading the raw output. With Gemma on my laptop, each extra run cost me about a minute and nothing else. Free to re-run meant free to doubt.
- π My sunset photos never left my laptop. The only copies online are the ones I chose to publish here.
- π I could cross-examine it. I controlled the model and the prompt, so I could swap the photo order, read what it actually said, and spot the invented shadows and the "more clouds in Image 1" habit.
- π‘ It works anywhere. No account, no connection, and no GPU, just a CPU-only laptop.
A bigger closed model would probably describe the sky better, and I'd rather say that than hide it. But I'd have had to trust its answer. With this one, I could check it.
Prize Categories
- Best Use of Gemma π€: Gemma 3 4B is the whole engine. It's small enough to run locally through Ollama on a CPU-only laptop (about 60 seconds per comparison), and it reads images, so it could compare my sunset photos directly. I then tested it by running every pair in both directions and scoring 19 of its claims against the photos. That showed what Gemma gets right (named foreground objects), where it struggles (understating camera movement), and where it shows position bias.


Top comments (0)