



Search 150k+ wildlife images by describing what you want.
Wildlife image archives are usually searched by manual tags, which is slow and breaks down for anything visual. We trained a CLIP-style model from scratch so you can just type what you're looking for instead.
Wildlife photo archives are usually tagged by hand, which means search only works if someone already described the image the way you'd search for it. Try looking for something like "bird taking off at sunset" and you'll get nothing back.
We wanted to build something where you could just describe what you're looking for and get the right images back, without anyone having to tag anything.
Cerebro is a semantic search engine for wildlife photos. You type a description (a phrase, a scene, a vibe) and it returns the closest matches from 150k+ wildlife photos and tens of thousands of video stills. Results update live while you're still typing.
Under the hood, it's a CLIP-style setup: a vision transformer for images and a text transformer for language, both trained to map into the same embedding space. When you search, your query gets encoded into that space and we use FAISS to find the nearest image vectors in real time across the full dataset.
We trained the model entirely from scratch. No pretrained weights, no shortcuts. We started with 3 million general image-text pairs from CC3M, then fine-tuned on 153k wildlife images using a pseudo-labelling loop we ran three times. The model was a ViT-B-32 (~151M params) trained on 4x RTX 4090s with multi-GPU data parallelism, all within the 24-hour hackathon window.
The pseudo-labelling loop was the key trick: use the model's own improving predictions to generate labels for the unlabelled wildlife data, fine-tune on those, repeat. Each cycle made it sharper on the domain without any manual annotation.
We also ended up building the frontend twice. The first version (Streamlit) couldn't handle streaming text changes, and the whole point was that results should feel instant, updating while you're still mid-sentence. So we rewrote it in Next.js and rethought how the frontend consumed the API.
This was one of those projects where the model quality, the vector search speed, the API, the interface all had to work well together for the end result to feel like anything at all. If any one piece was slow or wrong, the whole thing fell apart. It's a good example of how I think about building: understanding the full system, not just one slice of it.
CalgaryHacks 2025 — 1st Place, AI/ML Bounty
Want to know more about the process? Check out the Devpost here or reach out to me at leek@leakedleek.xyz!