UncleanCode commited on
Commit
989d4ef
·
verified ·
1 Parent(s): f1e4ff3

Upload via Autoresearch export_data

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ images/igbo_search_grid.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,3 +1,266 @@
1
  ---
2
  license: apache-2.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: apache-2.0
3
+ language:
4
+ - ig
5
+ - ha
6
+ - yo
7
+ - en
8
+ library_name: pytorch
9
+ tags:
10
+ - image-text-retrieval
11
+ - multimodal
12
+ - contrastive
13
+ - nigerian-languages
14
+ - igbo
15
+ - hausa
16
+ - yoruba
17
+ - siglip
18
+ - native-bird
19
+ datasets:
20
+ - AfriMM/AFRICaption
21
+ base_model:
22
+ - Modularcomputing/Native-Bird
23
+ - google/siglip-base-patch16-224
24
+ metrics:
25
+ - recall
26
  ---
27
+
28
+ # Native-Bird2: image–text retrieval for Igbo, Hausa, Yoruba and English
29
+
30
+ Native-Bird2 puts **Igbo, Hausa, Yoruba and English captions and photos into one shared embedding space**, so a sentence in
31
+ any of the four languages can find matching images, and an image can find matching captions.
32
+
33
+ It is the multimodal extension of [Native-Bird](https://huggingface.co/Modularcomputing/Native-Bird), our cross-lingual
34
+ sentence embedding model for Nigerian languages.
35
+
36
+ | | |
37
+ |---|---|
38
+ | Text encoder | [`Modularcomputing/Native-Bird`](https://huggingface.co/Modularcomputing/Native-Bird) (768-d, LaBSE fine-tune), **frozen** |
39
+ | Image encoder | [`google/siglip-base-patch16-224`](https://huggingface.co/google/siglip-base-patch16-224) (SigLIP ViT-B/16), **frozen** |
40
+ | Trained part | two linear projection heads (image 768→512, text 768→512), L2-normalised, plus a learnable temperature |
41
+ | Objective | symmetric InfoNCE (CLIP-style), batch 256; captions of the *same* image in other languages are masked out of the negatives |
42
+ | This repo ships | the projection heads only (~3 MB). Both encoders are pulled from their own Hub repos. |
43
+
44
+ **Headline (809 held-out test images):** Igbo text→image Recall@5 **69.6** vs **12.0** for multilingual CLIP zero-shot;
45
+ Hausa 59.4 vs 4.2; Yoruba 52.8 vs 2.8.
46
+
47
+ ![Igbo image search: top-3 images for Igbo queries vs the same query in English](images/igbo_search_grid.png)
48
+
49
+ *Igbo image search on held-out images. Left: top-3 for the Igbo query. Right: top-3 for the same query written in English.*
50
+
51
+ ## Files
52
+
53
+ | file | what it is |
54
+ |---|---|
55
+ | `model.safetensors` | projection-head weights: `img.net.weight` [512, 768], `img.net.bias`, `txt.net.weight` [512, 768], `txt.net.bias`, `logit_scale` (log space) |
56
+ | `best_native_bird.pt` | the same heads as the original PyTorch checkpoint (`model`, `cfg`, `d_img`, `d_txt`), loaded by `search.py` |
57
+ | `config.json` | head shapes, encoder ids, temperature |
58
+ | `configs/default.yaml` | full training/eval config |
59
+ | `search.py`, `nbmm/common.py` | text→image search and the shared model code |
60
+ | `requirements.txt` | Python dependencies |
61
+ | `metrics.json`, `results/` | every benchmark number below, training logs, Igbo demo output, text-encoder bitext check |
62
+ | `data/processed/test.parquet` | the 809-image test split (image ids + filtered captions), used as the default search gallery |
63
+ | `data/processed/split_summary.json`, `data/processed/filter_stats.json` | split counts and caption-filter statistics |
64
+ | `images/` | Igbo search grid and loss curves |
65
+
66
+ ## Training data
67
+
68
+ **[AfriMM/AFRICaption](https://huggingface.co/datasets/AfriMM/AFRICaption)** (Apache-2.0): 8,091 Flickr8k images, one English
69
+ caption per image, machine-translated into African languages. We use the `eng`, `ibo`, `hau` and `yor` columns.
70
+ Images come from the public Flickr8k mirror `mustafa2ak/Flickr8k-Images` (8,091 / 8,091 image ids matched and readable).
71
+
72
+ **Caption filtering** (Igbo, Hausa, Yoruba; English kept as-is). Rules applied in order, first failure = drop:
73
+
74
+ 1. R1: empty or fewer than 2 tokens
75
+ 2. R2: repetition loop (same token ≥3× in a row, or one token >50% of a ≥4-token caption; 2× reduplication such as Igbo *anụnụ anụnụ* is kept)
76
+ 3. R3: untranslated English (≥50% of tokens of length ≥3 found in the English source, or an exact copy)
77
+ 4. R4: character-length ratio vs English outside [0.45, 2.2]
78
+ 5. R5: LaBSE cosine(caption, English) below max(0.50, 5th percentile of survivors)
79
+
80
+ | lang | kept | dropped | R2 loop | R3 copy | R4 length | R5 semantic | R5 threshold |
81
+ |---|---|---|---|---|---|---|---|
82
+ | ibo | 7,436 | 655 | 6 | 250 | 7 | 392 | 0.742 |
83
+ | hau | 7,655 | 436 | 12 | 11 | 10 | 403 | 0.603 |
84
+ | yor | 7,611 | 480 | 24 | 16 | 39 | 401 | 0.510 |
85
+
86
+ **Split:** image-level 80/10/10 with seed 42; no image appears in more than one split (checked).
87
+
88
+ | split | images | eng | ibo | hau | yor | pairs |
89
+ |---|---|---|---|---|---|---|
90
+ | train | 6,473 | 6,473 | 5,943 | 6,116 | 6,083 | 24,615 |
91
+ | val | 809 | 809 | 742 | 770 | 764 | 3,085 |
92
+ | test | 809 | 809 | 751 | 769 | 764 | 3,093 |
93
+
94
+ `test_unfiltered` re-scores the same 809 test images with the raw, unfiltered captions.
95
+
96
+ ## Training
97
+
98
+ - 1× H100, about 27 minutes for the whole experiment (feature caching, both arms, baselines, evaluation).
99
+ - Image features and frozen text features are computed once and cached, so the heads train in well under a second per epoch.
100
+ - 20 epochs, batch 256, AdamW (lr 1e-3, weight decay 0.01, 100 warm-up steps, cosine schedule), linear 512-d heads,
101
+ learnable temperature initialised at ln(1/0.07) and clamped at ln(100). Each image contributes one pair per kept language.
102
+ - **Checkpoint selection by validation mean Recall** (4 languages × both directions × R@1/5/10):
103
+ - frozen Native-Bird text arm: best at **epoch 3** (val 60.46), **the released checkpoint**
104
+ - unfreezing the top-2 Native-Bird layers (text lr 1e-5): best at epoch 2 (val 60.35), a near tie, so no gain for about 50× the training time per epoch (9.7 s vs 0.2 s)
105
+ - Both arms **overfit after epoch 2–3**: training loss keeps falling while validation recall drops (frozen arm: 60.46 at epoch 3 → 54.74 at epoch 20).
106
+
107
+ ![Training loss and validation mean recall per epoch](images/loss_curves.png)
108
+
109
+ ## Benchmark
110
+
111
+ Test = 809 held-out images. The gallery is every test caption in that language (eng 809, ibo 751, hau 769, yor 764), so
112
+ chance R@1 is about 0.13%. i2t = image→text, t2i = text→image. Mean R = average of the six recall numbers.
113
+
114
+ Baselines: **untrained heads** (random-init, seeded, same encoders) and **mCLIP zero-shot**
115
+ (`sentence-transformers/clip-ViT-B-32` image tower + `sentence-transformers/clip-ViT-B-32-multilingual-v1` text tower).
116
+
117
+ ### Test split (filtered captions)
118
+
119
+ | model | lang | i2t R@1 | i2t R@5 | i2t R@10 | t2i R@1 | t2i R@5 | t2i R@10 | mean R |
120
+ |---|---|---|---|---|---|---|---|---|
121
+ | untrained heads | eng | 0.37 | 1.11 | 1.48 | 0.12 | 0.87 | 1.73 | 0.95 |
122
+ | untrained heads | ibo | 0.0 | 0.8 | 2.4 | 0.13 | 0.8 | 1.6 | 0.96 |
123
+ | untrained heads | hau | 0.26 | 0.78 | 1.69 | 0.13 | 1.04 | 1.69 | 0.93 |
124
+ | untrained heads | yor | 0.26 | 0.92 | 2.36 | 0.26 | 0.92 | 1.05 | 0.96 |
125
+ | mCLIP zero-shot | eng | 58.34 | 84.67 | 92.21 | 57.85 | 83.31 | 89.99 | 77.73 |
126
+ | mCLIP zero-shot | ibo | 6.13 | 14.38 | 20.91 | 4.26 | 11.98 | 16.11 | 12.29 |
127
+ | mCLIP zero-shot | hau | 3.38 | 6.63 | 8.71 | 1.82 | 4.16 | 6.11 | 5.13 |
128
+ | mCLIP zero-shot | yor | 2.36 | 4.84 | 6.41 | 1.31 | 2.75 | 4.84 | 3.75 |
129
+ | **Native-Bird2 (frozen text, released)** | eng | 46.48 | 77.38 | 88.5 | 44.99 | 76.64 | 87.02 | 70.17 |
130
+ | **Native-Bird2 (frozen text, released)** | ibo | **39.28** | **70.71** | **82.29** | **39.01** | **69.64** | **81.49** | **63.74** |
131
+ | **Native-Bird2 (frozen text, released)** | hau | **33.16** | **61.64** | **74.64** | **32.25** | **59.43** | **74.9** | **56.0** |
132
+ | **Native-Bird2 (frozen text, released)** | yor | **25.52** | **53.8** | **64.66** | **23.56** | **52.75** | **65.84** | **47.69** |
133
+ | Native-Bird unfreeze top-2 | eng | 44.99 | 78.74 | 89.0 | 46.23 | 76.14 | 87.89 | 70.5 |
134
+ | Native-Bird unfreeze top-2 | ibo | 37.95 | 70.57 | 83.49 | 39.68 | 70.17 | 83.36 | 64.2 |
135
+ | Native-Bird unfreeze top-2 | hau | 31.73 | 60.47 | 74.9 | 30.3 | 60.73 | 74.38 | 55.42 |
136
+ | Native-Bird unfreeze top-2 | yor | 23.3 | 52.88 | 64.66 | 24.87 | 53.27 | 64.4 | 47.23 |
137
+
138
+ ### test_unfiltered (same 809 images, raw captions, 809 per language)
139
+
140
+ | model | lang | i2t R@1 | i2t R@5 | i2t R@10 | t2i R@1 | t2i R@5 | t2i R@10 | mean R |
141
+ |---|---|---|---|---|---|---|---|---|
142
+ | frozen text (released) | eng | 46.48 | 77.38 | 88.5 | 44.99 | 76.64 | 87.02 | 70.17 |
143
+ | frozen text (released) | ibo | 36.59 | 67.37 | 79.6 | 35.6 | 66.75 | 79.23 | 60.86 |
144
+ | frozen text (released) | hau | 31.52 | 59.21 | 72.06 | 30.9 | 57.73 | 72.81 | 54.04 |
145
+ | frozen text (released) | yor | 24.6 | 52.78 | 63.54 | 22.5 | 51.79 | 64.4 | 46.6 |
146
+ | unfreeze top-2 | eng | 44.99 | 78.74 | 89.0 | 46.23 | 76.14 | 87.89 | 70.5 |
147
+ | unfreeze top-2 | ibo | 35.72 | 67.86 | 81.09 | 36.96 | 67.12 | 80.22 | 61.5 |
148
+ | unfreeze top-2 | hau | 29.91 | 58.71 | 73.05 | 28.31 | 58.22 | 72.44 | 53.44 |
149
+ | unfreeze top-2 | yor | 22.74 | 50.31 | 62.42 | 23.98 | 52.41 | 62.79 | 45.77 |
150
+
151
+ Takeaways: on Igbo, Hausa and Yoruba the model beats multilingual CLIP by a wide margin (Igbo mean R 63.74 vs 12.29);
152
+ on English, mCLIP (trained on hundreds of millions of image–text pairs) is still ahead (77.73 vs 70.17). Scores on the raw
153
+ captions drop only 1–3 points, so the filter mainly cleans evaluation rather than propping up the model.
154
+
155
+ ## Igbo image search demo
156
+
157
+ Released checkpoint, gallery = the 809 test images. **All 751 held-out Igbo test captions** used as queries, scoring where
158
+ the caption's own image lands:
159
+
160
+ | query language | queries | top-1 | top-5 | top-10 | median rank |
161
+ |---|---|---|---|---|---|
162
+ | Igbo | 751 | **37.4%** | **68.4%** | **80.6%** | **2** |
163
+ | English (same images) | 809 | 45.0% | 76.6% | 87.0% | n/a |
164
+
165
+ Natural Igbo queries (top-5 overlap with the results for the same query in English):
166
+
167
+ | Igbo query | English | top-5 overlap with English query |
168
+ |---|---|---|
169
+ | Nkịta na-agba ọsọ n'elu ahịhịa | A dog running on the grass | 3/5 |
170
+ | Ụmụaka na-egwu egwu n'ime mmiri | Children playing in the water | 5/5 |
171
+ | Otu nwoke na-agba ịnyịnya ígwè | A man riding a bicycle | 4/5 |
172
+ | Otu nwanyị yi uwe na-acha uhie uhie | A woman wearing a red dress | 4/5 |
173
+ | Ndị mmadụ nọ n'elu ugwu | People on top of a mountain | 4/5 |
174
+ | Otu nwata nwoke na-awụli elu | A boy jumping in the air | 3/5 |
175
+ | Nkịta abụọ na-egwu egwu | Two dogs playing together | 2/5 |
176
+ | Ọtụtụ mmadụ nọ n'okporo ụzọ | A crowd of people on a street | 4/5 |
177
+
178
+ Full output, including per-query image ids and scores: `results/igbo_search.json`.
179
+
180
+ ## Usage
181
+
182
+ ### Standalone (no repo code)
183
+
184
+ ```python
185
+ import torch, torch.nn.functional as F
186
+ from PIL import Image
187
+ from huggingface_hub import hf_hub_download
188
+ from safetensors.torch import load_file
189
+ from sentence_transformers import SentenceTransformer
190
+ from transformers import AutoModel, AutoImageProcessor
191
+
192
+ w = load_file(hf_hub_download("Modularcomputing/Native-Bird2", "model.safetensors"))
193
+ text_enc = SentenceTransformer("Modularcomputing/Native-Bird")
194
+ siglip = AutoModel.from_pretrained("google/siglip-base-patch16-224").eval()
195
+ proc = AutoImageProcessor.from_pretrained("google/siglip-base-patch16-224")
196
+
197
+ @torch.no_grad()
198
+ def embed_text(texts):
199
+ e = text_enc.encode(texts, convert_to_tensor=True, normalize_embeddings=True).float().cpu()
200
+ return F.normalize(e @ w["txt.net.weight"].T + w["txt.net.bias"], dim=-1)
201
+
202
+ @torch.no_grad()
203
+ def embed_images(paths):
204
+ px = proc(images=[Image.open(p).convert("RGB") for p in paths], return_tensors="pt")["pixel_values"]
205
+ f = siglip.get_image_features(pixel_values=px)
206
+ if not torch.is_tensor(f): # some transformers versions return a ModelOutput
207
+ f = f.pooler_output
208
+ return F.normalize(f.float() @ w["img.net.weight"].T + w["img.net.bias"], dim=-1)
209
+
210
+ images = ["dog.jpg", "beach.jpg", "market.jpg"]
211
+ scores = embed_text(["Nkịta na-agba ọsọ n'elu ahịhịa"]) @ embed_images(images).T # cosine similarity
212
+ print(images[scores.argmax().item()])
213
+ ```
214
+
215
+ The same space works in every direction: Hausa or Yoruba queries, English queries, or image→caption retrieval.
216
+
217
+ ### With `search.py` (gallery = the 809 test images)
218
+
219
+ ```bash
220
+ git clone https://huggingface.co/Modularcomputing/Native-Bird2 && cd Native-Bird2
221
+ pip install torch torchvision && pip install -r requirements.txt
222
+ # search.py reads the Flickr8k images from data/raw/flickr8k/Flicker8k_Dataset/
223
+ python -c "from huggingface_hub import snapshot_download; snapshot_download('mustafa2ak/Flickr8k-Images', repo_type='dataset', allow_patterns=['Flicker8k_Dataset/*.jpg'], local_dir='data/raw/flickr8k')"
224
+ python search.py --ckpt best_native_bird.pt "Nkịta abụọ na-egwu egwu" "A dog running on the grass" -k 5
225
+ ```
226
+
227
+ Image features are computed once and cached under `data/features/`. Runs on CPU or GPU.
228
+
229
+ ## Limitations
230
+
231
+ - **Machine-translated captions.** Igbo, Hausa and Yoruba captions in AfriCaption are machine translations of English
232
+ Flickr8k captions, not native-speaker descriptions. The filter removes obvious failures (loops, untranslated English,
233
+ wrong length, low semantic match), but errors, literal phrasing and code-mixing remain, and the model learned from them.
234
+ - **Narrow image domain.** Flickr8k is about 8k mostly North-American/European everyday photos (people, dogs, sports,
235
+ outdoors). Expect weaker results on other scenes, on African contexts, on documents, products or fine-grained categories.
236
+ - **Small training set** (6,473 images). Both arms overfit after epoch 2–3; the released checkpoint is the early-stopped one.
237
+ - **Yoruba is the weakest language** (test mean R 47.69 vs 63.74 Igbo). Native-Bird's own Yoruba↔English bitext retrieval is
238
+ also lowest (acc@1 79.23 vs 96.66 Igbo, `results/text_encoder_crosslingual_test.json`), and LaBSE scores Yoruba lower, so
239
+ the filter's bottom-5% Yoruba tail drops some acceptable translations.
240
+ - **The filter is LaBSE-based.** LaBSE is not the model under test, but Native-Bird is a LaBSE fine-tune, so the filter is not
241
+ fully independent of the text encoder.
242
+ - **English is below mCLIP zero-shot** (mean R 70.17 vs 77.73); use a large English CLIP model if you only need English.
243
+ - Retrieval over a gallery of ~800 candidates; numbers on larger galleries will be lower.
244
+
245
+ ## Citation
246
+
247
+ Please cite AfriCaption, the dataset this model is trained on ([ACL Anthology](https://aclanthology.org/2026.africanlp-main.5/), [arXiv:2510.17405](https://arxiv.org/abs/2510.17405)):
248
+
249
+ ```bibtex
250
+ @inproceedings{oduwole-etal-2026-africaption,
251
+ title = "{A}fri{C}aption: Establishing a New Paradigm for Image Captioning in {A}frican Languages",
252
+ author = "Oduwole, Mardiyyah and Mireku, Prince and Adebanjo, Fatimo and Olajide, Oluwatosin and Aliyu, Mahi Aminu and Novikova, Jekaterina",
253
+ booktitle = "Proceedings of the 7th Workshop on {A}frican Natural Language Processing ({A}frica{NLP} 2026)",
254
+ month = mar,
255
+ year = "2026",
256
+ address = "Rabat, Morocco",
257
+ publisher = "Association for Computational Linguistics",
258
+ url = "https://aclanthology.org/2026.africanlp-main.5/",
259
+ doi = "10.18653/v1/2026.africanlp-main.5",
260
+ pages = "44--55"
261
+ }
262
+ ```
263
+
264
+ Also see [SigLIP](https://huggingface.co/google/siglip-base-patch16-224) and [Native-Bird](https://huggingface.co/Modularcomputing/Native-Bird).
265
+
266
+ Built by [Modularcomputing](https://huggingface.co/Modularcomputing).
best_native_bird.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:209316f3376f73b94836fe7129964620b8a6837db0eaf2191131ddc61830bf30
3
+ size 3153457
config.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architecture": "two linear projection heads (img, txt) -> L2-normalised shared space",
3
+ "image_encoder": "google/siglip-base-patch16-224",
4
+ "text_encoder": "Modularcomputing/Native-Bird",
5
+ "text_encoder_frozen": true,
6
+ "d_img": 768,
7
+ "d_txt": 768,
8
+ "proj_dim": 512,
9
+ "proj_hidden": 0,
10
+ "logit_scale_log": 2.903928756713867,
11
+ "logit_scale": 18.24568748474121,
12
+ "best_epoch": 3,
13
+ "max_text_len": 64,
14
+ "text_prompt": "",
15
+ "weights": {
16
+ "img.net.weight": "[proj_dim, d_img]",
17
+ "img.net.bias": "[proj_dim]",
18
+ "txt.net.weight": "[proj_dim, d_txt]",
19
+ "txt.net.bias": "[proj_dim]",
20
+ "logit_scale": "scalar, log space"
21
+ }
22
+ }
configs/default.yaml ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Native-Bird image-text alignment (AfriCaption / Flickr8k)
2
+ # All paths are relative to the project root.
3
+ seed: 42
4
+ data:
5
+ dir: data/processed # train/val/test parquet from scripts/04_split.py
6
+ image_dir: data/raw/flickr8k/Flicker8k_Dataset
7
+ langs: [eng, ibo, hau, yor] # captions used for training (each image contributes one pair per kept language)
8
+ max_text_len: 64
9
+ subset: null # int -> use only first N images per split (smoke tests)
10
+
11
+ image_encoder:
12
+ # Any open_clip model or HF CLIP/SigLIP checkpoint. Frozen; features are cached to disk once.
13
+ backend: hf # hf | open_clip
14
+ name: google/siglip-base-patch16-224
15
+ cache_dir: data/features # cached image features: <cache_dir>/<safe_name>/<split>.pt
16
+
17
+ text_encoder:
18
+ # Pick the arm. Each arm is a sentence-transformers model id.
19
+ arm: native_bird # native_bird | embeddinggemma2 | embeddinggemma1 | labse | custom
20
+ arms:
21
+ native_bird: {name: Modularcomputing/Native-Bird, prompt: ""}
22
+ embeddinggemma2: {name: google/embeddinggemma-2, prompt: "task: search result | query: ", text_only: true}
23
+ embeddinggemma1: {name: google/embeddinggemma-300m, prompt: "task: search result | query: "}
24
+ labse: {name: sentence-transformers/LaBSE, prompt: ""}
25
+ custom: {name: null, prompt: ""}
26
+ unfreeze_last_n_layers: 0 # 0 = fully frozen (text embeddings are cached); >0 fine-tunes the top-N transformer layers
27
+ cache_dir: data/features
28
+
29
+ model:
30
+ proj_dim: 512
31
+ proj_hidden: 0 # 0 = linear projection; >0 = 2-layer MLP with this hidden size
32
+ dropout: 0.1
33
+ init_logit_scale: 2.659 # ln(1/0.07), CLIP default; learnable, clamped at ln(100)
34
+
35
+ train:
36
+ epochs: 20
37
+ batch_size: 256 # contrastive batch; bigger = more negatives
38
+ lr: 1.0e-3 # projection heads
39
+ text_lr: 1.0e-5 # unfrozen text layers (only if unfreeze_last_n_layers > 0)
40
+ weight_decay: 0.01
41
+ warmup_steps: 100
42
+ same_image_negatives: mask # mask: captions of the same image in other languages are not treated as negatives
43
+ device: auto # auto | cuda | cpu
44
+ num_workers: 4
45
+ out_dir: runs/${text_encoder.arm}
46
+ eval_every: 1
47
+
48
+ eval:
49
+ split: test
50
+ ks: [1, 5, 10]
51
+ langs: [eng, ibo, hau, yor]
data/processed/filter_stats.json ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "stats": {
3
+ "ibo": {
4
+ "total": 8091,
5
+ "kept": 7436,
6
+ "dropped": 655,
7
+ "by_rule": {
8
+ "R2_loop": 6,
9
+ "R3_copy": 250,
10
+ "R4_length": 7,
11
+ "R5_semantic": 392
12
+ },
13
+ "semantic_threshold": 0.7416,
14
+ "labse_sim_pctiles_all": {
15
+ "1": 0.639,
16
+ "5": 0.742,
17
+ "25": 0.83,
18
+ "50": 0.871
19
+ },
20
+ "agreement_with_afrimm_filtered": {
21
+ "afrimm_kept": 8078,
22
+ "both_kept": 7436,
23
+ "we_drop_afrimm_keeps": 642,
24
+ "we_keep_afrimm_drops": 0
25
+ }
26
+ },
27
+ "hau": {
28
+ "total": 8091,
29
+ "kept": 7655,
30
+ "dropped": 436,
31
+ "by_rule": {
32
+ "R2_loop": 12,
33
+ "R3_copy": 11,
34
+ "R4_length": 10,
35
+ "R5_semantic": 403
36
+ },
37
+ "semantic_threshold": 0.6025,
38
+ "labse_sim_pctiles_all": {
39
+ "1": 0.489,
40
+ "5": 0.601,
41
+ "25": 0.726,
42
+ "50": 0.796
43
+ },
44
+ "agreement_with_afrimm_filtered": {
45
+ "afrimm_kept": 7943,
46
+ "both_kept": 7655,
47
+ "we_drop_afrimm_keeps": 288,
48
+ "we_keep_afrimm_drops": 0
49
+ }
50
+ },
51
+ "yor": {
52
+ "total": 8091,
53
+ "kept": 7611,
54
+ "dropped": 480,
55
+ "by_rule": {
56
+ "R2_loop": 24,
57
+ "R3_copy": 16,
58
+ "R4_length": 39,
59
+ "R5_semantic": 401
60
+ },
61
+ "semantic_threshold": 0.5099,
62
+ "labse_sim_pctiles_all": {
63
+ "1": 0.33,
64
+ "5": 0.501,
65
+ "25": 0.658,
66
+ "50": 0.737
67
+ },
68
+ "agreement_with_afrimm_filtered": {
69
+ "afrimm_kept": 7526,
70
+ "both_kept": 7490,
71
+ "we_drop_afrimm_keeps": 36,
72
+ "we_keep_afrimm_drops": 121
73
+ }
74
+ },
75
+ "params": {
76
+ "LEN_LO": 0.45,
77
+ "LEN_HI": 2.2,
78
+ "ABS_FLOOR": 0.5,
79
+ "PCT": 5,
80
+ "scorer": "sentence-transformers/LaBSE"
81
+ }
82
+ },
83
+ "examples": {
84
+ "ibo": {
85
+ "R2_loop": [
86
+ [
87
+ "A little girl is carefully coloring in the pictures of a coloring book .",
88
+ "Nwatakịrị nwanyị na-eji nlezianya agba agba agba"
89
+ ],
90
+ [
91
+ "A little girl with blonde hair and a blue shirt is blowing bubbles outside with someone .",
92
+ "Nwatakịrị nwanyị nwere ntutu isi na-acha odo odo na uwe elu na-acha anụnụ anụnụ na-afụ afụ afụ n'èzí na mmadụ ."
93
+ ],
94
+ [
95
+ "A blue car drives down a mostly dirt road .",
96
+ "A-acha anụnụ anụnụ ụgbọala ụgbọala ụgbọala ụgbọala ala a ukwuu n'ime unyi ụzọ ."
97
+ ]
98
+ ],
99
+ "R3_copy": [
100
+ [
101
+ "A man is rock climbing .",
102
+ "Otu nwoke bụ rock climbing ."
103
+ ],
104
+ [
105
+ "A snowboarder sits on a slope with skiers and boarders nearby .",
106
+ "A snowboarder na-anọdụ na a mkpọda na skiers na boarders nso ."
107
+ ],
108
+ [
109
+ "Young boy with a black \" ADHD \" t-shirt nodding off",
110
+ "Nwa okorobịa nwere \"ADHD\" t-shirt nodding off"
111
+ ]
112
+ ],
113
+ "R4_length": [
114
+ [
115
+ "A child in a swing .",
116
+ "Nwatakịrị nọ n'ebe a na-agbagharị agbagharị ."
117
+ ],
118
+ [
119
+ "a team of rowers rowing in a green and red boat",
120
+ "Otu ìgwè ndị na-agba ụgbọ mmiri na-agba ụgbọ mmiri na-acha akwụkwọ ndụ akwụkwọ ndụ na nke na-acha uhie uhie"
121
+ ],
122
+ [
123
+ "A surfer is riding a wave .",
124
+ "Onye na - eme njem n' ime mmiri na - agbagharị n' ebili mmiri."
125
+ ]
126
+ ],
127
+ "R5_semantic": [
128
+ [
129
+ "a man is standing in front of a skyscraper",
130
+ "Otu nwoke na-eguzo n'ihu ụlọ elu."
131
+ ],
132
+ [
133
+ "Woman with three children fishing over boardwalk in the evening .",
134
+ "Otu nwaanyị nwere ụmụ atọ na - akụ azụ̀ n' elu osimiri n' anyasị."
135
+ ],
136
+ [
137
+ "A boy jumping in a fountain .",
138
+ "Otu nwata nwoke na-awụlikwa elu n'isi iyi ."
139
+ ]
140
+ ]
141
+ },
142
+ "hau": {
143
+ "R2_loop": [
144
+ [
145
+ "Hockey goalie boy in red jacket crouches by goal , with stick .",
146
+ "Wani dan wasan Hockey mai tsaron gida a cikin jacket ja ja ja da kullun da ƙofa, tare da sanda."
147
+ ],
148
+ [
149
+ "A young boy plays on a swing .",
150
+ "Yaro yana wasa a kan ɗan ɗan ɗan ɗan"
151
+ ],
152
+ [
153
+ "A person swinging on a swing",
154
+ "Wani mutum yana ɗaukan ɗaukan ɗaukan"
155
+ ]
156
+ ],
157
+ "R3_copy": [
158
+ [
159
+ "a man dressed as Jack Sparrow from Pirates of the Caribbean",
160
+ "Wani mutumin da ya saka tufafin Jack Sparrow daga Pirates of the Caribbean"
161
+ ],
162
+ [
163
+ "A child sleds .",
164
+ "Yaro ya yi sleds ."
165
+ ],
166
+ [
167
+ "Woman in a blue and white striped shirt with a straw cowboy hat on .",
168
+ "Wata mace a cikin blue da fari striped shirt da straw cowboy hat a kan."
169
+ ]
170
+ ],
171
+ "R4_length": [
172
+ [
173
+ "Young man with a nose ring and a hat .",
174
+ "Matashi mai ɗan"
175
+ ],
176
+ [
177
+ "Child with striped shirt , red shorts and orange cap standing on pavement near cars .",
178
+ "Yaro da shiti mai launin"
179
+ ],
180
+ [
181
+ "The two children swinging together on a swing .",
182
+ "Yara biyu suna ɗaukan"
183
+ ]
184
+ ],
185
+ "R5_semantic": [
186
+ [
187
+ "A dog leaps to catch a ball in a field .",
188
+ "Karnuka suna tsallake don su kama ƙwallo a fili ."
189
+ ],
190
+ [
191
+ "A child jumps off a high diving board into the pool .",
192
+ "Yaro ya tsallake daga tafiyar ruwan da ke cikin ruwan da ke da tsaye ."
193
+ ],
194
+ [
195
+ "A boy jumping in a fountain .",
196
+ "Yaro yana tsallake cikin ruwan marar ruwa ."
197
+ ]
198
+ ]
199
+ },
200
+ "yor": {
201
+ "R2_loop": [
202
+ [
203
+ "A woman is riding a three wheeler bicycle behind a pack of dogs .",
204
+ "Obìnrin kan ń gun kẹ̀kẹ́ kẹ̀kẹ́ mẹ́ta lẹ́yìn àwọn ajá kan ."
205
+ ],
206
+ [
207
+ "Two little kids in strollers have face makeup on like the band \" Kiss \" .",
208
+ "Àwọn ọmọ kéékèèké méjì tí wọ́n wọ kẹ̀kẹ́ kẹ̀kẹ́ máa ń dojú kọ bí ẹgbẹ́ náà \" Kiss \" ."
209
+ ],
210
+ [
211
+ "Two women riding a tandem bicycle go by a wall painting .",
212
+ "Àwọn obìnrin méjì tí wọ́n ń gun kẹ̀kẹ́ kẹ̀kẹ́ alágbèéká máa ń lọ lẹ́gbẹ̀ẹ́ ògiri ."
213
+ ]
214
+ ],
215
+ "R3_copy": [
216
+ [
217
+ "a man dressed as Jack Sparrow from Pirates of the Caribbean",
218
+ "Ọkùnrin kan tí ó múra gẹ́gẹ́ bíi Jack Sparrow láti Pirates of the Caribbean"
219
+ ],
220
+ [
221
+ "A motocross biker about to descend",
222
+ "Motocross biker fẹ́ sọ̀kalẹ̀"
223
+ ],
224
+ [
225
+ "person on a wakeboard in the air",
226
+ "eniyan lori a wakeboard ni air"
227
+ ]
228
+ ],
229
+ "R4_length": [
230
+ [
231
+ "A thin brown horse standing and a small black horse sitting on sand .",
232
+ "Ẹṣin aláwọ̀"
233
+ ],
234
+ [
235
+ "A black and brown dog is laying on a white shaggy carpet .",
236
+ "Ajá aláwọ̀ dúdú àti aláwọ̀"
237
+ ],
238
+ [
239
+ "The skinny brown dog is walking on a fallen tree .",
240
+ "Ajá aláwọ̀ aláwọ"
241
+ ]
242
+ ],
243
+ "R5_semantic": [
244
+ [
245
+ "Two dogs playing together on a beach .",
246
+ "Àwọn ajá méjì ń ṣeré pa pọ̀ ní etíkun ."
247
+ ],
248
+ [
249
+ "an ice climber in a blue jacket and black pants is scaling a frozen ice wall .",
250
+ "Ẹni tó ń gun yìnyín nínú jákẹ́ẹ̀tì aláwọ̀ búlúù àti ṣòkòtò dúdú ń gbé ògiri yìnyín dídì ."
251
+ ],
252
+ [
253
+ "A light-colored dog runs on the beach .",
254
+ "Ajá aláwọ̀ fẹ́lẹ́fẹ́lẹ́ máa ń ṣiṣẹ́ ní etí òkun."
255
+ ]
256
+ ]
257
+ }
258
+ }
259
+ }
data/processed/split_summary.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "seed": 42,
3
+ "fractions": [
4
+ 0.8,
5
+ 0.1,
6
+ 0.1
7
+ ],
8
+ "images_total": 8091,
9
+ "train": {
10
+ "images": 6473,
11
+ "captions_eng": 6473,
12
+ "captions_ibo": 5943,
13
+ "captions_hau": 6116,
14
+ "captions_yor": 6083,
15
+ "pairs_total": 24615
16
+ },
17
+ "val": {
18
+ "images": 809,
19
+ "captions_eng": 809,
20
+ "captions_ibo": 742,
21
+ "captions_hau": 770,
22
+ "captions_yor": 764,
23
+ "pairs_total": 3085
24
+ },
25
+ "test": {
26
+ "images": 809,
27
+ "captions_eng": 809,
28
+ "captions_ibo": 751,
29
+ "captions_hau": 769,
30
+ "captions_yor": 764,
31
+ "pairs_total": 3093
32
+ },
33
+ "test_unfiltered": {
34
+ "images": 809
35
+ },
36
+ "leakage_check": "passed: no image_id in more than one split"
37
+ }
data/processed/test.parquet ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c648645e35903692a55b59221c3c2f7cbd6de862e90df637ca0ad88d8a360be3
3
+ size 126674
images/igbo_search_grid.png ADDED

Git LFS Details

  • SHA256: 5dbe7dce2ca3c0e825b2e5fb1e4865cf37cb25f943dcd784bd30cd99e84d4eb1
  • Pointer size: 132 Bytes
  • Size of remote file: 3.15 MB
images/loss_curves.png ADDED
metrics.json ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_arm_by_val": "native_bird",
3
+ "image_encoder": "google/siglip-base-patch16-224 (frozen)",
4
+ "text_encoder": "Modularcomputing/Native-Bird",
5
+ "runs": {
6
+ "baseline_mclip|test": {
7
+ "eng": {
8
+ "n": 809,
9
+ "i2t_R@1": 58.34,
10
+ "t2i_R@1": 57.85,
11
+ "i2t_R@5": 84.67,
12
+ "t2i_R@5": 83.31,
13
+ "i2t_R@10": 92.21,
14
+ "t2i_R@10": 89.99,
15
+ "mean_R": 77.73
16
+ },
17
+ "ibo": {
18
+ "n": 751,
19
+ "i2t_R@1": 6.13,
20
+ "t2i_R@1": 4.26,
21
+ "i2t_R@5": 14.38,
22
+ "t2i_R@5": 11.98,
23
+ "i2t_R@10": 20.91,
24
+ "t2i_R@10": 16.11,
25
+ "mean_R": 12.29
26
+ },
27
+ "hau": {
28
+ "n": 769,
29
+ "i2t_R@1": 3.38,
30
+ "t2i_R@1": 1.82,
31
+ "i2t_R@5": 6.63,
32
+ "t2i_R@5": 4.16,
33
+ "i2t_R@10": 8.71,
34
+ "t2i_R@10": 6.11,
35
+ "mean_R": 5.13
36
+ },
37
+ "yor": {
38
+ "n": 764,
39
+ "i2t_R@1": 2.36,
40
+ "t2i_R@1": 1.31,
41
+ "i2t_R@5": 4.84,
42
+ "t2i_R@5": 2.75,
43
+ "i2t_R@10": 6.41,
44
+ "t2i_R@10": 4.84,
45
+ "mean_R": 3.75
46
+ }
47
+ },
48
+ "baseline_untrained_native_bird|test": {
49
+ "eng": {
50
+ "n": 809,
51
+ "i2t_R@1": 0.37,
52
+ "t2i_R@1": 0.12,
53
+ "i2t_R@5": 1.11,
54
+ "t2i_R@5": 0.87,
55
+ "i2t_R@10": 1.48,
56
+ "t2i_R@10": 1.73,
57
+ "mean_R": 0.95
58
+ },
59
+ "ibo": {
60
+ "n": 751,
61
+ "i2t_R@1": 0.0,
62
+ "t2i_R@1": 0.13,
63
+ "i2t_R@5": 0.8,
64
+ "t2i_R@5": 0.8,
65
+ "i2t_R@10": 2.4,
66
+ "t2i_R@10": 1.6,
67
+ "mean_R": 0.96
68
+ },
69
+ "hau": {
70
+ "n": 769,
71
+ "i2t_R@1": 0.26,
72
+ "t2i_R@1": 0.13,
73
+ "i2t_R@5": 0.78,
74
+ "t2i_R@5": 1.04,
75
+ "i2t_R@10": 1.69,
76
+ "t2i_R@10": 1.69,
77
+ "mean_R": 0.93
78
+ },
79
+ "yor": {
80
+ "n": 764,
81
+ "i2t_R@1": 0.26,
82
+ "t2i_R@1": 0.26,
83
+ "i2t_R@5": 0.92,
84
+ "t2i_R@5": 0.92,
85
+ "i2t_R@10": 2.36,
86
+ "t2i_R@10": 1.05,
87
+ "mean_R": 0.96
88
+ }
89
+ },
90
+ "trained_native_bird|test": {
91
+ "eng": {
92
+ "n": 809,
93
+ "i2t_R@1": 46.48,
94
+ "t2i_R@1": 44.99,
95
+ "i2t_R@5": 77.38,
96
+ "t2i_R@5": 76.64,
97
+ "i2t_R@10": 88.5,
98
+ "t2i_R@10": 87.02,
99
+ "mean_R": 70.17
100
+ },
101
+ "ibo": {
102
+ "n": 751,
103
+ "i2t_R@1": 39.28,
104
+ "t2i_R@1": 39.01,
105
+ "i2t_R@5": 70.71,
106
+ "t2i_R@5": 69.64,
107
+ "i2t_R@10": 82.29,
108
+ "t2i_R@10": 81.49,
109
+ "mean_R": 63.74
110
+ },
111
+ "hau": {
112
+ "n": 769,
113
+ "i2t_R@1": 33.16,
114
+ "t2i_R@1": 32.25,
115
+ "i2t_R@5": 61.64,
116
+ "t2i_R@5": 59.43,
117
+ "i2t_R@10": 74.64,
118
+ "t2i_R@10": 74.9,
119
+ "mean_R": 56.0
120
+ },
121
+ "yor": {
122
+ "n": 764,
123
+ "i2t_R@1": 25.52,
124
+ "t2i_R@1": 23.56,
125
+ "i2t_R@5": 53.8,
126
+ "t2i_R@5": 52.75,
127
+ "i2t_R@10": 64.66,
128
+ "t2i_R@10": 65.84,
129
+ "mean_R": 47.69
130
+ }
131
+ },
132
+ "trained_native_bird|test_unfiltered": {
133
+ "eng": {
134
+ "n": 809,
135
+ "i2t_R@1": 46.48,
136
+ "t2i_R@1": 44.99,
137
+ "i2t_R@5": 77.38,
138
+ "t2i_R@5": 76.64,
139
+ "i2t_R@10": 88.5,
140
+ "t2i_R@10": 87.02,
141
+ "mean_R": 70.17
142
+ },
143
+ "ibo": {
144
+ "n": 809,
145
+ "i2t_R@1": 36.59,
146
+ "t2i_R@1": 35.6,
147
+ "i2t_R@5": 67.37,
148
+ "t2i_R@5": 66.75,
149
+ "i2t_R@10": 79.6,
150
+ "t2i_R@10": 79.23,
151
+ "mean_R": 60.86
152
+ },
153
+ "hau": {
154
+ "n": 809,
155
+ "i2t_R@1": 31.52,
156
+ "t2i_R@1": 30.9,
157
+ "i2t_R@5": 59.21,
158
+ "t2i_R@5": 57.73,
159
+ "i2t_R@10": 72.06,
160
+ "t2i_R@10": 72.81,
161
+ "mean_R": 54.04
162
+ },
163
+ "yor": {
164
+ "n": 809,
165
+ "i2t_R@1": 24.6,
166
+ "t2i_R@1": 22.5,
167
+ "i2t_R@5": 52.78,
168
+ "t2i_R@5": 51.79,
169
+ "i2t_R@10": 63.54,
170
+ "t2i_R@10": 64.4,
171
+ "mean_R": 46.6
172
+ }
173
+ },
174
+ "trained_native_bird_unfreeze2|test": {
175
+ "eng": {
176
+ "n": 809,
177
+ "i2t_R@1": 44.99,
178
+ "t2i_R@1": 46.23,
179
+ "i2t_R@5": 78.74,
180
+ "t2i_R@5": 76.14,
181
+ "i2t_R@10": 89.0,
182
+ "t2i_R@10": 87.89,
183
+ "mean_R": 70.5
184
+ },
185
+ "ibo": {
186
+ "n": 751,
187
+ "i2t_R@1": 37.95,
188
+ "t2i_R@1": 39.68,
189
+ "i2t_R@5": 70.57,
190
+ "t2i_R@5": 70.17,
191
+ "i2t_R@10": 83.49,
192
+ "t2i_R@10": 83.36,
193
+ "mean_R": 64.2
194
+ },
195
+ "hau": {
196
+ "n": 769,
197
+ "i2t_R@1": 31.73,
198
+ "t2i_R@1": 30.3,
199
+ "i2t_R@5": 60.47,
200
+ "t2i_R@5": 60.73,
201
+ "i2t_R@10": 74.9,
202
+ "t2i_R@10": 74.38,
203
+ "mean_R": 55.42
204
+ },
205
+ "yor": {
206
+ "n": 764,
207
+ "i2t_R@1": 23.3,
208
+ "t2i_R@1": 24.87,
209
+ "i2t_R@5": 52.88,
210
+ "t2i_R@5": 53.27,
211
+ "i2t_R@10": 64.66,
212
+ "t2i_R@10": 64.4,
213
+ "mean_R": 47.23
214
+ }
215
+ },
216
+ "trained_native_bird_unfreeze2|test_unfiltered": {
217
+ "eng": {
218
+ "n": 809,
219
+ "i2t_R@1": 44.99,
220
+ "t2i_R@1": 46.23,
221
+ "i2t_R@5": 78.74,
222
+ "t2i_R@5": 76.14,
223
+ "i2t_R@10": 89.0,
224
+ "t2i_R@10": 87.89,
225
+ "mean_R": 70.5
226
+ },
227
+ "ibo": {
228
+ "n": 809,
229
+ "i2t_R@1": 35.72,
230
+ "t2i_R@1": 36.96,
231
+ "i2t_R@5": 67.86,
232
+ "t2i_R@5": 67.12,
233
+ "i2t_R@10": 81.09,
234
+ "t2i_R@10": 80.22,
235
+ "mean_R": 61.5
236
+ },
237
+ "hau": {
238
+ "n": 809,
239
+ "i2t_R@1": 29.91,
240
+ "t2i_R@1": 28.31,
241
+ "i2t_R@5": 58.71,
242
+ "t2i_R@5": 58.22,
243
+ "i2t_R@10": 73.05,
244
+ "t2i_R@10": 72.44,
245
+ "mean_R": 53.44
246
+ },
247
+ "yor": {
248
+ "n": 809,
249
+ "i2t_R@1": 22.74,
250
+ "t2i_R@1": 23.98,
251
+ "i2t_R@5": 50.31,
252
+ "t2i_R@5": 52.41,
253
+ "i2t_R@10": 62.42,
254
+ "t2i_R@10": 62.79,
255
+ "mean_R": 45.77
256
+ }
257
+ }
258
+ },
259
+ "train": {
260
+ "native_bird": {
261
+ "best_val_mean_R": 60.46,
262
+ "best_epoch": 3,
263
+ "epochs": 20
264
+ },
265
+ "native_bird_unfreeze2": {
266
+ "best_val_mean_R": 60.35,
267
+ "best_epoch": 2,
268
+ "epochs": 20
269
+ }
270
+ },
271
+ "text_crosslingual_test": {
272
+ "native_bird": {
273
+ "avg_acc@1_cap2eng": 87.93,
274
+ "ibo": 96.66,
275
+ "hau": 87.89,
276
+ "yor": 79.23
277
+ },
278
+ "labse": {
279
+ "avg_acc@1_cap2eng": 89.91,
280
+ "ibo": 97.16,
281
+ "hau": 89.99,
282
+ "yor": 82.57
283
+ }
284
+ },
285
+ "igbo_search": {
286
+ "all_ibo_captions": {
287
+ "n": 751,
288
+ "hit@1": 37.42,
289
+ "hit@5": 68.44,
290
+ "hit@10": 80.56,
291
+ "median_rank": 2
292
+ },
293
+ "all_eng_captions": {
294
+ "n": 809,
295
+ "hit@1": 44.99,
296
+ "hit@5": 76.64,
297
+ "hit@10": 87.02,
298
+ "median_rank": 2
299
+ },
300
+ "heldout_sample_top5": "4/6"
301
+ },
302
+ "smoke_mean_R_128imgs": {
303
+ "untrained": {
304
+ "eng": 4.6,
305
+ "ibo": 3.5,
306
+ "hau": 2.8,
307
+ "yor": 5.3
308
+ },
309
+ "mclip": {
310
+ "eng": 92.3,
311
+ "ibo": 22.5,
312
+ "hau": 7.7,
313
+ "yor": 6.8
314
+ },
315
+ "trained_native_bird_1ep": {
316
+ "eng": 42.1,
317
+ "ibo": 42.4,
318
+ "hau": 38.2,
319
+ "yor": 33.9
320
+ }
321
+ }
322
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e8187e82f1ee49691be1b5a7ef271cc087b57b5da336c02d213d7d7755c94dcb
3
+ size 3150260
nbmm/__init__.py ADDED
File without changes
nbmm/common.py ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Shared pieces: config, encoders, feature caching, projection heads, loss, retrieval metrics."""
2
+ from __future__ import annotations
3
+ import os, re, json, random, hashlib
4
+ from dataclasses import dataclass
5
+ import numpy as np, pandas as pd, torch, torch.nn as nn, torch.nn.functional as F, yaml
6
+
7
+ ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
8
+
9
+
10
+ # ----------------------------------------------------------------------------- config
11
+ def _set(d, dotted, val):
12
+ ks = dotted.split(".")
13
+ for k in ks[:-1]:
14
+ d = d.setdefault(k, {})
15
+ d[ks[-1]] = yaml.safe_load(val) if isinstance(val, str) else val
16
+
17
+
18
+ def _get(d, dotted):
19
+ for k in dotted.split("."):
20
+ d = d[k]
21
+ return d
22
+
23
+
24
+ def load_config(path, overrides=()):
25
+ cfg = yaml.safe_load(open(path))
26
+ for o in overrides: # key.sub=value
27
+ k, v = o.split("=", 1)
28
+ _set(cfg, k, v)
29
+ s = yaml.safe_dump(cfg)
30
+ s = re.sub(r"\$\{([^}]+)\}", lambda m: str(_get(cfg, m.group(1))), s)
31
+ return yaml.safe_load(s)
32
+
33
+
34
+ def rel(p):
35
+ return p if os.path.isabs(p) else os.path.join(ROOT, p)
36
+
37
+
38
+ def seed_all(s):
39
+ random.seed(s); np.random.seed(s); torch.manual_seed(s); torch.cuda.manual_seed_all(s)
40
+
41
+
42
+ def pick_device(name="auto"):
43
+ if name != "auto":
44
+ return torch.device(name)
45
+ if torch.cuda.is_available():
46
+ return torch.device("cuda")
47
+ if getattr(torch.backends, "mps", None) and torch.backends.mps.is_available():
48
+ return torch.device("mps")
49
+ return torch.device("cpu")
50
+
51
+
52
+ def safe(name):
53
+ return re.sub(r"[^A-Za-z0-9._-]+", "_", name)
54
+
55
+
56
+ # ----------------------------------------------------------------------------- data
57
+ def load_split(cfg, split):
58
+ df = pd.read_parquet(rel(os.path.join(cfg["data"]["dir"], f"{split}.parquet")))
59
+ n = cfg["data"].get("subset")
60
+ if n:
61
+ df = df.iloc[: int(n)].reset_index(drop=True)
62
+ return df
63
+
64
+
65
+ def long_pairs(df, langs):
66
+ """Wide (one row per image, one column per language, NaN = filtered out) -> long (image_idx, lang, text)."""
67
+ rows = []
68
+ for i, r in df.iterrows():
69
+ for l in langs:
70
+ t = r.get(l)
71
+ if isinstance(t, str) and t.strip():
72
+ rows.append((i, l, t))
73
+ return pd.DataFrame(rows, columns=["img_idx", "lang", "text"])
74
+
75
+
76
+ # ----------------------------------------------------------------------------- image encoder (frozen)
77
+ class ImageEncoder:
78
+ def __init__(self, cfg, device):
79
+ ic = cfg["image_encoder"]
80
+ self.backend, self.name, self.device = ic["backend"], ic["name"], device
81
+ if self.backend == "hf":
82
+ from transformers import AutoModel, AutoImageProcessor
83
+ self.model = AutoModel.from_pretrained(self.name).to(device).eval()
84
+ self.proc = AutoImageProcessor.from_pretrained(self.name)
85
+ elif self.backend == "open_clip":
86
+ import open_clip
87
+ arch, pre = self.name.split("/", 1)
88
+ self.model, _, self.proc = open_clip.create_model_and_transforms(arch, pretrained=pre)
89
+ self.model = self.model.to(device).eval()
90
+ else:
91
+ raise ValueError(self.backend)
92
+
93
+ @torch.no_grad()
94
+ def encode(self, pil_images):
95
+ if self.backend == "hf":
96
+ px = self.proc(images=pil_images, return_tensors="pt")["pixel_values"].to(self.device)
97
+ out = self.model.get_image_features(pixel_values=px)
98
+ if not torch.is_tensor(out): # some versions return a ModelOutput
99
+ out = getattr(out, "pooler_output", None) if getattr(out, "pooler_output", None) is not None else out[0]
100
+ else:
101
+ px = torch.stack([self.proc(im) for im in pil_images]).to(self.device)
102
+ out = self.model.encode_image(px)
103
+ return out.float().cpu()
104
+
105
+
106
+ def image_features(cfg, df, split, device, batch_size=32):
107
+ """Cached frozen image features for the rows of df, keyed by image_id."""
108
+ from PIL import Image
109
+ ic = cfg["image_encoder"]
110
+ d = rel(os.path.join(ic["cache_dir"], "img_" + safe(ic["name"])))
111
+ os.makedirs(d, exist_ok=True)
112
+ path = os.path.join(d, "all.pt")
113
+ cache = torch.load(path) if os.path.exists(path) else {}
114
+ need = [i for i in df.image_id if i not in cache]
115
+ if need:
116
+ enc = ImageEncoder(cfg, device)
117
+ idir = rel(cfg["data"]["image_dir"])
118
+ import time
119
+ last = time.time()
120
+ for s in range(0, len(need), batch_size):
121
+ ids = need[s: s + batch_size]
122
+ ims = [Image.open(os.path.join(idir, i)).convert("RGB") for i in ids]
123
+ for i, f in zip(ids, enc.encode(ims)):
124
+ cache[i] = f
125
+ if time.time() - last > 20: # checkpoint the cache so an interrupted run resumes
126
+ print(f" image feats {s + len(ids)}/{len(need)}", flush=True)
127
+ torch.save(cache, path); last = time.time()
128
+ torch.save(cache, path)
129
+ del enc
130
+ return torch.stack([cache[i] for i in df.image_id])
131
+
132
+
133
+ # ----------------------------------------------------------------------------- text encoder
134
+ def text_arm(cfg):
135
+ tc = cfg["text_encoder"]
136
+ a = dict(tc["arms"][tc["arm"]])
137
+ if not a.get("name"):
138
+ raise ValueError(f"text_encoder.arms.{tc['arm']}.name is empty")
139
+ return a
140
+
141
+
142
+ def load_sentence_model(arm, device):
143
+ from sentence_transformers import SentenceTransformer
144
+ kw = {}
145
+ if arm.get("text_only"): # EmbeddingGemma 2: skip vision/audio towers (270M text-only)
146
+ kw["config_kwargs"] = {"vision_config": None, "audio_config": None}
147
+ if "embeddinggemma" in arm["name"]:
148
+ # EmbeddingGemma: bf16 or fp32 only (fp16 overflows)
149
+ dt = torch.bfloat16 if (device.type == "cuda" and torch.cuda.is_bf16_supported()) else torch.float32
150
+ kw["model_kwargs"] = {"torch_dtype": dt}
151
+ return SentenceTransformer(arm["name"], device=str(device), **kw)
152
+
153
+
154
+ def text_features(cfg, texts, device, batch_size=64):
155
+ """Cached frozen sentence embeddings (L2-normalised by the model's own head if it has one)."""
156
+ arm = text_arm(cfg)
157
+ d = rel(os.path.join(cfg["text_encoder"]["cache_dir"], "txt_" + safe(arm["name"])))
158
+ os.makedirs(d, exist_ok=True)
159
+ path = os.path.join(d, "all.pt")
160
+ cache = torch.load(path) if os.path.exists(path) else {}
161
+ key = lambda t: hashlib.md5((arm.get("prompt", "") + t).encode()).hexdigest()
162
+ need = sorted({t for t in texts if key(t) not in cache})
163
+ if need:
164
+ m = load_sentence_model(arm, device)
165
+ for s in range(0, len(need), 512):
166
+ chunk = need[s: s + 512]
167
+ e = m.encode([arm.get("prompt", "") + t for t in chunk], batch_size=batch_size,
168
+ convert_to_tensor=True, normalize_embeddings=True).float().cpu()
169
+ for t, v in zip(chunk, e):
170
+ cache[key(t)] = v
171
+ print(f" text feats {s + len(chunk)}/{len(need)}", flush=True)
172
+ torch.save(cache, path)
173
+ del m
174
+ return torch.stack([cache[key(t)] for t in texts])
175
+
176
+
177
+ class TrainableText(nn.Module):
178
+ """Sentence-transformers model with only its top-N transformer layers trainable."""
179
+
180
+ def __init__(self, cfg, device):
181
+ super().__init__()
182
+ self.arm = text_arm(cfg)
183
+ self.st = load_sentence_model(self.arm, device)
184
+ n = cfg["text_encoder"]["unfreeze_last_n_layers"]
185
+ for p in self.st.parameters():
186
+ p.requires_grad = False
187
+ layers = None
188
+ for mod in self.st.modules(): # find the deepest ModuleList of transformer blocks
189
+ for name, child in mod.named_children():
190
+ if isinstance(child, nn.ModuleList) and name in ("layer", "layers") and len(child) > 1:
191
+ layers = child
192
+ if layers is None:
193
+ raise RuntimeError("could not locate transformer layers to unfreeze")
194
+ for blk in list(layers)[-n:]:
195
+ for p in blk.parameters():
196
+ p.requires_grad = True
197
+ self.max_len = cfg["data"]["max_text_len"]
198
+ self.device = device
199
+
200
+ def forward(self, texts):
201
+ texts = [self.arm.get("prompt", "") + t for t in texts]
202
+ feats = (self.st.preprocess if hasattr(self.st, "preprocess") else self.st.tokenize)(texts)
203
+ feats = {k: v[:, : self.max_len].to(self.device) if torch.is_tensor(v) and v.dim() == 2 else v for k, v in feats.items()}
204
+ return self.st(feats)["sentence_embedding"].float()
205
+
206
+
207
+ # ----------------------------------------------------------------------------- heads + loss
208
+ class Head(nn.Module):
209
+ def __init__(self, din, dout, hidden=0, dropout=0.0):
210
+ super().__init__()
211
+ self.net = nn.Linear(din, dout) if not hidden else nn.Sequential(
212
+ nn.Linear(din, hidden), nn.GELU(), nn.Dropout(dropout), nn.Linear(hidden, dout))
213
+
214
+ def forward(self, x):
215
+ return F.normalize(self.net(x), dim=-1)
216
+
217
+
218
+ class AlignModel(nn.Module):
219
+ def __init__(self, d_img, d_txt, cfg):
220
+ super().__init__()
221
+ m = cfg["model"]
222
+ self.img = Head(d_img, m["proj_dim"], m["proj_hidden"], m["dropout"])
223
+ self.txt = Head(d_txt, m["proj_dim"], m["proj_hidden"], m["dropout"])
224
+ self.logit_scale = nn.Parameter(torch.tensor(float(m["init_logit_scale"])))
225
+
226
+
227
+ def clip_loss(zi, zt, img_ids, logit_scale, mask_same_image=True):
228
+ """Symmetric InfoNCE. With multilingual captions several texts can share an image in one batch;
229
+ those off-diagonal same-image pairs are masked out of the negatives."""
230
+ s = logit_scale.clamp(max=4.6052).exp()
231
+ logits = s * zi @ zt.t()
232
+ if mask_same_image:
233
+ same = img_ids[:, None] == img_ids[None, :]
234
+ eye = torch.eye(len(img_ids), dtype=torch.bool, device=logits.device)
235
+ logits = logits.masked_fill(same & ~eye, float("-inf"))
236
+ y = torch.arange(len(img_ids), device=logits.device)
237
+ return 0.5 * (F.cross_entropy(logits, y) + F.cross_entropy(logits.t(), y))
238
+
239
+
240
+ # ----------------------------------------------------------------------------- metrics
241
+ @torch.no_grad()
242
+ def retrieval_recall(zi, zt, ks=(1, 5, 10)):
243
+ """zi[i] and zt[i] are a matched image/caption pair (one caption per image within a language)."""
244
+ sim = zi @ zt.t()
245
+ n = sim.shape[0]
246
+ gt = torch.arange(n)
247
+ r_i2t = (sim.argsort(dim=1, descending=True) == gt[:, None]).float().argmax(dim=1)
248
+ r_t2i = (sim.t().argsort(dim=1, descending=True) == gt[:, None]).float().argmax(dim=1)
249
+ out = {"n": n}
250
+ for k in ks:
251
+ out[f"i2t_R@{k}"] = round(100 * (r_i2t < k).float().mean().item(), 2)
252
+ out[f"t2i_R@{k}"] = round(100 * (r_t2i < k).float().mean().item(), 2)
253
+ out["mean_R"] = round(float(np.mean([out[f"{d}_R@{k}"] for d in ("i2t", "t2i") for k in ks])), 2)
254
+ return out
255
+
256
+
257
+ def dump(obj, path):
258
+ os.makedirs(os.path.dirname(path), exist_ok=True)
259
+ json.dump(obj, open(path, "w"), indent=2)
requirements.txt ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python >= 3.10. Install torch for your CUDA version first, e.g.:
2
+ # pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
3
+ torch>=2.4
4
+ torchvision
5
+ transformers>=5.20 # needed for google/embeddinggemma-2 (model_type embedding_gemma2); tested with 5.20.1
6
+ sentence-transformers>=6.1 # tested with 6.1.0
7
+ huggingface_hub
8
+ datasets
9
+ pandas
10
+ pyarrow
11
+ numpy
12
+ pyyaml
13
+ pillow
14
+ sentencepiece
15
+ open_clip_torch # only if image_encoder.backend=open_clip
results/RESULTS.md ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Native-Bird x SigLIP image-text alignment: full run (2026-10-18, 1x H100)
2
+
3
+ Test = 809 held-out images; gallery = every test caption in that language (eng 809, ibo 751, hau 769, yor 764). Chance R@1 ~0.13%.
4
+ Best checkpoint by val mean R: **native_bird (frozen text)**, epoch 3 (val 60.46) vs unfreeze-top-2 epoch 2 (val 60.35): a near tie.
5
+
6
+ | run | lang | i2t R@1 | i2t R@5 | i2t R@10 | t2i R@1 | t2i R@5 | t2i R@10 | mean R |
7
+ |---|---|---|---|---|---|---|---|---|
8
+ | untrained heads | eng | 0.37 | 1.11 | 1.48 | 0.12 | 0.87 | 1.73 | 0.95 |
9
+ | untrained heads | ibo | 0.0 | 0.8 | 2.4 | 0.13 | 0.8 | 1.6 | 0.96 |
10
+ | untrained heads | hau | 0.26 | 0.78 | 1.69 | 0.13 | 1.04 | 1.69 | 0.93 |
11
+ | untrained heads | yor | 0.26 | 0.92 | 2.36 | 0.26 | 0.92 | 1.05 | 0.96 |
12
+ | mCLIP zero-shot | eng | 58.34 | 84.67 | 92.21 | 57.85 | 83.31 | 89.99 | 77.73 |
13
+ | mCLIP zero-shot | ibo | 6.13 | 14.38 | 20.91 | 4.26 | 11.98 | 16.11 | 12.29 |
14
+ | mCLIP zero-shot | hau | 3.38 | 6.63 | 8.71 | 1.82 | 4.16 | 6.11 | 5.13 |
15
+ | mCLIP zero-shot | yor | 2.36 | 4.84 | 6.41 | 1.31 | 2.75 | 4.84 | 3.75 |
16
+ | Native-Bird frozen | eng | 46.48 | 77.38 | 88.5 | 44.99 | 76.64 | 87.02 | 70.17 |
17
+ | Native-Bird frozen | ibo | 39.28 | 70.71 | 82.29 | 39.01 | 69.64 | 81.49 | 63.74 |
18
+ | Native-Bird frozen | hau | 33.16 | 61.64 | 74.64 | 32.25 | 59.43 | 74.9 | 56.0 |
19
+ | Native-Bird frozen | yor | 25.52 | 53.8 | 64.66 | 23.56 | 52.75 | 65.84 | 47.69 |
20
+ | Native-Bird unfreeze top-2 | eng | 44.99 | 78.74 | 89.0 | 46.23 | 76.14 | 87.89 | 70.5 |
21
+ | Native-Bird unfreeze top-2 | ibo | 37.95 | 70.57 | 83.49 | 39.68 | 70.17 | 83.36 | 64.2 |
22
+ | Native-Bird unfreeze top-2 | hau | 31.73 | 60.47 | 74.9 | 30.3 | 60.73 | 74.38 | 55.42 |
23
+ | Native-Bird unfreeze top-2 | yor | 23.3 | 52.88 | 64.66 | 24.87 | 53.27 | 64.4 | 47.23 |
24
+ | frozen, test_unfiltered | eng | 46.48 | 77.38 | 88.5 | 44.99 | 76.64 | 87.02 | 70.17 |
25
+ | frozen, test_unfiltered | ibo | 36.59 | 67.37 | 79.6 | 35.6 | 66.75 | 79.23 | 60.86 |
26
+ | frozen, test_unfiltered | hau | 31.52 | 59.21 | 72.06 | 30.9 | 57.73 | 72.81 | 54.04 |
27
+ | frozen, test_unfiltered | yor | 24.6 | 52.78 | 63.54 | 22.5 | 51.79 | 64.4 | 46.6 |
28
+ | unfreeze-2, test_unfiltered | eng | 44.99 | 78.74 | 89.0 | 46.23 | 76.14 | 87.89 | 70.5 |
29
+ | unfreeze-2, test_unfiltered | ibo | 35.72 | 67.86 | 81.09 | 36.96 | 67.12 | 80.22 | 61.5 |
30
+ | unfreeze-2, test_unfiltered | hau | 29.91 | 58.71 | 73.05 | 28.31 | 58.22 | 72.44 | 53.44 |
31
+ | unfreeze-2, test_unfiltered | yor | 22.74 | 50.31 | 62.42 | 23.98 | 52.41 | 62.79 | 45.77 |
32
+
33
+ Smoke (CPU, 128 images, 1 epoch, mean R): untrained 4.6/3.5/2.8/5.3, mCLIP 92.3/22.5/7.7/6.8, trained Native-Bird 42.1/42.4/38.2/33.9 (eng/ibo/hau/yor). Not comparable to the 809-image gallery.
34
+
35
+ ## Igbo image search (best checkpoint, 809 test images)
36
+ All 751 held-out Igbo captions as queries: hit@1 37.42, hit@5 68.44, hit@10 80.56, median rank 2. English: hit@1 44.99, hit@5 76.64, hit@10 87.02.
37
+
38
+ | Igbo query | English | Igbo top-5 | top-5 overlap with English query |
39
+ |---|---|---|---|
40
+ | Nkịta na-agba ọsọ n'elu ahịhịa | A dog running on the grass | 697582336_601462e052.jpg, 2114739371_83aa8bdb0e.jpg, 1514957266_a19827c538.jpg, 240583223_e26e17ee96.jpg, 3358380484_b99b48f0c9.jpg | 3/5 |
41
+ | Ụmụaka na-egwu egwu n'ime mmiri | Children playing in the water | 1095476286_87d4f8664e.jpg, 3041689520_c481bdb20e.jpg, 2951092164_4940b9a517.jpg, 3545427060_c16a8b7dfd.jpg, 3747543364_bf5b548527.jpg | 5/5 |
42
+ | Otu nwoke na-agba ịnyịnya ígwè | A man riding a bicycle | 3649916507_b88a3d2082.jpg, 3391924827_53b31542ce.jpg, 3079073247_97e88e2eb7.jpg, 3665169936_01ae94c9fd.jpg, 2192411521_9c7e488c5e.jpg | 4/5 |
43
+ | Otu nwanyị yi uwe na-acha uhie uhie | A woman wearing a red dress | 495055747_a75872762a.jpg, 613900608_2e49415772.jpg, 3534952095_975cca0056.jpg, 2695085448_a11833df95.jpg, 1821238649_2fda79d6d7.jpg | 4/5 |
44
+ | Ndị mmadụ nọ n'elu ugwu | People on top of a mountain | 2176980976_7054c99621.jpg, 3340575518_137ce2695f.jpg, 1428578577_82864facae.jpg, 3229821595_77ace81c6b.jpg, 95783195_e1ba3f57ca.jpg | 4/5 |
45
+ | Otu nwata nwoke na-awụli elu | A boy jumping in the air | 3348811097_0e09baa26f.jpg, 2061354254_faa5bd294b.jpg, 3229913073_e7857a5966.jpg, 3741827382_71e93298d0.jpg, 3396036947_0af6c3aab7.jpg | 3/5 |
46
+ | Nkịta abụọ na-egwu egwu | Two dogs playing together | 3473534758_1ae3847781.jpg, 522486784_978021d537.jpg, 78984436_ad96eaa802.jpg, 255741044_1102982213.jpg, 3264678536_46601d25f0.jpg | 2/5 |
47
+ | Ọtụtụ mmadụ nọ n'okporo ụzọ | A crowd of people on a street | 3638374272_444f5e0457.jpg, 256444892_efcb3bd824.jpg, 3225037367_a71fa86319.jpg, 3433470650_a8b1c27173.jpg, 1685990174_09c4fb7df8.jpg | 4/5 |
48
+
49
+ | held-out Igbo caption | English reference | GT rank | in top-5 |
50
+ |---|---|---|---|
51
+ | Ndị ikom abụọ na-egwuri egwu na egwuregwu egwuregwu ọnụ . | Two men are playing in a sports game together . | 8 | no |
52
+ | A isi awọ agba nkịta na-eje ije na mmiri ájá na a osimiri . | A grey colored dog walks in wet sand at a beach . | 14 | no |
53
+ | Nkịta na-ejide Frisbee na ndị na-ekiri ya na ndabere . | A dog catching a Frisbee with onlookers in the background . | 3 | yes |
54
+ | Ụmụ agbọghọ abụọ na-acha odo odo na-egwuri egwu ọnụ . | Two blond girls are playing together . | 1 | yes |
55
+ | Nkịta na-awakpo nwoke yi ngwá ọrụ nchebe . | A dog attacking a man wearing protective gear . | 3 | yes |
56
+ | Nkịta ojii na aja aja na-agba ọsọ gafee ahịhịa. | A black and brown dog running across the grass . | 4 | yes |
results/igbo_search.json ADDED
@@ -0,0 +1,588 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "ckpt": "runs/native_bird/best.pt",
3
+ "gallery": 809,
4
+ "natural_queries": [
5
+ {
6
+ "ibo": "Nkịta na-agba ọsọ n'elu ahịhịa",
7
+ "eng": "A dog running on the grass",
8
+ "ibo_top5": [
9
+ {
10
+ "image_id": "697582336_601462e052.jpg",
11
+ "score": 0.6106
12
+ },
13
+ {
14
+ "image_id": "2114739371_83aa8bdb0e.jpg",
15
+ "score": 0.5652
16
+ },
17
+ {
18
+ "image_id": "1514957266_a19827c538.jpg",
19
+ "score": 0.4906
20
+ },
21
+ {
22
+ "image_id": "240583223_e26e17ee96.jpg",
23
+ "score": 0.4844
24
+ },
25
+ {
26
+ "image_id": "3358380484_b99b48f0c9.jpg",
27
+ "score": 0.4838
28
+ }
29
+ ],
30
+ "eng_top5": [
31
+ {
32
+ "image_id": "697582336_601462e052.jpg",
33
+ "score": 0.5392
34
+ },
35
+ {
36
+ "image_id": "240583223_e26e17ee96.jpg",
37
+ "score": 0.5132
38
+ },
39
+ {
40
+ "image_id": "3518675890_2f65e23ff9.jpg",
41
+ "score": 0.4845
42
+ },
43
+ {
44
+ "image_id": "2114739371_83aa8bdb0e.jpg",
45
+ "score": 0.4705
46
+ },
47
+ {
48
+ "image_id": "3435035138_af32890a4c.jpg",
49
+ "score": 0.4673
50
+ }
51
+ ],
52
+ "top5_overlap": 3
53
+ },
54
+ {
55
+ "ibo": "Ụmụaka na-egwu egwu n'ime mmiri",
56
+ "eng": "Children playing in the water",
57
+ "ibo_top5": [
58
+ {
59
+ "image_id": "1095476286_87d4f8664e.jpg",
60
+ "score": 0.5337
61
+ },
62
+ {
63
+ "image_id": "3041689520_c481bdb20e.jpg",
64
+ "score": 0.5287
65
+ },
66
+ {
67
+ "image_id": "2951092164_4940b9a517.jpg",
68
+ "score": 0.4685
69
+ },
70
+ {
71
+ "image_id": "3545427060_c16a8b7dfd.jpg",
72
+ "score": 0.4635
73
+ },
74
+ {
75
+ "image_id": "3747543364_bf5b548527.jpg",
76
+ "score": 0.4539
77
+ }
78
+ ],
79
+ "eng_top5": [
80
+ {
81
+ "image_id": "1095476286_87d4f8664e.jpg",
82
+ "score": 0.5283
83
+ },
84
+ {
85
+ "image_id": "3041689520_c481bdb20e.jpg",
86
+ "score": 0.504
87
+ },
88
+ {
89
+ "image_id": "2951092164_4940b9a517.jpg",
90
+ "score": 0.4709
91
+ },
92
+ {
93
+ "image_id": "3545427060_c16a8b7dfd.jpg",
94
+ "score": 0.4709
95
+ },
96
+ {
97
+ "image_id": "3747543364_bf5b548527.jpg",
98
+ "score": 0.4692
99
+ }
100
+ ],
101
+ "top5_overlap": 5
102
+ },
103
+ {
104
+ "ibo": "Otu nwoke na-agba ịnyịnya ígwè",
105
+ "eng": "A man riding a bicycle",
106
+ "ibo_top5": [
107
+ {
108
+ "image_id": "3649916507_b88a3d2082.jpg",
109
+ "score": 0.5071
110
+ },
111
+ {
112
+ "image_id": "3391924827_53b31542ce.jpg",
113
+ "score": 0.5004
114
+ },
115
+ {
116
+ "image_id": "3079073247_97e88e2eb7.jpg",
117
+ "score": 0.4955
118
+ },
119
+ {
120
+ "image_id": "3665169936_01ae94c9fd.jpg",
121
+ "score": 0.4919
122
+ },
123
+ {
124
+ "image_id": "2192411521_9c7e488c5e.jpg",
125
+ "score": 0.4795
126
+ }
127
+ ],
128
+ "eng_top5": [
129
+ {
130
+ "image_id": "2192411521_9c7e488c5e.jpg",
131
+ "score": 0.5054
132
+ },
133
+ {
134
+ "image_id": "3649916507_b88a3d2082.jpg",
135
+ "score": 0.5044
136
+ },
137
+ {
138
+ "image_id": "3391924827_53b31542ce.jpg",
139
+ "score": 0.4932
140
+ },
141
+ {
142
+ "image_id": "3665169936_01ae94c9fd.jpg",
143
+ "score": 0.4931
144
+ },
145
+ {
146
+ "image_id": "2308108566_2cba6bca53.jpg",
147
+ "score": 0.4526
148
+ }
149
+ ],
150
+ "top5_overlap": 4
151
+ },
152
+ {
153
+ "ibo": "Otu nwanyị yi uwe na-acha uhie uhie",
154
+ "eng": "A woman wearing a red dress",
155
+ "ibo_top5": [
156
+ {
157
+ "image_id": "495055747_a75872762a.jpg",
158
+ "score": 0.5312
159
+ },
160
+ {
161
+ "image_id": "613900608_2e49415772.jpg",
162
+ "score": 0.5263
163
+ },
164
+ {
165
+ "image_id": "3534952095_975cca0056.jpg",
166
+ "score": 0.4633
167
+ },
168
+ {
169
+ "image_id": "2695085448_a11833df95.jpg",
170
+ "score": 0.4492
171
+ },
172
+ {
173
+ "image_id": "1821238649_2fda79d6d7.jpg",
174
+ "score": 0.4281
175
+ }
176
+ ],
177
+ "eng_top5": [
178
+ {
179
+ "image_id": "495055747_a75872762a.jpg",
180
+ "score": 0.5347
181
+ },
182
+ {
183
+ "image_id": "613900608_2e49415772.jpg",
184
+ "score": 0.5008
185
+ },
186
+ {
187
+ "image_id": "3534952095_975cca0056.jpg",
188
+ "score": 0.4484
189
+ },
190
+ {
191
+ "image_id": "3183195653_11b66acb34.jpg",
192
+ "score": 0.4395
193
+ },
194
+ {
195
+ "image_id": "2695085448_a11833df95.jpg",
196
+ "score": 0.4367
197
+ }
198
+ ],
199
+ "top5_overlap": 4
200
+ },
201
+ {
202
+ "ibo": "Ndị mmadụ nọ n'elu ugwu",
203
+ "eng": "People on top of a mountain",
204
+ "ibo_top5": [
205
+ {
206
+ "image_id": "2176980976_7054c99621.jpg",
207
+ "score": 0.6118
208
+ },
209
+ {
210
+ "image_id": "3340575518_137ce2695f.jpg",
211
+ "score": 0.566
212
+ },
213
+ {
214
+ "image_id": "1428578577_82864facae.jpg",
215
+ "score": 0.5028
216
+ },
217
+ {
218
+ "image_id": "3229821595_77ace81c6b.jpg",
219
+ "score": 0.4851
220
+ },
221
+ {
222
+ "image_id": "95783195_e1ba3f57ca.jpg",
223
+ "score": 0.4772
224
+ }
225
+ ],
226
+ "eng_top5": [
227
+ {
228
+ "image_id": "2176980976_7054c99621.jpg",
229
+ "score": 0.6013
230
+ },
231
+ {
232
+ "image_id": "3340575518_137ce2695f.jpg",
233
+ "score": 0.5809
234
+ },
235
+ {
236
+ "image_id": "1428578577_82864facae.jpg",
237
+ "score": 0.4962
238
+ },
239
+ {
240
+ "image_id": "224273695_0b517bd0eb.jpg",
241
+ "score": 0.4638
242
+ },
243
+ {
244
+ "image_id": "3229821595_77ace81c6b.jpg",
245
+ "score": 0.4631
246
+ }
247
+ ],
248
+ "top5_overlap": 4
249
+ },
250
+ {
251
+ "ibo": "Otu nwata nwoke na-awụli elu",
252
+ "eng": "A boy jumping in the air",
253
+ "ibo_top5": [
254
+ {
255
+ "image_id": "3348811097_0e09baa26f.jpg",
256
+ "score": 0.5431
257
+ },
258
+ {
259
+ "image_id": "2061354254_faa5bd294b.jpg",
260
+ "score": 0.4968
261
+ },
262
+ {
263
+ "image_id": "3229913073_e7857a5966.jpg",
264
+ "score": 0.4844
265
+ },
266
+ {
267
+ "image_id": "3741827382_71e93298d0.jpg",
268
+ "score": 0.4737
269
+ },
270
+ {
271
+ "image_id": "3396036947_0af6c3aab7.jpg",
272
+ "score": 0.4445
273
+ }
274
+ ],
275
+ "eng_top5": [
276
+ {
277
+ "image_id": "3348811097_0e09baa26f.jpg",
278
+ "score": 0.5075
279
+ },
280
+ {
281
+ "image_id": "2461616306_3ee7ac1b4b.jpg",
282
+ "score": 0.492
283
+ },
284
+ {
285
+ "image_id": "210126070_0d43b300b9.jpg",
286
+ "score": 0.4805
287
+ },
288
+ {
289
+ "image_id": "3229913073_e7857a5966.jpg",
290
+ "score": 0.4607
291
+ },
292
+ {
293
+ "image_id": "2061354254_faa5bd294b.jpg",
294
+ "score": 0.4519
295
+ }
296
+ ],
297
+ "top5_overlap": 3
298
+ },
299
+ {
300
+ "ibo": "Nkịta abụọ na-egwu egwu",
301
+ "eng": "Two dogs playing together",
302
+ "ibo_top5": [
303
+ {
304
+ "image_id": "3473534758_1ae3847781.jpg",
305
+ "score": 0.5172
306
+ },
307
+ {
308
+ "image_id": "522486784_978021d537.jpg",
309
+ "score": 0.4586
310
+ },
311
+ {
312
+ "image_id": "78984436_ad96eaa802.jpg",
313
+ "score": 0.4584
314
+ },
315
+ {
316
+ "image_id": "255741044_1102982213.jpg",
317
+ "score": 0.4466
318
+ },
319
+ {
320
+ "image_id": "3264678536_46601d25f0.jpg",
321
+ "score": 0.4434
322
+ }
323
+ ],
324
+ "eng_top5": [
325
+ {
326
+ "image_id": "522486784_978021d537.jpg",
327
+ "score": 0.5093
328
+ },
329
+ {
330
+ "image_id": "3473534758_1ae3847781.jpg",
331
+ "score": 0.5004
332
+ },
333
+ {
334
+ "image_id": "649596742_5ba84ce946.jpg",
335
+ "score": 0.4764
336
+ },
337
+ {
338
+ "image_id": "2313230479_13f87c6bf3.jpg",
339
+ "score": 0.4346
340
+ },
341
+ {
342
+ "image_id": "872135364_8c1e47d163.jpg",
343
+ "score": 0.424
344
+ }
345
+ ],
346
+ "top5_overlap": 2
347
+ },
348
+ {
349
+ "ibo": "Ọtụtụ mmadụ nọ n'okporo ụzọ",
350
+ "eng": "A crowd of people on a street",
351
+ "ibo_top5": [
352
+ {
353
+ "image_id": "3638374272_444f5e0457.jpg",
354
+ "score": 0.4871
355
+ },
356
+ {
357
+ "image_id": "256444892_efcb3bd824.jpg",
358
+ "score": 0.486
359
+ },
360
+ {
361
+ "image_id": "3225037367_a71fa86319.jpg",
362
+ "score": 0.4641
363
+ },
364
+ {
365
+ "image_id": "3433470650_a8b1c27173.jpg",
366
+ "score": 0.4622
367
+ },
368
+ {
369
+ "image_id": "1685990174_09c4fb7df8.jpg",
370
+ "score": 0.4556
371
+ }
372
+ ],
373
+ "eng_top5": [
374
+ {
375
+ "image_id": "3225037367_a71fa86319.jpg",
376
+ "score": 0.5139
377
+ },
378
+ {
379
+ "image_id": "3433470650_a8b1c27173.jpg",
380
+ "score": 0.5117
381
+ },
382
+ {
383
+ "image_id": "1685990174_09c4fb7df8.jpg",
384
+ "score": 0.5078
385
+ },
386
+ {
387
+ "image_id": "3638374272_444f5e0457.jpg",
388
+ "score": 0.5008
389
+ },
390
+ {
391
+ "image_id": "3627676364_1dc9294ec5.jpg",
392
+ "score": 0.4698
393
+ }
394
+ ],
395
+ "top5_overlap": 4
396
+ }
397
+ ],
398
+ "heldout_caption_queries": [
399
+ {
400
+ "ibo": "Ndị ikom abụọ na-egwuri egwu na egwuregwu egwuregwu ọnụ .",
401
+ "eng_reference": "Two men are playing in a sports game together .",
402
+ "gt_image_id": "3649307685_60c1294d2a.jpg",
403
+ "gt_rank": 8,
404
+ "gt_in_top5": false,
405
+ "top5": [
406
+ {
407
+ "image_id": "3498997518_c2b16f0a0e.jpg",
408
+ "score": 0.4755
409
+ },
410
+ {
411
+ "image_id": "3613027188_1645ca1976.jpg",
412
+ "score": 0.465
413
+ },
414
+ {
415
+ "image_id": "3262075846_5695021d84.jpg",
416
+ "score": 0.4334
417
+ },
418
+ {
419
+ "image_id": "3506607642_40037b3fbf.jpg",
420
+ "score": 0.4289
421
+ },
422
+ {
423
+ "image_id": "269986132_91b71e8aaa.jpg",
424
+ "score": 0.4134
425
+ }
426
+ ]
427
+ },
428
+ {
429
+ "ibo": "A isi awọ agba nkịta na-eje ije na mmiri ájá na a osimiri .",
430
+ "eng_reference": "A grey colored dog walks in wet sand at a beach .",
431
+ "gt_image_id": "1526325728_74eb4153d8.jpg",
432
+ "gt_rank": 14,
433
+ "gt_in_top5": false,
434
+ "top5": [
435
+ {
436
+ "image_id": "3235746553_a40416c00e.jpg",
437
+ "score": 0.6606
438
+ },
439
+ {
440
+ "image_id": "2417745327_a2c2705043.jpg",
441
+ "score": 0.6486
442
+ },
443
+ {
444
+ "image_id": "140430106_2978fda105.jpg",
445
+ "score": 0.6157
446
+ },
447
+ {
448
+ "image_id": "3571675421_7e07ac07c5.jpg",
449
+ "score": 0.5766
450
+ },
451
+ {
452
+ "image_id": "2281006675_fde04e93dd.jpg",
453
+ "score": 0.5653
454
+ }
455
+ ]
456
+ },
457
+ {
458
+ "ibo": "Nkịta na-ejide Frisbee na ndị na-ekiri ya na ndabere .",
459
+ "eng_reference": "A dog catching a Frisbee with onlookers in the background .",
460
+ "gt_image_id": "2857609295_16aaa85293.jpg",
461
+ "gt_rank": 3,
462
+ "gt_in_top5": true,
463
+ "top5": [
464
+ {
465
+ "image_id": "436013859_793d870b6f.jpg",
466
+ "score": 0.6381
467
+ },
468
+ {
469
+ "image_id": "2942133798_e57c862a90.jpg",
470
+ "score": 0.5135
471
+ },
472
+ {
473
+ "image_id": "2857609295_16aaa85293.jpg",
474
+ "score": 0.5105
475
+ },
476
+ {
477
+ "image_id": "241346215_037e18403a.jpg",
478
+ "score": 0.4531
479
+ },
480
+ {
481
+ "image_id": "2165461920_1a4144eb2b.jpg",
482
+ "score": 0.4091
483
+ }
484
+ ]
485
+ },
486
+ {
487
+ "ibo": "Ụmụ agbọghọ abụọ na-acha odo odo na-egwuri egwu ọnụ .",
488
+ "eng_reference": "Two blond girls are playing together .",
489
+ "gt_image_id": "2599131872_65789d86d5.jpg",
490
+ "gt_rank": 1,
491
+ "gt_in_top5": true,
492
+ "top5": [
493
+ {
494
+ "image_id": "2599131872_65789d86d5.jpg",
495
+ "score": 0.515
496
+ },
497
+ {
498
+ "image_id": "3661072592_2e693cd5a0.jpg",
499
+ "score": 0.4701
500
+ },
501
+ {
502
+ "image_id": "1425485485_d7c97a5470.jpg",
503
+ "score": 0.4576
504
+ },
505
+ {
506
+ "image_id": "1424237335_b3be9920ba.jpg",
507
+ "score": 0.4476
508
+ },
509
+ {
510
+ "image_id": "1316247213_1d2c726dd5.jpg",
511
+ "score": 0.4279
512
+ }
513
+ ]
514
+ },
515
+ {
516
+ "ibo": "Nkịta na-awakpo nwoke yi ngwá ọrụ nchebe .",
517
+ "eng_reference": "A dog attacking a man wearing protective gear .",
518
+ "gt_image_id": "2629346153_155ba73ae9.jpg",
519
+ "gt_rank": 3,
520
+ "gt_in_top5": true,
521
+ "top5": [
522
+ {
523
+ "image_id": "1562392511_522a26063b.jpg",
524
+ "score": 0.4444
525
+ },
526
+ {
527
+ "image_id": "3442844140_15aa45e9b8.jpg",
528
+ "score": 0.4008
529
+ },
530
+ {
531
+ "image_id": "2629346153_155ba73ae9.jpg",
532
+ "score": 0.35
533
+ },
534
+ {
535
+ "image_id": "2437266971_b91a8f9a00.jpg",
536
+ "score": 0.3412
537
+ },
538
+ {
539
+ "image_id": "1835511273_790eaae6e6.jpg",
540
+ "score": 0.3388
541
+ }
542
+ ]
543
+ },
544
+ {
545
+ "ibo": "Nkịta ojii na aja aja na-agba ọsọ gafee ahịhịa.",
546
+ "eng_reference": "A black and brown dog running across the grass .",
547
+ "gt_image_id": "697582336_601462e052.jpg",
548
+ "gt_rank": 4,
549
+ "gt_in_top5": true,
550
+ "top5": [
551
+ {
552
+ "image_id": "435739506_2daf7f4887.jpg",
553
+ "score": 0.4904
554
+ },
555
+ {
556
+ "image_id": "333973142_abcd151002.jpg",
557
+ "score": 0.4688
558
+ },
559
+ {
560
+ "image_id": "472860064_a96a228796.jpg",
561
+ "score": 0.4584
562
+ },
563
+ {
564
+ "image_id": "697582336_601462e052.jpg",
565
+ "score": 0.4566
566
+ },
567
+ {
568
+ "image_id": "3025334206_76888792e5.jpg",
569
+ "score": 0.4396
570
+ }
571
+ ]
572
+ }
573
+ ],
574
+ "all_ibo_captions": {
575
+ "n": 751,
576
+ "hit@1": 37.42,
577
+ "hit@5": 68.44,
578
+ "hit@10": 80.56,
579
+ "median_rank": 2
580
+ },
581
+ "all_eng_captions": {
582
+ "n": 809,
583
+ "hit@1": 44.99,
584
+ "hit@5": 76.64,
585
+ "hit@10": 87.02,
586
+ "median_rank": 2
587
+ }
588
+ }
results/text_encoder_crosslingual_test.json ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "split": "test_unfiltered",
3
+ "n": 809,
4
+ "seed": 0,
5
+ "models": {
6
+ "native_bird": {
7
+ "ibo": {
8
+ "cos_matched_mean": 0.7389,
9
+ "cos_unmatched_mean": 0.2169,
10
+ "margin": 0.522,
11
+ "acc@1_cap2eng": 96.66,
12
+ "acc@5_cap2eng": 99.26,
13
+ "acc@1_eng2cap": 95.06
14
+ },
15
+ "hau": {
16
+ "cos_matched_mean": 0.6745,
17
+ "cos_unmatched_mean": 0.1988,
18
+ "margin": 0.4757,
19
+ "acc@1_cap2eng": 87.89,
20
+ "acc@5_cap2eng": 97.16,
21
+ "acc@1_eng2cap": 85.66
22
+ },
23
+ "yor": {
24
+ "cos_matched_mean": 0.65,
25
+ "cos_unmatched_mean": 0.2092,
26
+ "margin": 0.4408,
27
+ "acc@1_cap2eng": 79.23,
28
+ "acc@5_cap2eng": 93.94,
29
+ "acc@1_eng2cap": 79.73
30
+ },
31
+ "avg_acc@1_cap2eng": 87.93,
32
+ "avg_margin": 0.4795,
33
+ "model_id": "Modularcomputing/Native-Bird",
34
+ "sec": 27.2
35
+ },
36
+ "labse": {
37
+ "ibo": {
38
+ "cos_matched_mean": 0.859,
39
+ "cos_unmatched_mean": 0.3248,
40
+ "margin": 0.5342,
41
+ "acc@1_cap2eng": 97.16,
42
+ "acc@5_cap2eng": 99.63,
43
+ "acc@1_eng2cap": 97.03
44
+ },
45
+ "hau": {
46
+ "cos_matched_mean": 0.7849,
47
+ "cos_unmatched_mean": 0.3233,
48
+ "margin": 0.4616,
49
+ "acc@1_cap2eng": 89.99,
50
+ "acc@5_cap2eng": 97.4,
51
+ "acc@1_eng2cap": 86.53
52
+ },
53
+ "yor": {
54
+ "cos_matched_mean": 0.7253,
55
+ "cos_unmatched_mean": 0.2938,
56
+ "margin": 0.4314,
57
+ "acc@1_cap2eng": 82.57,
58
+ "acc@5_cap2eng": 93.7,
59
+ "acc@1_eng2cap": 78.99
60
+ },
61
+ "avg_acc@1_cap2eng": 89.91,
62
+ "avg_margin": 0.4757,
63
+ "model_id": "sentence-transformers/LaBSE",
64
+ "sec": 12.8
65
+ }
66
+ }
67
+ }
results/train_log_native_bird.json ADDED
@@ -0,0 +1,985 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "history": [
3
+ {
4
+ "epoch": 1,
5
+ "loss": 3.0705511197447777,
6
+ "sec": 0.3,
7
+ "logit_scale": 15.06,
8
+ "val": {
9
+ "eng": {
10
+ "n": 809,
11
+ "i2t_R@1": 41.9,
12
+ "t2i_R@1": 44.87,
13
+ "i2t_R@5": 75.77,
14
+ "t2i_R@5": 77.01,
15
+ "i2t_R@10": 86.16,
16
+ "t2i_R@10": 85.91,
17
+ "mean_R": 68.6
18
+ },
19
+ "ibo": {
20
+ "n": 742,
21
+ "i2t_R@1": 34.1,
22
+ "t2i_R@1": 37.74,
23
+ "i2t_R@5": 69.14,
24
+ "t2i_R@5": 67.79,
25
+ "i2t_R@10": 80.46,
26
+ "t2i_R@10": 81.67,
27
+ "mean_R": 61.82
28
+ },
29
+ "hau": {
30
+ "n": 770,
31
+ "i2t_R@1": 28.31,
32
+ "t2i_R@1": 27.66,
33
+ "i2t_R@5": 56.1,
34
+ "t2i_R@5": 59.35,
35
+ "i2t_R@10": 71.3,
36
+ "t2i_R@10": 72.86,
37
+ "mean_R": 52.6
38
+ },
39
+ "yor": {
40
+ "n": 764,
41
+ "i2t_R@1": 20.16,
42
+ "t2i_R@1": 20.94,
43
+ "i2t_R@5": 48.04,
44
+ "t2i_R@5": 46.6,
45
+ "i2t_R@10": 59.82,
46
+ "t2i_R@10": 61.13,
47
+ "mean_R": 42.78
48
+ }
49
+ },
50
+ "val_mean_R": 56.45
51
+ },
52
+ {
53
+ "epoch": 2,
54
+ "loss": 1.4599019723633926,
55
+ "sec": 0.2,
56
+ "logit_scale": 16.69,
57
+ "val": {
58
+ "eng": {
59
+ "n": 809,
60
+ "i2t_R@1": 47.34,
61
+ "t2i_R@1": 48.83,
62
+ "i2t_R@5": 79.23,
63
+ "t2i_R@5": 78.37,
64
+ "i2t_R@10": 88.01,
65
+ "t2i_R@10": 87.27,
66
+ "mean_R": 71.51
67
+ },
68
+ "ibo": {
69
+ "n": 742,
70
+ "i2t_R@1": 38.54,
71
+ "t2i_R@1": 40.43,
72
+ "i2t_R@5": 71.97,
73
+ "t2i_R@5": 71.56,
74
+ "i2t_R@10": 82.75,
75
+ "t2i_R@10": 82.88,
76
+ "mean_R": 64.69
77
+ },
78
+ "hau": {
79
+ "n": 770,
80
+ "i2t_R@1": 31.82,
81
+ "t2i_R@1": 33.25,
82
+ "i2t_R@5": 62.21,
83
+ "t2i_R@5": 62.34,
84
+ "i2t_R@10": 76.23,
85
+ "t2i_R@10": 76.75,
86
+ "mean_R": 57.1
87
+ },
88
+ "yor": {
89
+ "n": 764,
90
+ "i2t_R@1": 24.08,
91
+ "t2i_R@1": 23.95,
92
+ "i2t_R@5": 53.01,
93
+ "t2i_R@5": 52.49,
94
+ "i2t_R@10": 65.71,
95
+ "t2i_R@10": 66.49,
96
+ "mean_R": 47.62
97
+ }
98
+ },
99
+ "val_mean_R": 60.23
100
+ },
101
+ {
102
+ "epoch": 3,
103
+ "loss": 1.124440540249149,
104
+ "sec": 0.2,
105
+ "logit_scale": 18.25,
106
+ "val": {
107
+ "eng": {
108
+ "n": 809,
109
+ "i2t_R@1": 49.57,
110
+ "t2i_R@1": 47.47,
111
+ "i2t_R@5": 79.6,
112
+ "t2i_R@5": 78.37,
113
+ "i2t_R@10": 88.26,
114
+ "t2i_R@10": 87.39,
115
+ "mean_R": 71.78
116
+ },
117
+ "ibo": {
118
+ "n": 742,
119
+ "i2t_R@1": 40.84,
120
+ "t2i_R@1": 40.43,
121
+ "i2t_R@5": 71.7,
122
+ "t2i_R@5": 70.62,
123
+ "i2t_R@10": 83.02,
124
+ "t2i_R@10": 81.67,
125
+ "mean_R": 64.71
126
+ },
127
+ "hau": {
128
+ "n": 770,
129
+ "i2t_R@1": 33.12,
130
+ "t2i_R@1": 31.3,
131
+ "i2t_R@5": 60.91,
132
+ "t2i_R@5": 62.99,
133
+ "i2t_R@10": 75.58,
134
+ "t2i_R@10": 76.23,
135
+ "mean_R": 56.69
136
+ },
137
+ "yor": {
138
+ "n": 764,
139
+ "i2t_R@1": 24.35,
140
+ "t2i_R@1": 25.0,
141
+ "i2t_R@5": 54.06,
142
+ "t2i_R@5": 53.4,
143
+ "i2t_R@10": 68.32,
144
+ "t2i_R@10": 66.88,
145
+ "mean_R": 48.67
146
+ }
147
+ },
148
+ "val_mean_R": 60.46
149
+ },
150
+ {
151
+ "epoch": 4,
152
+ "loss": 0.9302061789979538,
153
+ "sec": 0.2,
154
+ "logit_scale": 19.77,
155
+ "val": {
156
+ "eng": {
157
+ "n": 809,
158
+ "i2t_R@1": 46.23,
159
+ "t2i_R@1": 46.48,
160
+ "i2t_R@5": 78.49,
161
+ "t2i_R@5": 77.75,
162
+ "i2t_R@10": 87.52,
163
+ "t2i_R@10": 86.53,
164
+ "mean_R": 70.5
165
+ },
166
+ "ibo": {
167
+ "n": 742,
168
+ "i2t_R@1": 38.95,
169
+ "t2i_R@1": 40.43,
170
+ "i2t_R@5": 71.02,
171
+ "t2i_R@5": 70.89,
172
+ "i2t_R@10": 83.83,
173
+ "t2i_R@10": 82.88,
174
+ "mean_R": 64.67
175
+ },
176
+ "hau": {
177
+ "n": 770,
178
+ "i2t_R@1": 31.56,
179
+ "t2i_R@1": 31.43,
180
+ "i2t_R@5": 61.04,
181
+ "t2i_R@5": 61.04,
182
+ "i2t_R@10": 74.68,
183
+ "t2i_R@10": 74.03,
184
+ "mean_R": 55.63
185
+ },
186
+ "yor": {
187
+ "n": 764,
188
+ "i2t_R@1": 24.61,
189
+ "t2i_R@1": 23.04,
190
+ "i2t_R@5": 54.06,
191
+ "t2i_R@5": 52.75,
192
+ "i2t_R@10": 65.71,
193
+ "t2i_R@10": 64.79,
194
+ "mean_R": 47.49
195
+ }
196
+ },
197
+ "val_mean_R": 59.57
198
+ },
199
+ {
200
+ "epoch": 5,
201
+ "loss": 0.7919718983272711,
202
+ "sec": 0.2,
203
+ "logit_scale": 21.23,
204
+ "val": {
205
+ "eng": {
206
+ "n": 809,
207
+ "i2t_R@1": 45.86,
208
+ "t2i_R@1": 46.11,
209
+ "i2t_R@5": 77.13,
210
+ "t2i_R@5": 77.5,
211
+ "i2t_R@10": 86.77,
212
+ "t2i_R@10": 86.28,
213
+ "mean_R": 69.94
214
+ },
215
+ "ibo": {
216
+ "n": 742,
217
+ "i2t_R@1": 38.27,
218
+ "t2i_R@1": 39.62,
219
+ "i2t_R@5": 68.6,
220
+ "t2i_R@5": 71.29,
221
+ "i2t_R@10": 81.27,
222
+ "t2i_R@10": 80.32,
223
+ "mean_R": 63.23
224
+ },
225
+ "hau": {
226
+ "n": 770,
227
+ "i2t_R@1": 33.38,
228
+ "t2i_R@1": 30.52,
229
+ "i2t_R@5": 60.78,
230
+ "t2i_R@5": 62.47,
231
+ "i2t_R@10": 73.77,
232
+ "t2i_R@10": 73.51,
233
+ "mean_R": 55.74
234
+ },
235
+ "yor": {
236
+ "n": 764,
237
+ "i2t_R@1": 24.35,
238
+ "t2i_R@1": 23.95,
239
+ "i2t_R@5": 52.88,
240
+ "t2i_R@5": 52.62,
241
+ "i2t_R@10": 64.4,
242
+ "t2i_R@10": 65.05,
243
+ "mean_R": 47.21
244
+ }
245
+ },
246
+ "val_mean_R": 59.03
247
+ },
248
+ {
249
+ "epoch": 6,
250
+ "loss": 0.6851718326409658,
251
+ "sec": 0.2,
252
+ "logit_scale": 22.6,
253
+ "val": {
254
+ "eng": {
255
+ "n": 809,
256
+ "i2t_R@1": 45.98,
257
+ "t2i_R@1": 45.36,
258
+ "i2t_R@5": 77.01,
259
+ "t2i_R@5": 75.15,
260
+ "i2t_R@10": 85.29,
261
+ "t2i_R@10": 83.93,
262
+ "mean_R": 68.79
263
+ },
264
+ "ibo": {
265
+ "n": 742,
266
+ "i2t_R@1": 37.47,
267
+ "t2i_R@1": 37.33,
268
+ "i2t_R@5": 69.0,
269
+ "t2i_R@5": 68.46,
270
+ "i2t_R@10": 80.86,
271
+ "t2i_R@10": 80.46,
272
+ "mean_R": 62.26
273
+ },
274
+ "hau": {
275
+ "n": 770,
276
+ "i2t_R@1": 30.65,
277
+ "t2i_R@1": 29.35,
278
+ "i2t_R@5": 60.0,
279
+ "t2i_R@5": 59.35,
280
+ "i2t_R@10": 72.47,
281
+ "t2i_R@10": 72.34,
282
+ "mean_R": 54.03
283
+ },
284
+ "yor": {
285
+ "n": 764,
286
+ "i2t_R@1": 24.48,
287
+ "t2i_R@1": 23.43,
288
+ "i2t_R@5": 52.88,
289
+ "t2i_R@5": 51.31,
290
+ "i2t_R@10": 65.31,
291
+ "t2i_R@10": 63.48,
292
+ "mean_R": 46.82
293
+ }
294
+ },
295
+ "val_mean_R": 57.98
296
+ },
297
+ {
298
+ "epoch": 7,
299
+ "loss": 0.5936599510411421,
300
+ "sec": 0.2,
301
+ "logit_scale": 23.9,
302
+ "val": {
303
+ "eng": {
304
+ "n": 809,
305
+ "i2t_R@1": 45.36,
306
+ "t2i_R@1": 43.88,
307
+ "i2t_R@5": 75.4,
308
+ "t2i_R@5": 73.55,
309
+ "i2t_R@10": 85.04,
310
+ "t2i_R@10": 84.43,
311
+ "mean_R": 67.94
312
+ },
313
+ "ibo": {
314
+ "n": 742,
315
+ "i2t_R@1": 36.52,
316
+ "t2i_R@1": 35.04,
317
+ "i2t_R@5": 68.46,
318
+ "t2i_R@5": 68.6,
319
+ "i2t_R@10": 80.73,
320
+ "t2i_R@10": 79.25,
321
+ "mean_R": 61.43
322
+ },
323
+ "hau": {
324
+ "n": 770,
325
+ "i2t_R@1": 31.17,
326
+ "t2i_R@1": 30.39,
327
+ "i2t_R@5": 59.48,
328
+ "t2i_R@5": 60.26,
329
+ "i2t_R@10": 72.21,
330
+ "t2i_R@10": 71.69,
331
+ "mean_R": 54.2
332
+ },
333
+ "yor": {
334
+ "n": 764,
335
+ "i2t_R@1": 24.61,
336
+ "t2i_R@1": 22.77,
337
+ "i2t_R@5": 50.52,
338
+ "t2i_R@5": 49.74,
339
+ "i2t_R@10": 64.4,
340
+ "t2i_R@10": 63.74,
341
+ "mean_R": 45.96
342
+ }
343
+ },
344
+ "val_mean_R": 57.38
345
+ },
346
+ {
347
+ "epoch": 8,
348
+ "loss": 0.5110944022114078,
349
+ "sec": 0.3,
350
+ "logit_scale": 25.08,
351
+ "val": {
352
+ "eng": {
353
+ "n": 809,
354
+ "i2t_R@1": 43.26,
355
+ "t2i_R@1": 42.77,
356
+ "i2t_R@5": 73.67,
357
+ "t2i_R@5": 73.79,
358
+ "i2t_R@10": 84.43,
359
+ "t2i_R@10": 85.04,
360
+ "mean_R": 67.16
361
+ },
362
+ "ibo": {
363
+ "n": 742,
364
+ "i2t_R@1": 35.44,
365
+ "t2i_R@1": 36.39,
366
+ "i2t_R@5": 67.65,
367
+ "t2i_R@5": 65.9,
368
+ "i2t_R@10": 78.98,
369
+ "t2i_R@10": 78.84,
370
+ "mean_R": 60.53
371
+ },
372
+ "hau": {
373
+ "n": 770,
374
+ "i2t_R@1": 31.56,
375
+ "t2i_R@1": 29.22,
376
+ "i2t_R@5": 58.31,
377
+ "t2i_R@5": 58.44,
378
+ "i2t_R@10": 73.12,
379
+ "t2i_R@10": 73.38,
380
+ "mean_R": 54.0
381
+ },
382
+ "yor": {
383
+ "n": 764,
384
+ "i2t_R@1": 24.08,
385
+ "t2i_R@1": 24.35,
386
+ "i2t_R@5": 52.62,
387
+ "t2i_R@5": 51.31,
388
+ "i2t_R@10": 64.53,
389
+ "t2i_R@10": 62.3,
390
+ "mean_R": 46.53
391
+ }
392
+ },
393
+ "val_mean_R": 57.05
394
+ },
395
+ {
396
+ "epoch": 9,
397
+ "loss": 0.4497916651889682,
398
+ "sec": 0.2,
399
+ "logit_scale": 26.14,
400
+ "val": {
401
+ "eng": {
402
+ "n": 809,
403
+ "i2t_R@1": 41.66,
404
+ "t2i_R@1": 41.78,
405
+ "i2t_R@5": 73.18,
406
+ "t2i_R@5": 73.42,
407
+ "i2t_R@10": 84.3,
408
+ "t2i_R@10": 83.93,
409
+ "mean_R": 66.38
410
+ },
411
+ "ibo": {
412
+ "n": 742,
413
+ "i2t_R@1": 34.5,
414
+ "t2i_R@1": 35.31,
415
+ "i2t_R@5": 66.85,
416
+ "t2i_R@5": 66.98,
417
+ "i2t_R@10": 79.11,
418
+ "t2i_R@10": 78.57,
419
+ "mean_R": 60.22
420
+ },
421
+ "hau": {
422
+ "n": 770,
423
+ "i2t_R@1": 30.39,
424
+ "t2i_R@1": 29.35,
425
+ "i2t_R@5": 58.44,
426
+ "t2i_R@5": 58.96,
427
+ "i2t_R@10": 71.43,
428
+ "t2i_R@10": 70.39,
429
+ "mean_R": 53.16
430
+ },
431
+ "yor": {
432
+ "n": 764,
433
+ "i2t_R@1": 23.69,
434
+ "t2i_R@1": 22.38,
435
+ "i2t_R@5": 51.57,
436
+ "t2i_R@5": 50.52,
437
+ "i2t_R@10": 61.26,
438
+ "t2i_R@10": 62.57,
439
+ "mean_R": 45.33
440
+ }
441
+ },
442
+ "val_mean_R": 56.27
443
+ },
444
+ {
445
+ "epoch": 10,
446
+ "loss": 0.3943763903031747,
447
+ "sec": 0.2,
448
+ "logit_scale": 27.06,
449
+ "val": {
450
+ "eng": {
451
+ "n": 809,
452
+ "i2t_R@1": 40.91,
453
+ "t2i_R@1": 40.91,
454
+ "i2t_R@5": 73.55,
455
+ "t2i_R@5": 72.19,
456
+ "i2t_R@10": 83.19,
457
+ "t2i_R@10": 82.69,
458
+ "mean_R": 65.57
459
+ },
460
+ "ibo": {
461
+ "n": 742,
462
+ "i2t_R@1": 33.02,
463
+ "t2i_R@1": 33.02,
464
+ "i2t_R@5": 64.29,
465
+ "t2i_R@5": 63.07,
466
+ "i2t_R@10": 79.51,
467
+ "t2i_R@10": 77.36,
468
+ "mean_R": 58.38
469
+ },
470
+ "hau": {
471
+ "n": 770,
472
+ "i2t_R@1": 29.74,
473
+ "t2i_R@1": 27.4,
474
+ "i2t_R@5": 58.05,
475
+ "t2i_R@5": 58.31,
476
+ "i2t_R@10": 71.82,
477
+ "t2i_R@10": 69.87,
478
+ "mean_R": 52.53
479
+ },
480
+ "yor": {
481
+ "n": 764,
482
+ "i2t_R@1": 25.0,
483
+ "t2i_R@1": 23.69,
484
+ "i2t_R@5": 51.18,
485
+ "t2i_R@5": 50.79,
486
+ "i2t_R@10": 62.96,
487
+ "t2i_R@10": 61.78,
488
+ "mean_R": 45.9
489
+ }
490
+ },
491
+ "val_mean_R": 55.59
492
+ },
493
+ {
494
+ "epoch": 11,
495
+ "loss": 0.3472120384685695,
496
+ "sec": 0.2,
497
+ "logit_scale": 27.87,
498
+ "val": {
499
+ "eng": {
500
+ "n": 809,
501
+ "i2t_R@1": 42.4,
502
+ "t2i_R@1": 40.54,
503
+ "i2t_R@5": 72.19,
504
+ "t2i_R@5": 72.81,
505
+ "i2t_R@10": 84.18,
506
+ "t2i_R@10": 82.69,
507
+ "mean_R": 65.8
508
+ },
509
+ "ibo": {
510
+ "n": 742,
511
+ "i2t_R@1": 35.31,
512
+ "t2i_R@1": 33.56,
513
+ "i2t_R@5": 64.96,
514
+ "t2i_R@5": 65.23,
515
+ "i2t_R@10": 77.22,
516
+ "t2i_R@10": 76.15,
517
+ "mean_R": 58.74
518
+ },
519
+ "hau": {
520
+ "n": 770,
521
+ "i2t_R@1": 29.74,
522
+ "t2i_R@1": 28.7,
523
+ "i2t_R@5": 58.18,
524
+ "t2i_R@5": 58.18,
525
+ "i2t_R@10": 71.56,
526
+ "t2i_R@10": 70.13,
527
+ "mean_R": 52.75
528
+ },
529
+ "yor": {
530
+ "n": 764,
531
+ "i2t_R@1": 25.65,
532
+ "t2i_R@1": 22.64,
533
+ "i2t_R@5": 50.79,
534
+ "t2i_R@5": 49.35,
535
+ "i2t_R@10": 63.22,
536
+ "t2i_R@10": 61.13,
537
+ "mean_R": 45.46
538
+ }
539
+ },
540
+ "val_mean_R": 55.69
541
+ },
542
+ {
543
+ "epoch": 12,
544
+ "loss": 0.30427658356105286,
545
+ "sec": 0.3,
546
+ "logit_scale": 28.54,
547
+ "val": {
548
+ "eng": {
549
+ "n": 809,
550
+ "i2t_R@1": 42.89,
551
+ "t2i_R@1": 40.79,
552
+ "i2t_R@5": 72.31,
553
+ "t2i_R@5": 71.57,
554
+ "i2t_R@10": 83.19,
555
+ "t2i_R@10": 83.07,
556
+ "mean_R": 65.64
557
+ },
558
+ "ibo": {
559
+ "n": 742,
560
+ "i2t_R@1": 33.69,
561
+ "t2i_R@1": 32.75,
562
+ "i2t_R@5": 65.9,
563
+ "t2i_R@5": 64.96,
564
+ "i2t_R@10": 79.38,
565
+ "t2i_R@10": 78.3,
566
+ "mean_R": 59.16
567
+ },
568
+ "hau": {
569
+ "n": 770,
570
+ "i2t_R@1": 29.61,
571
+ "t2i_R@1": 28.83,
572
+ "i2t_R@5": 57.92,
573
+ "t2i_R@5": 57.14,
574
+ "i2t_R@10": 70.0,
575
+ "t2i_R@10": 71.04,
576
+ "mean_R": 52.42
577
+ },
578
+ "yor": {
579
+ "n": 764,
580
+ "i2t_R@1": 24.74,
581
+ "t2i_R@1": 21.99,
582
+ "i2t_R@5": 50.65,
583
+ "t2i_R@5": 47.77,
584
+ "i2t_R@10": 61.65,
585
+ "t2i_R@10": 61.26,
586
+ "mean_R": 44.68
587
+ }
588
+ },
589
+ "val_mean_R": 55.48
590
+ },
591
+ {
592
+ "epoch": 13,
593
+ "loss": 0.2706154971383512,
594
+ "sec": 0.2,
595
+ "logit_scale": 29.08,
596
+ "val": {
597
+ "eng": {
598
+ "n": 809,
599
+ "i2t_R@1": 40.3,
600
+ "t2i_R@1": 39.8,
601
+ "i2t_R@5": 73.18,
602
+ "t2i_R@5": 71.69,
603
+ "i2t_R@10": 83.56,
604
+ "t2i_R@10": 83.19,
605
+ "mean_R": 65.29
606
+ },
607
+ "ibo": {
608
+ "n": 742,
609
+ "i2t_R@1": 34.37,
610
+ "t2i_R@1": 33.96,
611
+ "i2t_R@5": 64.15,
612
+ "t2i_R@5": 64.15,
613
+ "i2t_R@10": 77.49,
614
+ "t2i_R@10": 75.2,
615
+ "mean_R": 58.22
616
+ },
617
+ "hau": {
618
+ "n": 770,
619
+ "i2t_R@1": 28.18,
620
+ "t2i_R@1": 28.18,
621
+ "i2t_R@5": 58.05,
622
+ "t2i_R@5": 58.7,
623
+ "i2t_R@10": 70.39,
624
+ "t2i_R@10": 69.74,
625
+ "mean_R": 52.21
626
+ },
627
+ "yor": {
628
+ "n": 764,
629
+ "i2t_R@1": 25.39,
630
+ "t2i_R@1": 21.73,
631
+ "i2t_R@5": 50.92,
632
+ "t2i_R@5": 48.17,
633
+ "i2t_R@10": 62.17,
634
+ "t2i_R@10": 61.78,
635
+ "mean_R": 45.03
636
+ }
637
+ },
638
+ "val_mean_R": 55.19
639
+ },
640
+ {
641
+ "epoch": 14,
642
+ "loss": 0.24166721773023406,
643
+ "sec": 0.3,
644
+ "logit_scale": 29.51,
645
+ "val": {
646
+ "eng": {
647
+ "n": 809,
648
+ "i2t_R@1": 40.67,
649
+ "t2i_R@1": 40.54,
650
+ "i2t_R@5": 72.44,
651
+ "t2i_R@5": 71.2,
652
+ "i2t_R@10": 82.69,
653
+ "t2i_R@10": 82.45,
654
+ "mean_R": 65.0
655
+ },
656
+ "ibo": {
657
+ "n": 742,
658
+ "i2t_R@1": 33.56,
659
+ "t2i_R@1": 34.37,
660
+ "i2t_R@5": 63.61,
661
+ "t2i_R@5": 64.96,
662
+ "i2t_R@10": 77.36,
663
+ "t2i_R@10": 75.74,
664
+ "mean_R": 58.27
665
+ },
666
+ "hau": {
667
+ "n": 770,
668
+ "i2t_R@1": 29.74,
669
+ "t2i_R@1": 28.05,
670
+ "i2t_R@5": 57.92,
671
+ "t2i_R@5": 57.4,
672
+ "i2t_R@10": 70.0,
673
+ "t2i_R@10": 69.87,
674
+ "mean_R": 52.16
675
+ },
676
+ "yor": {
677
+ "n": 764,
678
+ "i2t_R@1": 24.48,
679
+ "t2i_R@1": 21.86,
680
+ "i2t_R@5": 50.92,
681
+ "t2i_R@5": 47.25,
682
+ "i2t_R@10": 62.43,
683
+ "t2i_R@10": 60.73,
684
+ "mean_R": 44.61
685
+ }
686
+ },
687
+ "val_mean_R": 55.01
688
+ },
689
+ {
690
+ "epoch": 15,
691
+ "loss": 0.21996013897781572,
692
+ "sec": 0.2,
693
+ "logit_scale": 29.82,
694
+ "val": {
695
+ "eng": {
696
+ "n": 809,
697
+ "i2t_R@1": 41.04,
698
+ "t2i_R@1": 40.54,
699
+ "i2t_R@5": 71.94,
700
+ "t2i_R@5": 71.82,
701
+ "i2t_R@10": 82.69,
702
+ "t2i_R@10": 82.32,
703
+ "mean_R": 65.06
704
+ },
705
+ "ibo": {
706
+ "n": 742,
707
+ "i2t_R@1": 33.69,
708
+ "t2i_R@1": 34.64,
709
+ "i2t_R@5": 64.69,
710
+ "t2i_R@5": 63.21,
711
+ "i2t_R@10": 77.49,
712
+ "t2i_R@10": 76.28,
713
+ "mean_R": 58.33
714
+ },
715
+ "hau": {
716
+ "n": 770,
717
+ "i2t_R@1": 29.87,
718
+ "t2i_R@1": 28.05,
719
+ "i2t_R@5": 57.4,
720
+ "t2i_R@5": 57.53,
721
+ "i2t_R@10": 70.26,
722
+ "t2i_R@10": 69.61,
723
+ "mean_R": 52.12
724
+ },
725
+ "yor": {
726
+ "n": 764,
727
+ "i2t_R@1": 24.87,
728
+ "t2i_R@1": 23.69,
729
+ "i2t_R@5": 50.13,
730
+ "t2i_R@5": 47.38,
731
+ "i2t_R@10": 62.43,
732
+ "t2i_R@10": 61.52,
733
+ "mean_R": 45.0
734
+ }
735
+ },
736
+ "val_mean_R": 55.13
737
+ },
738
+ {
739
+ "epoch": 16,
740
+ "loss": 0.20187547306219736,
741
+ "sec": 0.3,
742
+ "logit_scale": 30.03,
743
+ "val": {
744
+ "eng": {
745
+ "n": 809,
746
+ "i2t_R@1": 40.54,
747
+ "t2i_R@1": 40.17,
748
+ "i2t_R@5": 71.45,
749
+ "t2i_R@5": 71.08,
750
+ "i2t_R@10": 83.19,
751
+ "t2i_R@10": 82.08,
752
+ "mean_R": 64.75
753
+ },
754
+ "ibo": {
755
+ "n": 742,
756
+ "i2t_R@1": 32.75,
757
+ "t2i_R@1": 33.69,
758
+ "i2t_R@5": 64.15,
759
+ "t2i_R@5": 64.02,
760
+ "i2t_R@10": 77.49,
761
+ "t2i_R@10": 75.74,
762
+ "mean_R": 57.97
763
+ },
764
+ "hau": {
765
+ "n": 770,
766
+ "i2t_R@1": 29.09,
767
+ "t2i_R@1": 27.66,
768
+ "i2t_R@5": 58.31,
769
+ "t2i_R@5": 56.1,
770
+ "i2t_R@10": 70.13,
771
+ "t2i_R@10": 69.48,
772
+ "mean_R": 51.79
773
+ },
774
+ "yor": {
775
+ "n": 764,
776
+ "i2t_R@1": 24.61,
777
+ "t2i_R@1": 22.38,
778
+ "i2t_R@5": 50.65,
779
+ "t2i_R@5": 47.12,
780
+ "i2t_R@10": 61.78,
781
+ "t2i_R@10": 60.73,
782
+ "mean_R": 44.54
783
+ }
784
+ },
785
+ "val_mean_R": 54.76
786
+ },
787
+ {
788
+ "epoch": 17,
789
+ "loss": 0.18857671103129783,
790
+ "sec": 0.3,
791
+ "logit_scale": 30.17,
792
+ "val": {
793
+ "eng": {
794
+ "n": 809,
795
+ "i2t_R@1": 40.3,
796
+ "t2i_R@1": 39.68,
797
+ "i2t_R@5": 71.32,
798
+ "t2i_R@5": 70.58,
799
+ "i2t_R@10": 82.82,
800
+ "t2i_R@10": 81.71,
801
+ "mean_R": 64.4
802
+ },
803
+ "ibo": {
804
+ "n": 742,
805
+ "i2t_R@1": 34.1,
806
+ "t2i_R@1": 34.1,
807
+ "i2t_R@5": 63.48,
808
+ "t2i_R@5": 63.21,
809
+ "i2t_R@10": 76.95,
810
+ "t2i_R@10": 75.61,
811
+ "mean_R": 57.91
812
+ },
813
+ "hau": {
814
+ "n": 770,
815
+ "i2t_R@1": 28.7,
816
+ "t2i_R@1": 28.18,
817
+ "i2t_R@5": 58.44,
818
+ "t2i_R@5": 57.4,
819
+ "i2t_R@10": 69.74,
820
+ "t2i_R@10": 68.83,
821
+ "mean_R": 51.88
822
+ },
823
+ "yor": {
824
+ "n": 764,
825
+ "i2t_R@1": 24.21,
826
+ "t2i_R@1": 21.86,
827
+ "i2t_R@5": 50.0,
828
+ "t2i_R@5": 47.12,
829
+ "i2t_R@10": 61.52,
830
+ "t2i_R@10": 60.08,
831
+ "mean_R": 44.13
832
+ }
833
+ },
834
+ "val_mean_R": 54.58
835
+ },
836
+ {
837
+ "epoch": 18,
838
+ "loss": 0.18112863538165888,
839
+ "sec": 0.2,
840
+ "logit_scale": 30.24,
841
+ "val": {
842
+ "eng": {
843
+ "n": 809,
844
+ "i2t_R@1": 40.67,
845
+ "t2i_R@1": 40.42,
846
+ "i2t_R@5": 71.08,
847
+ "t2i_R@5": 70.58,
848
+ "i2t_R@10": 83.07,
849
+ "t2i_R@10": 81.46,
850
+ "mean_R": 64.55
851
+ },
852
+ "ibo": {
853
+ "n": 742,
854
+ "i2t_R@1": 33.96,
855
+ "t2i_R@1": 34.77,
856
+ "i2t_R@5": 64.29,
857
+ "t2i_R@5": 64.02,
858
+ "i2t_R@10": 76.68,
859
+ "t2i_R@10": 75.34,
860
+ "mean_R": 58.18
861
+ },
862
+ "hau": {
863
+ "n": 770,
864
+ "i2t_R@1": 28.7,
865
+ "t2i_R@1": 28.18,
866
+ "i2t_R@5": 57.92,
867
+ "t2i_R@5": 57.4,
868
+ "i2t_R@10": 70.0,
869
+ "t2i_R@10": 69.35,
870
+ "mean_R": 51.93
871
+ },
872
+ "yor": {
873
+ "n": 764,
874
+ "i2t_R@1": 24.35,
875
+ "t2i_R@1": 22.25,
876
+ "i2t_R@5": 49.74,
877
+ "t2i_R@5": 47.38,
878
+ "i2t_R@10": 61.65,
879
+ "t2i_R@10": 60.21,
880
+ "mean_R": 44.26
881
+ }
882
+ },
883
+ "val_mean_R": 54.73
884
+ },
885
+ {
886
+ "epoch": 19,
887
+ "loss": 0.17619465151801705,
888
+ "sec": 0.3,
889
+ "logit_scale": 30.27,
890
+ "val": {
891
+ "eng": {
892
+ "n": 809,
893
+ "i2t_R@1": 40.67,
894
+ "t2i_R@1": 40.79,
895
+ "i2t_R@5": 71.32,
896
+ "t2i_R@5": 70.46,
897
+ "i2t_R@10": 83.19,
898
+ "t2i_R@10": 81.71,
899
+ "mean_R": 64.69
900
+ },
901
+ "ibo": {
902
+ "n": 742,
903
+ "i2t_R@1": 33.56,
904
+ "t2i_R@1": 34.23,
905
+ "i2t_R@5": 64.56,
906
+ "t2i_R@5": 64.29,
907
+ "i2t_R@10": 77.22,
908
+ "t2i_R@10": 75.34,
909
+ "mean_R": 58.2
910
+ },
911
+ "hau": {
912
+ "n": 770,
913
+ "i2t_R@1": 28.57,
914
+ "t2i_R@1": 28.05,
915
+ "i2t_R@5": 58.44,
916
+ "t2i_R@5": 57.01,
917
+ "i2t_R@10": 69.74,
918
+ "t2i_R@10": 69.22,
919
+ "mean_R": 51.84
920
+ },
921
+ "yor": {
922
+ "n": 764,
923
+ "i2t_R@1": 24.08,
924
+ "t2i_R@1": 22.38,
925
+ "i2t_R@5": 49.87,
926
+ "t2i_R@5": 47.51,
927
+ "i2t_R@10": 61.52,
928
+ "t2i_R@10": 60.47,
929
+ "mean_R": 44.3
930
+ }
931
+ },
932
+ "val_mean_R": 54.76
933
+ },
934
+ {
935
+ "epoch": 20,
936
+ "loss": 0.17272056515018144,
937
+ "sec": 0.2,
938
+ "logit_scale": 30.27,
939
+ "val": {
940
+ "eng": {
941
+ "n": 809,
942
+ "i2t_R@1": 40.79,
943
+ "t2i_R@1": 40.79,
944
+ "i2t_R@5": 71.45,
945
+ "t2i_R@5": 70.21,
946
+ "i2t_R@10": 83.19,
947
+ "t2i_R@10": 81.71,
948
+ "mean_R": 64.69
949
+ },
950
+ "ibo": {
951
+ "n": 742,
952
+ "i2t_R@1": 33.42,
953
+ "t2i_R@1": 34.23,
954
+ "i2t_R@5": 64.42,
955
+ "t2i_R@5": 64.15,
956
+ "i2t_R@10": 77.22,
957
+ "t2i_R@10": 75.47,
958
+ "mean_R": 58.15
959
+ },
960
+ "hau": {
961
+ "n": 770,
962
+ "i2t_R@1": 28.7,
963
+ "t2i_R@1": 28.05,
964
+ "i2t_R@5": 58.31,
965
+ "t2i_R@5": 57.01,
966
+ "i2t_R@10": 69.87,
967
+ "t2i_R@10": 69.22,
968
+ "mean_R": 51.86
969
+ },
970
+ "yor": {
971
+ "n": 764,
972
+ "i2t_R@1": 24.08,
973
+ "t2i_R@1": 22.38,
974
+ "i2t_R@5": 50.0,
975
+ "t2i_R@5": 47.38,
976
+ "i2t_R@10": 61.39,
977
+ "t2i_R@10": 60.47,
978
+ "mean_R": 44.28
979
+ }
980
+ },
981
+ "val_mean_R": 54.74
982
+ }
983
+ ],
984
+ "best_val_mean_R": 60.462500000000006
985
+ }
results/train_log_native_bird_unfreeze2.json ADDED
@@ -0,0 +1,985 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "history": [
3
+ {
4
+ "epoch": 1,
5
+ "loss": 2.0317564327269793,
6
+ "sec": 10.2,
7
+ "logit_scale": 16.4,
8
+ "val": {
9
+ "eng": {
10
+ "n": 809,
11
+ "i2t_R@1": 42.77,
12
+ "t2i_R@1": 46.97,
13
+ "i2t_R@5": 76.02,
14
+ "t2i_R@5": 75.77,
15
+ "i2t_R@10": 87.76,
16
+ "t2i_R@10": 87.39,
17
+ "mean_R": 69.45
18
+ },
19
+ "ibo": {
20
+ "n": 742,
21
+ "i2t_R@1": 36.39,
22
+ "t2i_R@1": 36.93,
23
+ "i2t_R@5": 68.06,
24
+ "t2i_R@5": 69.14,
25
+ "i2t_R@10": 81.67,
26
+ "t2i_R@10": 82.88,
27
+ "mean_R": 62.51
28
+ },
29
+ "hau": {
30
+ "n": 770,
31
+ "i2t_R@1": 27.27,
32
+ "t2i_R@1": 28.96,
33
+ "i2t_R@5": 58.7,
34
+ "t2i_R@5": 59.22,
35
+ "i2t_R@10": 72.86,
36
+ "t2i_R@10": 73.64,
37
+ "mean_R": 53.44
38
+ },
39
+ "yor": {
40
+ "n": 764,
41
+ "i2t_R@1": 20.55,
42
+ "t2i_R@1": 21.73,
43
+ "i2t_R@5": 47.38,
44
+ "t2i_R@5": 48.43,
45
+ "i2t_R@10": 62.43,
46
+ "t2i_R@10": 62.96,
47
+ "mean_R": 43.91
48
+ }
49
+ },
50
+ "val_mean_R": 57.33
51
+ },
52
+ {
53
+ "epoch": 2,
54
+ "loss": 1.0098096902171771,
55
+ "sec": 10.0,
56
+ "logit_scale": 19.17,
57
+ "val": {
58
+ "eng": {
59
+ "n": 809,
60
+ "i2t_R@1": 47.84,
61
+ "t2i_R@1": 47.22,
62
+ "i2t_R@5": 79.98,
63
+ "t2i_R@5": 79.23,
64
+ "i2t_R@10": 89.74,
65
+ "t2i_R@10": 88.38,
66
+ "mean_R": 72.06
67
+ },
68
+ "ibo": {
69
+ "n": 742,
70
+ "i2t_R@1": 39.49,
71
+ "t2i_R@1": 39.76,
72
+ "i2t_R@5": 72.78,
73
+ "t2i_R@5": 72.1,
74
+ "i2t_R@10": 83.56,
75
+ "t2i_R@10": 83.69,
76
+ "mean_R": 65.23
77
+ },
78
+ "hau": {
79
+ "n": 770,
80
+ "i2t_R@1": 32.08,
81
+ "t2i_R@1": 30.26,
82
+ "i2t_R@5": 62.21,
83
+ "t2i_R@5": 63.12,
84
+ "i2t_R@10": 75.84,
85
+ "t2i_R@10": 75.06,
86
+ "mean_R": 56.43
87
+ },
88
+ "yor": {
89
+ "n": 764,
90
+ "i2t_R@1": 25.13,
91
+ "t2i_R@1": 25.65,
92
+ "i2t_R@5": 53.4,
93
+ "t2i_R@5": 51.44,
94
+ "i2t_R@10": 65.05,
95
+ "t2i_R@10": 65.45,
96
+ "mean_R": 47.69
97
+ }
98
+ },
99
+ "val_mean_R": 60.35
100
+ },
101
+ {
102
+ "epoch": 3,
103
+ "loss": 0.783551151243349,
104
+ "sec": 9.7,
105
+ "logit_scale": 21.89,
106
+ "val": {
107
+ "eng": {
108
+ "n": 809,
109
+ "i2t_R@1": 45.24,
110
+ "t2i_R@1": 47.47,
111
+ "i2t_R@5": 79.11,
112
+ "t2i_R@5": 77.5,
113
+ "i2t_R@10": 89.25,
114
+ "t2i_R@10": 87.52,
115
+ "mean_R": 71.02
116
+ },
117
+ "ibo": {
118
+ "n": 742,
119
+ "i2t_R@1": 36.52,
120
+ "t2i_R@1": 39.22,
121
+ "i2t_R@5": 71.16,
122
+ "t2i_R@5": 70.89,
123
+ "i2t_R@10": 83.02,
124
+ "t2i_R@10": 83.96,
125
+ "mean_R": 64.13
126
+ },
127
+ "hau": {
128
+ "n": 770,
129
+ "i2t_R@1": 30.91,
130
+ "t2i_R@1": 31.17,
131
+ "i2t_R@5": 62.6,
132
+ "t2i_R@5": 62.99,
133
+ "i2t_R@10": 74.81,
134
+ "t2i_R@10": 76.49,
135
+ "mean_R": 56.5
136
+ },
137
+ "yor": {
138
+ "n": 764,
139
+ "i2t_R@1": 24.48,
140
+ "t2i_R@1": 24.87,
141
+ "i2t_R@5": 53.27,
142
+ "t2i_R@5": 52.75,
143
+ "i2t_R@10": 67.93,
144
+ "t2i_R@10": 67.41,
145
+ "mean_R": 48.45
146
+ }
147
+ },
148
+ "val_mean_R": 60.02
149
+ },
150
+ {
151
+ "epoch": 4,
152
+ "loss": 0.6509892633184791,
153
+ "sec": 9.7,
154
+ "logit_scale": 24.4,
155
+ "val": {
156
+ "eng": {
157
+ "n": 809,
158
+ "i2t_R@1": 47.34,
159
+ "t2i_R@1": 46.72,
160
+ "i2t_R@5": 78.99,
161
+ "t2i_R@5": 77.5,
162
+ "i2t_R@10": 87.52,
163
+ "t2i_R@10": 86.03,
164
+ "mean_R": 70.68
165
+ },
166
+ "ibo": {
167
+ "n": 742,
168
+ "i2t_R@1": 37.87,
169
+ "t2i_R@1": 39.22,
170
+ "i2t_R@5": 69.95,
171
+ "t2i_R@5": 70.35,
172
+ "i2t_R@10": 81.67,
173
+ "t2i_R@10": 82.61,
174
+ "mean_R": 63.61
175
+ },
176
+ "hau": {
177
+ "n": 770,
178
+ "i2t_R@1": 30.52,
179
+ "t2i_R@1": 29.35,
180
+ "i2t_R@5": 61.69,
181
+ "t2i_R@5": 60.65,
182
+ "i2t_R@10": 73.51,
183
+ "t2i_R@10": 74.68,
184
+ "mean_R": 55.07
185
+ },
186
+ "yor": {
187
+ "n": 764,
188
+ "i2t_R@1": 24.61,
189
+ "t2i_R@1": 25.26,
190
+ "i2t_R@5": 54.97,
191
+ "t2i_R@5": 54.45,
192
+ "i2t_R@10": 67.54,
193
+ "t2i_R@10": 65.58,
194
+ "mean_R": 48.73
195
+ }
196
+ },
197
+ "val_mean_R": 59.52
198
+ },
199
+ {
200
+ "epoch": 5,
201
+ "loss": 0.5509887392011782,
202
+ "sec": 9.7,
203
+ "logit_scale": 26.76,
204
+ "val": {
205
+ "eng": {
206
+ "n": 809,
207
+ "i2t_R@1": 47.34,
208
+ "t2i_R@1": 45.86,
209
+ "i2t_R@5": 77.38,
210
+ "t2i_R@5": 78.62,
211
+ "i2t_R@10": 88.63,
212
+ "t2i_R@10": 86.9,
213
+ "mean_R": 70.79
214
+ },
215
+ "ibo": {
216
+ "n": 742,
217
+ "i2t_R@1": 38.54,
218
+ "t2i_R@1": 37.74,
219
+ "i2t_R@5": 69.81,
220
+ "t2i_R@5": 70.22,
221
+ "i2t_R@10": 81.0,
222
+ "t2i_R@10": 81.13,
223
+ "mean_R": 63.07
224
+ },
225
+ "hau": {
226
+ "n": 770,
227
+ "i2t_R@1": 31.82,
228
+ "t2i_R@1": 31.69,
229
+ "i2t_R@5": 60.65,
230
+ "t2i_R@5": 63.38,
231
+ "i2t_R@10": 74.94,
232
+ "t2i_R@10": 76.23,
233
+ "mean_R": 56.45
234
+ },
235
+ "yor": {
236
+ "n": 764,
237
+ "i2t_R@1": 24.74,
238
+ "t2i_R@1": 24.48,
239
+ "i2t_R@5": 52.88,
240
+ "t2i_R@5": 53.4,
241
+ "i2t_R@10": 65.84,
242
+ "t2i_R@10": 67.41,
243
+ "mean_R": 48.12
244
+ }
245
+ },
246
+ "val_mean_R": 59.61
247
+ },
248
+ {
249
+ "epoch": 6,
250
+ "loss": 0.475721658517917,
251
+ "sec": 9.6,
252
+ "logit_scale": 28.87,
253
+ "val": {
254
+ "eng": {
255
+ "n": 809,
256
+ "i2t_R@1": 45.12,
257
+ "t2i_R@1": 45.36,
258
+ "i2t_R@5": 78.24,
259
+ "t2i_R@5": 77.01,
260
+ "i2t_R@10": 86.9,
261
+ "t2i_R@10": 86.4,
262
+ "mean_R": 69.84
263
+ },
264
+ "ibo": {
265
+ "n": 742,
266
+ "i2t_R@1": 39.35,
267
+ "t2i_R@1": 36.79,
268
+ "i2t_R@5": 69.27,
269
+ "t2i_R@5": 69.68,
270
+ "i2t_R@10": 81.67,
271
+ "t2i_R@10": 81.27,
272
+ "mean_R": 63.0
273
+ },
274
+ "hau": {
275
+ "n": 770,
276
+ "i2t_R@1": 31.56,
277
+ "t2i_R@1": 29.87,
278
+ "i2t_R@5": 61.43,
279
+ "t2i_R@5": 64.03,
280
+ "i2t_R@10": 74.29,
281
+ "t2i_R@10": 75.45,
282
+ "mean_R": 56.1
283
+ },
284
+ "yor": {
285
+ "n": 764,
286
+ "i2t_R@1": 25.52,
287
+ "t2i_R@1": 23.43,
288
+ "i2t_R@5": 55.1,
289
+ "t2i_R@5": 54.45,
290
+ "i2t_R@10": 66.1,
291
+ "t2i_R@10": 67.41,
292
+ "mean_R": 48.67
293
+ }
294
+ },
295
+ "val_mean_R": 59.4
296
+ },
297
+ {
298
+ "epoch": 7,
299
+ "loss": 0.4140009465627372,
300
+ "sec": 9.6,
301
+ "logit_scale": 30.88,
302
+ "val": {
303
+ "eng": {
304
+ "n": 809,
305
+ "i2t_R@1": 46.23,
306
+ "t2i_R@1": 46.48,
307
+ "i2t_R@5": 77.87,
308
+ "t2i_R@5": 75.65,
309
+ "i2t_R@10": 87.89,
310
+ "t2i_R@10": 86.65,
311
+ "mean_R": 70.13
312
+ },
313
+ "ibo": {
314
+ "n": 742,
315
+ "i2t_R@1": 35.98,
316
+ "t2i_R@1": 37.6,
317
+ "i2t_R@5": 72.78,
318
+ "t2i_R@5": 71.16,
319
+ "i2t_R@10": 82.88,
320
+ "t2i_R@10": 81.54,
321
+ "mean_R": 63.66
322
+ },
323
+ "hau": {
324
+ "n": 770,
325
+ "i2t_R@1": 30.65,
326
+ "t2i_R@1": 30.78,
327
+ "i2t_R@5": 63.25,
328
+ "t2i_R@5": 64.68,
329
+ "i2t_R@10": 74.94,
330
+ "t2i_R@10": 75.06,
331
+ "mean_R": 56.56
332
+ },
333
+ "yor": {
334
+ "n": 764,
335
+ "i2t_R@1": 24.35,
336
+ "t2i_R@1": 23.69,
337
+ "i2t_R@5": 57.07,
338
+ "t2i_R@5": 56.15,
339
+ "i2t_R@10": 68.32,
340
+ "t2i_R@10": 68.32,
341
+ "mean_R": 49.65
342
+ }
343
+ },
344
+ "val_mean_R": 60.0
345
+ },
346
+ {
347
+ "epoch": 8,
348
+ "loss": 0.35873290702390176,
349
+ "sec": 9.7,
350
+ "logit_scale": 32.71,
351
+ "val": {
352
+ "eng": {
353
+ "n": 809,
354
+ "i2t_R@1": 44.38,
355
+ "t2i_R@1": 44.75,
356
+ "i2t_R@5": 76.64,
357
+ "t2i_R@5": 74.41,
358
+ "i2t_R@10": 86.53,
359
+ "t2i_R@10": 85.78,
360
+ "mean_R": 68.75
361
+ },
362
+ "ibo": {
363
+ "n": 742,
364
+ "i2t_R@1": 38.68,
365
+ "t2i_R@1": 38.27,
366
+ "i2t_R@5": 70.75,
367
+ "t2i_R@5": 70.49,
368
+ "i2t_R@10": 81.54,
369
+ "t2i_R@10": 80.32,
370
+ "mean_R": 63.34
371
+ },
372
+ "hau": {
373
+ "n": 770,
374
+ "i2t_R@1": 30.91,
375
+ "t2i_R@1": 30.78,
376
+ "i2t_R@5": 61.43,
377
+ "t2i_R@5": 62.21,
378
+ "i2t_R@10": 73.12,
379
+ "t2i_R@10": 74.68,
380
+ "mean_R": 55.52
381
+ },
382
+ "yor": {
383
+ "n": 764,
384
+ "i2t_R@1": 25.26,
385
+ "t2i_R@1": 25.92,
386
+ "i2t_R@5": 54.45,
387
+ "t2i_R@5": 54.84,
388
+ "i2t_R@10": 66.75,
389
+ "t2i_R@10": 67.15,
390
+ "mean_R": 49.06
391
+ }
392
+ },
393
+ "val_mean_R": 59.17
394
+ },
395
+ {
396
+ "epoch": 9,
397
+ "loss": 0.3211887921206653,
398
+ "sec": 9.6,
399
+ "logit_scale": 34.37,
400
+ "val": {
401
+ "eng": {
402
+ "n": 809,
403
+ "i2t_R@1": 44.5,
404
+ "t2i_R@1": 44.0,
405
+ "i2t_R@5": 76.89,
406
+ "t2i_R@5": 76.14,
407
+ "i2t_R@10": 86.03,
408
+ "t2i_R@10": 86.4,
409
+ "mean_R": 68.99
410
+ },
411
+ "ibo": {
412
+ "n": 742,
413
+ "i2t_R@1": 37.74,
414
+ "t2i_R@1": 38.14,
415
+ "i2t_R@5": 70.75,
416
+ "t2i_R@5": 70.75,
417
+ "i2t_R@10": 81.81,
418
+ "t2i_R@10": 81.81,
419
+ "mean_R": 63.5
420
+ },
421
+ "hau": {
422
+ "n": 770,
423
+ "i2t_R@1": 32.21,
424
+ "t2i_R@1": 29.48,
425
+ "i2t_R@5": 61.17,
426
+ "t2i_R@5": 63.51,
427
+ "i2t_R@10": 75.32,
428
+ "t2i_R@10": 74.94,
429
+ "mean_R": 56.1
430
+ },
431
+ "yor": {
432
+ "n": 764,
433
+ "i2t_R@1": 25.92,
434
+ "t2i_R@1": 25.26,
435
+ "i2t_R@5": 56.15,
436
+ "t2i_R@5": 54.06,
437
+ "i2t_R@10": 67.41,
438
+ "t2i_R@10": 67.41,
439
+ "mean_R": 49.37
440
+ }
441
+ },
442
+ "val_mean_R": 59.49
443
+ },
444
+ {
445
+ "epoch": 10,
446
+ "loss": 0.28735482529737055,
447
+ "sec": 9.9,
448
+ "logit_scale": 35.84,
449
+ "val": {
450
+ "eng": {
451
+ "n": 809,
452
+ "i2t_R@1": 45.49,
453
+ "t2i_R@1": 45.36,
454
+ "i2t_R@5": 76.27,
455
+ "t2i_R@5": 76.76,
456
+ "i2t_R@10": 85.91,
457
+ "t2i_R@10": 85.91,
458
+ "mean_R": 69.28
459
+ },
460
+ "ibo": {
461
+ "n": 742,
462
+ "i2t_R@1": 36.66,
463
+ "t2i_R@1": 37.33,
464
+ "i2t_R@5": 70.62,
465
+ "t2i_R@5": 69.95,
466
+ "i2t_R@10": 81.94,
467
+ "t2i_R@10": 81.4,
468
+ "mean_R": 62.98
469
+ },
470
+ "hau": {
471
+ "n": 770,
472
+ "i2t_R@1": 31.95,
473
+ "t2i_R@1": 30.78,
474
+ "i2t_R@5": 62.73,
475
+ "t2i_R@5": 63.51,
476
+ "i2t_R@10": 73.64,
477
+ "t2i_R@10": 74.29,
478
+ "mean_R": 56.15
479
+ },
480
+ "yor": {
481
+ "n": 764,
482
+ "i2t_R@1": 26.31,
483
+ "t2i_R@1": 25.0,
484
+ "i2t_R@5": 54.06,
485
+ "t2i_R@5": 52.36,
486
+ "i2t_R@10": 65.97,
487
+ "t2i_R@10": 66.62,
488
+ "mean_R": 48.39
489
+ }
490
+ },
491
+ "val_mean_R": 59.2
492
+ },
493
+ {
494
+ "epoch": 11,
495
+ "loss": 0.2505949118640274,
496
+ "sec": 9.7,
497
+ "logit_scale": 37.15,
498
+ "val": {
499
+ "eng": {
500
+ "n": 809,
501
+ "i2t_R@1": 44.75,
502
+ "t2i_R@1": 44.0,
503
+ "i2t_R@5": 75.9,
504
+ "t2i_R@5": 75.15,
505
+ "i2t_R@10": 85.04,
506
+ "t2i_R@10": 85.54,
507
+ "mean_R": 68.4
508
+ },
509
+ "ibo": {
510
+ "n": 742,
511
+ "i2t_R@1": 35.04,
512
+ "t2i_R@1": 35.31,
513
+ "i2t_R@5": 69.41,
514
+ "t2i_R@5": 68.33,
515
+ "i2t_R@10": 81.81,
516
+ "t2i_R@10": 81.27,
517
+ "mean_R": 61.86
518
+ },
519
+ "hau": {
520
+ "n": 770,
521
+ "i2t_R@1": 31.04,
522
+ "t2i_R@1": 29.09,
523
+ "i2t_R@5": 60.13,
524
+ "t2i_R@5": 60.78,
525
+ "i2t_R@10": 73.38,
526
+ "t2i_R@10": 73.25,
527
+ "mean_R": 54.61
528
+ },
529
+ "yor": {
530
+ "n": 764,
531
+ "i2t_R@1": 26.57,
532
+ "t2i_R@1": 24.48,
533
+ "i2t_R@5": 52.23,
534
+ "t2i_R@5": 51.83,
535
+ "i2t_R@10": 65.71,
536
+ "t2i_R@10": 66.62,
537
+ "mean_R": 47.91
538
+ }
539
+ },
540
+ "val_mean_R": 58.2
541
+ },
542
+ {
543
+ "epoch": 12,
544
+ "loss": 0.22653604112565517,
545
+ "sec": 9.7,
546
+ "logit_scale": 38.25,
547
+ "val": {
548
+ "eng": {
549
+ "n": 809,
550
+ "i2t_R@1": 43.51,
551
+ "t2i_R@1": 43.14,
552
+ "i2t_R@5": 75.4,
553
+ "t2i_R@5": 74.66,
554
+ "i2t_R@10": 86.16,
555
+ "t2i_R@10": 84.43,
556
+ "mean_R": 67.88
557
+ },
558
+ "ibo": {
559
+ "n": 742,
560
+ "i2t_R@1": 34.5,
561
+ "t2i_R@1": 36.79,
562
+ "i2t_R@5": 69.95,
563
+ "t2i_R@5": 69.27,
564
+ "i2t_R@10": 80.32,
565
+ "t2i_R@10": 80.19,
566
+ "mean_R": 61.84
567
+ },
568
+ "hau": {
569
+ "n": 770,
570
+ "i2t_R@1": 32.73,
571
+ "t2i_R@1": 30.39,
572
+ "i2t_R@5": 60.26,
573
+ "t2i_R@5": 61.43,
574
+ "i2t_R@10": 72.73,
575
+ "t2i_R@10": 73.64,
576
+ "mean_R": 55.2
577
+ },
578
+ "yor": {
579
+ "n": 764,
580
+ "i2t_R@1": 28.14,
581
+ "t2i_R@1": 24.21,
582
+ "i2t_R@5": 53.14,
583
+ "t2i_R@5": 52.88,
584
+ "i2t_R@10": 65.45,
585
+ "t2i_R@10": 67.41,
586
+ "mean_R": 48.54
587
+ }
588
+ },
589
+ "val_mean_R": 58.37
590
+ },
591
+ {
592
+ "epoch": 13,
593
+ "loss": 0.20553195266984403,
594
+ "sec": 9.6,
595
+ "logit_scale": 39.17,
596
+ "val": {
597
+ "eng": {
598
+ "n": 809,
599
+ "i2t_R@1": 45.24,
600
+ "t2i_R@1": 44.0,
601
+ "i2t_R@5": 74.41,
602
+ "t2i_R@5": 73.79,
603
+ "i2t_R@10": 84.8,
604
+ "t2i_R@10": 84.3,
605
+ "mean_R": 67.76
606
+ },
607
+ "ibo": {
608
+ "n": 742,
609
+ "i2t_R@1": 35.98,
610
+ "t2i_R@1": 36.25,
611
+ "i2t_R@5": 69.68,
612
+ "t2i_R@5": 69.14,
613
+ "i2t_R@10": 81.94,
614
+ "t2i_R@10": 80.73,
615
+ "mean_R": 62.29
616
+ },
617
+ "hau": {
618
+ "n": 770,
619
+ "i2t_R@1": 32.99,
620
+ "t2i_R@1": 29.74,
621
+ "i2t_R@5": 61.3,
622
+ "t2i_R@5": 60.65,
623
+ "i2t_R@10": 74.16,
624
+ "t2i_R@10": 74.42,
625
+ "mean_R": 55.54
626
+ },
627
+ "yor": {
628
+ "n": 764,
629
+ "i2t_R@1": 27.09,
630
+ "t2i_R@1": 25.52,
631
+ "i2t_R@5": 54.32,
632
+ "t2i_R@5": 52.88,
633
+ "i2t_R@10": 66.23,
634
+ "t2i_R@10": 66.88,
635
+ "mean_R": 48.82
636
+ }
637
+ },
638
+ "val_mean_R": 58.6
639
+ },
640
+ {
641
+ "epoch": 14,
642
+ "loss": 0.18276729714125395,
643
+ "sec": 9.6,
644
+ "logit_scale": 39.98,
645
+ "val": {
646
+ "eng": {
647
+ "n": 809,
648
+ "i2t_R@1": 43.14,
649
+ "t2i_R@1": 42.15,
650
+ "i2t_R@5": 73.92,
651
+ "t2i_R@5": 74.66,
652
+ "i2t_R@10": 84.43,
653
+ "t2i_R@10": 84.05,
654
+ "mean_R": 67.06
655
+ },
656
+ "ibo": {
657
+ "n": 742,
658
+ "i2t_R@1": 37.47,
659
+ "t2i_R@1": 36.93,
660
+ "i2t_R@5": 69.27,
661
+ "t2i_R@5": 69.54,
662
+ "i2t_R@10": 81.67,
663
+ "t2i_R@10": 80.32,
664
+ "mean_R": 62.53
665
+ },
666
+ "hau": {
667
+ "n": 770,
668
+ "i2t_R@1": 31.69,
669
+ "t2i_R@1": 29.22,
670
+ "i2t_R@5": 60.91,
671
+ "t2i_R@5": 61.95,
672
+ "i2t_R@10": 73.51,
673
+ "t2i_R@10": 74.03,
674
+ "mean_R": 55.22
675
+ },
676
+ "yor": {
677
+ "n": 764,
678
+ "i2t_R@1": 26.7,
679
+ "t2i_R@1": 25.26,
680
+ "i2t_R@5": 55.1,
681
+ "t2i_R@5": 52.09,
682
+ "i2t_R@10": 65.45,
683
+ "t2i_R@10": 66.1,
684
+ "mean_R": 48.45
685
+ }
686
+ },
687
+ "val_mean_R": 58.31
688
+ },
689
+ {
690
+ "epoch": 15,
691
+ "loss": 0.16345966514199972,
692
+ "sec": 9.5,
693
+ "logit_scale": 40.63,
694
+ "val": {
695
+ "eng": {
696
+ "n": 809,
697
+ "i2t_R@1": 43.14,
698
+ "t2i_R@1": 43.39,
699
+ "i2t_R@5": 75.28,
700
+ "t2i_R@5": 74.41,
701
+ "i2t_R@10": 85.54,
702
+ "t2i_R@10": 84.43,
703
+ "mean_R": 67.7
704
+ },
705
+ "ibo": {
706
+ "n": 742,
707
+ "i2t_R@1": 36.52,
708
+ "t2i_R@1": 36.25,
709
+ "i2t_R@5": 70.08,
710
+ "t2i_R@5": 69.14,
711
+ "i2t_R@10": 82.08,
712
+ "t2i_R@10": 80.59,
713
+ "mean_R": 62.44
714
+ },
715
+ "hau": {
716
+ "n": 770,
717
+ "i2t_R@1": 32.34,
718
+ "t2i_R@1": 29.22,
719
+ "i2t_R@5": 63.25,
720
+ "t2i_R@5": 61.95,
721
+ "i2t_R@10": 73.51,
722
+ "t2i_R@10": 74.55,
723
+ "mean_R": 55.8
724
+ },
725
+ "yor": {
726
+ "n": 764,
727
+ "i2t_R@1": 26.05,
728
+ "t2i_R@1": 25.39,
729
+ "i2t_R@5": 55.5,
730
+ "t2i_R@5": 53.14,
731
+ "i2t_R@10": 66.88,
732
+ "t2i_R@10": 65.84,
733
+ "mean_R": 48.8
734
+ }
735
+ },
736
+ "val_mean_R": 58.69
737
+ },
738
+ {
739
+ "epoch": 16,
740
+ "loss": 0.14981218008324504,
741
+ "sec": 9.6,
742
+ "logit_scale": 41.1,
743
+ "val": {
744
+ "eng": {
745
+ "n": 809,
746
+ "i2t_R@1": 42.52,
747
+ "t2i_R@1": 44.13,
748
+ "i2t_R@5": 75.15,
749
+ "t2i_R@5": 75.15,
750
+ "i2t_R@10": 84.3,
751
+ "t2i_R@10": 84.43,
752
+ "mean_R": 67.61
753
+ },
754
+ "ibo": {
755
+ "n": 742,
756
+ "i2t_R@1": 37.33,
757
+ "t2i_R@1": 36.52,
758
+ "i2t_R@5": 69.95,
759
+ "t2i_R@5": 68.87,
760
+ "i2t_R@10": 81.4,
761
+ "t2i_R@10": 79.78,
762
+ "mean_R": 62.31
763
+ },
764
+ "hau": {
765
+ "n": 770,
766
+ "i2t_R@1": 32.08,
767
+ "t2i_R@1": 30.26,
768
+ "i2t_R@5": 61.56,
769
+ "t2i_R@5": 60.78,
770
+ "i2t_R@10": 74.55,
771
+ "t2i_R@10": 74.94,
772
+ "mean_R": 55.7
773
+ },
774
+ "yor": {
775
+ "n": 764,
776
+ "i2t_R@1": 27.75,
777
+ "t2i_R@1": 25.92,
778
+ "i2t_R@5": 56.02,
779
+ "t2i_R@5": 53.4,
780
+ "i2t_R@10": 66.75,
781
+ "t2i_R@10": 66.62,
782
+ "mean_R": 49.41
783
+ }
784
+ },
785
+ "val_mean_R": 58.76
786
+ },
787
+ {
788
+ "epoch": 17,
789
+ "loss": 0.14285055936003724,
790
+ "sec": 9.8,
791
+ "logit_scale": 41.4,
792
+ "val": {
793
+ "eng": {
794
+ "n": 809,
795
+ "i2t_R@1": 43.14,
796
+ "t2i_R@1": 42.65,
797
+ "i2t_R@5": 75.4,
798
+ "t2i_R@5": 75.53,
799
+ "i2t_R@10": 84.8,
800
+ "t2i_R@10": 84.18,
801
+ "mean_R": 67.62
802
+ },
803
+ "ibo": {
804
+ "n": 742,
805
+ "i2t_R@1": 37.2,
806
+ "t2i_R@1": 37.6,
807
+ "i2t_R@5": 69.68,
808
+ "t2i_R@5": 68.19,
809
+ "i2t_R@10": 81.54,
810
+ "t2i_R@10": 80.19,
811
+ "mean_R": 62.4
812
+ },
813
+ "hau": {
814
+ "n": 770,
815
+ "i2t_R@1": 32.47,
816
+ "t2i_R@1": 30.78,
817
+ "i2t_R@5": 62.08,
818
+ "t2i_R@5": 61.3,
819
+ "i2t_R@10": 74.55,
820
+ "t2i_R@10": 74.55,
821
+ "mean_R": 55.96
822
+ },
823
+ "yor": {
824
+ "n": 764,
825
+ "i2t_R@1": 26.57,
826
+ "t2i_R@1": 25.26,
827
+ "i2t_R@5": 55.63,
828
+ "t2i_R@5": 54.06,
829
+ "i2t_R@10": 67.28,
830
+ "t2i_R@10": 67.28,
831
+ "mean_R": 49.35
832
+ }
833
+ },
834
+ "val_mean_R": 58.83
835
+ },
836
+ {
837
+ "epoch": 18,
838
+ "loss": 0.13162445152799288,
839
+ "sec": 10.0,
840
+ "logit_scale": 41.57,
841
+ "val": {
842
+ "eng": {
843
+ "n": 809,
844
+ "i2t_R@1": 42.03,
845
+ "t2i_R@1": 43.39,
846
+ "i2t_R@5": 74.91,
847
+ "t2i_R@5": 75.28,
848
+ "i2t_R@10": 85.17,
849
+ "t2i_R@10": 84.67,
850
+ "mean_R": 67.58
851
+ },
852
+ "ibo": {
853
+ "n": 742,
854
+ "i2t_R@1": 36.52,
855
+ "t2i_R@1": 36.66,
856
+ "i2t_R@5": 69.14,
857
+ "t2i_R@5": 69.54,
858
+ "i2t_R@10": 80.86,
859
+ "t2i_R@10": 79.92,
860
+ "mean_R": 62.11
861
+ },
862
+ "hau": {
863
+ "n": 770,
864
+ "i2t_R@1": 32.6,
865
+ "t2i_R@1": 30.0,
866
+ "i2t_R@5": 61.95,
867
+ "t2i_R@5": 61.17,
868
+ "i2t_R@10": 74.29,
869
+ "t2i_R@10": 74.42,
870
+ "mean_R": 55.74
871
+ },
872
+ "yor": {
873
+ "n": 764,
874
+ "i2t_R@1": 26.57,
875
+ "t2i_R@1": 25.39,
876
+ "i2t_R@5": 55.76,
877
+ "t2i_R@5": 53.8,
878
+ "i2t_R@10": 67.28,
879
+ "t2i_R@10": 66.49,
880
+ "mean_R": 49.22
881
+ }
882
+ },
883
+ "val_mean_R": 58.66
884
+ },
885
+ {
886
+ "epoch": 19,
887
+ "loss": 0.13018665796456239,
888
+ "sec": 9.8,
889
+ "logit_scale": 41.64,
890
+ "val": {
891
+ "eng": {
892
+ "n": 809,
893
+ "i2t_R@1": 43.26,
894
+ "t2i_R@1": 43.51,
895
+ "i2t_R@5": 75.4,
896
+ "t2i_R@5": 75.15,
897
+ "i2t_R@10": 85.54,
898
+ "t2i_R@10": 85.04,
899
+ "mean_R": 67.98
900
+ },
901
+ "ibo": {
902
+ "n": 742,
903
+ "i2t_R@1": 37.47,
904
+ "t2i_R@1": 37.2,
905
+ "i2t_R@5": 70.08,
906
+ "t2i_R@5": 69.41,
907
+ "i2t_R@10": 81.54,
908
+ "t2i_R@10": 79.92,
909
+ "mean_R": 62.6
910
+ },
911
+ "hau": {
912
+ "n": 770,
913
+ "i2t_R@1": 31.95,
914
+ "t2i_R@1": 30.39,
915
+ "i2t_R@5": 61.82,
916
+ "t2i_R@5": 61.3,
917
+ "i2t_R@10": 74.29,
918
+ "t2i_R@10": 74.42,
919
+ "mean_R": 55.7
920
+ },
921
+ "yor": {
922
+ "n": 764,
923
+ "i2t_R@1": 27.09,
924
+ "t2i_R@1": 25.65,
925
+ "i2t_R@5": 56.15,
926
+ "t2i_R@5": 53.93,
927
+ "i2t_R@10": 67.28,
928
+ "t2i_R@10": 67.02,
929
+ "mean_R": 49.52
930
+ }
931
+ },
932
+ "val_mean_R": 58.95
933
+ },
934
+ {
935
+ "epoch": 20,
936
+ "loss": 0.12976117172123244,
937
+ "sec": 9.8,
938
+ "logit_scale": 41.65,
939
+ "val": {
940
+ "eng": {
941
+ "n": 809,
942
+ "i2t_R@1": 42.89,
943
+ "t2i_R@1": 43.51,
944
+ "i2t_R@5": 75.65,
945
+ "t2i_R@5": 75.15,
946
+ "i2t_R@10": 85.54,
947
+ "t2i_R@10": 85.04,
948
+ "mean_R": 67.96
949
+ },
950
+ "ibo": {
951
+ "n": 742,
952
+ "i2t_R@1": 37.06,
953
+ "t2i_R@1": 37.2,
954
+ "i2t_R@5": 69.95,
955
+ "t2i_R@5": 69.54,
956
+ "i2t_R@10": 81.67,
957
+ "t2i_R@10": 80.19,
958
+ "mean_R": 62.6
959
+ },
960
+ "hau": {
961
+ "n": 770,
962
+ "i2t_R@1": 32.47,
963
+ "t2i_R@1": 30.13,
964
+ "i2t_R@5": 61.95,
965
+ "t2i_R@5": 61.04,
966
+ "i2t_R@10": 74.42,
967
+ "t2i_R@10": 74.42,
968
+ "mean_R": 55.74
969
+ },
970
+ "yor": {
971
+ "n": 764,
972
+ "i2t_R@1": 26.96,
973
+ "t2i_R@1": 25.39,
974
+ "i2t_R@5": 55.89,
975
+ "t2i_R@5": 54.06,
976
+ "i2t_R@10": 67.67,
977
+ "t2i_R@10": 67.02,
978
+ "mean_R": 49.5
979
+ }
980
+ },
981
+ "val_mean_R": 58.95
982
+ }
983
+ ],
984
+ "best_val_mean_R": 60.352500000000006
985
+ }
search.py ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Text -> image search with a trained Native-Bird x SigLIP alignment checkpoint.
2
+
3
+ python search.py --ckpt runs/native_bird/best.pt "Nkịta na-agba ọsọ n'ahịhịa" "A dog running on grass" -k 5
4
+ python search.py --ckpt runs/native_bird/best.pt --split test --json out.json "query 1" "query 2"
5
+
6
+ The gallery is every image of --split (default test, 809 images). Image features come from the same frozen
7
+ image encoder the checkpoint was trained with (cached in data/features/, computed on first use; needs the
8
+ Flickr8k images at data.image_dir). Works on CPU or GPU.
9
+ """
10
+ import argparse, json, os, torch
11
+ from nbmm.common import (seed_all, pick_device, load_split, image_features, text_features, load_sentence_model,
12
+ text_arm, TrainableText, AlignModel, rel, _set)
13
+
14
+
15
+ class Searcher:
16
+ def __init__(self, ckpt, split="test", device="auto", overrides=()):
17
+ ck = torch.load(rel(ckpt), map_location="cpu", weights_only=False)
18
+ self.cfg = cfg = ck["cfg"]
19
+ for o in overrides:
20
+ k, v = o.split("=", 1); _set(cfg, k, v)
21
+ seed_all(cfg["seed"])
22
+ self.dev = pick_device(device)
23
+ self.df = load_split(cfg, split)
24
+ self.ids = self.df.image_id.tolist()
25
+ I = image_features(cfg, self.df, split, self.dev)
26
+ self.model = AlignModel(ck["d_img"], ck["d_txt"], cfg).to(self.dev).eval()
27
+ self.model.load_state_dict(ck["model"])
28
+ self.unfreeze = cfg["text_encoder"]["unfreeze_last_n_layers"] > 0
29
+ if self.unfreeze:
30
+ self.txt = TrainableText(cfg, self.dev).to(self.dev).eval()
31
+ self.txt.load_state_dict(ck["text_trainable"], strict=False)
32
+ else:
33
+ self.arm = text_arm(cfg)
34
+ self.st = load_sentence_model(self.arm, self.dev)
35
+ with torch.no_grad():
36
+ self.zi = self.model.img(I.to(self.dev))
37
+
38
+ @torch.no_grad()
39
+ def embed_text(self, texts):
40
+ if self.unfreeze:
41
+ e = self.txt(texts)
42
+ else:
43
+ e = self.st.encode([self.arm.get("prompt", "") + t for t in texts], convert_to_tensor=True,
44
+ normalize_embeddings=True).float().to(self.dev)
45
+ return self.model.txt(e)
46
+
47
+ @torch.no_grad()
48
+ def search(self, texts, k=5):
49
+ sims = self.embed_text(texts) @ self.zi.t()
50
+ out = []
51
+ for t, row in zip(texts, sims):
52
+ order = row.argsort(descending=True)
53
+ top = order[:k].tolist()
54
+ out.append({"query": t, "top": [{"image_id": self.ids[j], "score": round(row[j].item(), 4)} for j in top],
55
+ "_order": order})
56
+ return out
57
+
58
+ def rank_of(self, res, image_id):
59
+ j = self.ids.index(image_id)
60
+ return int((res["_order"] == j).nonzero()[0].item()) + 1 # 1-based
61
+
62
+
63
+ def main():
64
+ ap = argparse.ArgumentParser()
65
+ ap.add_argument("--ckpt", required=True)
66
+ ap.add_argument("--split", default="test")
67
+ ap.add_argument("-k", type=int, default=5)
68
+ ap.add_argument("--json", default=None)
69
+ ap.add_argument("queries", nargs="+")
70
+ a = ap.parse_args()
71
+ s = Searcher(a.ckpt, a.split)
72
+ res = s.search(a.queries, a.k)
73
+ for r in res:
74
+ r.pop("_order")
75
+ print(r["query"])
76
+ for i, h in enumerate(r["top"], 1):
77
+ print(f" {i}. {h['image_id']} {h['score']}")
78
+ if a.json:
79
+ json.dump(res, open(a.json, "w"), indent=2, ensure_ascii=False)
80
+
81
+
82
+ if __name__ == "__main__":
83
+ main()