← 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

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.






Detector crop03 / RetrieveTop 3 of 15
01blazer
I_9c998133940c
02blazer
I_fea5ecd722fa
03trousers
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.

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.







Detector crop03 / RetrieveTop 3 of 15
01heeled boot
I_7b47e11b1ba0
02flat boot
I_2a0ed0507610
03imit jeweller
I_6a67ccd96bfa
Ranking for the full outfit. Selecting a box changes the crop shown above.
Boots lead this ranking. Similar product categories can occupy several of the available slots.
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.

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.






Detector crop03 / RetrieveTop 3 of 15
01facial sunscreen
I_fb96896c0091
02facial sunscreen
I_507ff9b3a95a
03trousers
I_2344d9f40209
Ranking for the full outfit. Selecting a box changes the crop shown above.
The first two candidates are sunscreens. A real example of the model returning products that are not visibly supported by the photo.
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.
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.