← All workHackathon · HackUDC · 2026

GoofyTex: find the products in an outfit

Turn an outfit photo into a ranked list of catalogue products. Third place in the Inditex challenge at HackUDC, built in 36 hours.

3rd
Inditex challenge
Explore a real query
01 / Detect7 regions
A person wearing a grey suit and carrying a black bag.
YOLO · clothing detectionB_f02579277f25

02 / Isolate the garment

From outfit to catalogue.

Select a region to inspect the crop. Below are the products the system ranked for this outfit.

Actual detector crop: clothing 1Detector crop
Clothing 196.8% detector confidence

03 / RetrieveTop 3 of 15

  1. Rank 1: blazer from the catalogue01

    blazer

    I_9c998133940c

  2. Rank 2: blazer from the catalogue02

    blazer

    I_fea5ecd722fa

  3. Rank 3: trousers from the catalogue03

    trousers

    I_3e58f0c998ef

Ranking for the full outfit. Selecting a box changes the crop shown above.

Two similar blazers lead the ranking. The system keeps competing candidates rather than one result per garment.

About this example

The catalogue candidates are saved model outputs for the complete outfit. Boxes were computed with the project's YOLO clothing detector ↗. Detector confidence describes the detected region, not whether a catalogue product is the correct match.

Fig. 1 · Explore clothing detections, garment crops and ranked catalogue products. Switch examples or select a garment to explore.

The challenge: for every “bundle” photo, a model wearing a full outfit, return up to 15 catalogue products ranked by how likely they are to be in it.

Why look at garments?

A whole-image embedding mostly learns the scene: the street, the pose, the light. So the pipeline looks at garments, not photos. YOLO finds each piece of clothing, each crop is embedded with a fashion-tuned SigLIP (OpenCLIP, Marqo), and products are retrieved per crop by cosine similarity, then merged into one ranking.

The examples above show clothing detections, garment crops and ranked catalogue products. Select a box to inspect its crop. The product ranking belongs to the complete outfit and stays fixed as you explore the detected regions.

The difficult query is worth a look: the saved ranking leads with sunscreen products for a photo of a dressed person. Similarity can latch onto the wrong visual signal. Seeing the products next to the input makes that mistake easy to spot.

What I worked on

  • Contrastive fine-tuning of the bundle and product encoders, with hard negatives mined from the model’s own mistakes every few epochs.
  • The inference pipelines: per-crop retrieval with test-time augmentation, a top-1-per-garment variant so a three-piece outfit doesn’t get padded to 15 guesses, and a “phase 1” variant that restricts the index to the right catalogue section and boosts products whose category matches a zero-shot label on the crop.
  • The model ensemble: combining the best runs by reciprocal rank fusion.

What I’d point out

  • The catalogue already knows things the model would otherwise have to learn: section, category, gender. Using them as filters and boosts is cheap signal.
  • Ranking 15 slots when an outfit has three pieces is a precision problem disguised as a recall one. The top-1-per-garment variant is the honest answer to it.
Case studyRepoNoteTF-IDF + PCA · 25 documents

Search by project name or topic↑↓ move ↵ open