Gregor commited on
Commit
7eacff5
β€’
1 Parent(s): 0ebc51e
.gitattributes CHANGED
@@ -33,3 +33,5 @@ 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
+ data/precomputed_results.json filter=lfs diff=lfs merge=lfs -text
37
+ precomputed_results.json filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -56,14 +56,15 @@ def change_language(lang, randomize_imgs, randomize_labels):
56
  text_features = None
57
  correct_text = gr.Text(f"Correct was: ''. Question 1/{len(babel_imagenet[lang][0])} ", label="Game")
58
  player_score_text = gr.Text(f"Your choice: (Score: 0) ", label="Player")
59
- clip_score_text = gr.Text(f"CLIP chose: '' (Score: 0)", label="CLIP")
60
 
61
  return text_features, -1, class_order, correct_text, player_score_text, clip_score_text, 0, 0
62
 
63
- def select(idx, lang, choice, correct, model_choice, player_score, clip_score):
64
  # checks if answer choice is correct and updated scores
65
  correct_name, correct_value = correct
66
  model_choice_name, model_choice_value = model_choice
 
67
 
68
  player_correct = choice == correct_value
69
  model_correct = model_choice_value == correct_value
@@ -72,8 +73,8 @@ def select(idx, lang, choice, correct, model_choice, player_score, clip_score):
72
  clip_score = clip_score + int(model_correct)
73
 
74
  correct_text = gr.Text(f"Correct was: '{correct_name}'. Question {idx+1}/{len(babel_imagenet[lang][0])} ", label="Game")
75
- player_score_text = gr.Text(f"Your choice: {'βœ…' if player_correct else '❌'} (Score: {player_score}) ", label="Player")
76
- clip_score_text = gr.Text(f"CLIP chose: '{model_choice_name}' {'βœ…' if model_correct else '❌'} (Score: {clip_score})", label="CLIP")
77
 
78
  return correct_text, player_score_text, clip_score_text, player_score, clip_score
79
 
@@ -131,9 +132,57 @@ def prepare(raw_idx, lang, text_embeddings, class_order, randomize_images):
131
  next_radio = gr.Radio(choices=choice_values, interactive=True, label="Select the correct answer:", value=None)
132
  next_image = gr.Image(value=img_url, width=IMG_WIDTH, height=IMG_WIDTH, label="What class does this image belong to?")
133
 
134
- return next_radio, next_image, raw_idx, correct_choice, model_choice
135
 
136
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
 
138
  with (gr.Blocks(title="Babel-ImageNet Quiz") as demo):
139
 
@@ -142,6 +191,7 @@ with (gr.Blocks(title="Babel-ImageNet Quiz") as demo):
142
  player_score = gr.State(0)
143
  clip_score = gr.State(0)
144
  class_order = gr.State([])
 
145
 
146
  text_embeddings = gr.State(None)
147
  correct_choice = gr.State(["nan", 0]) # 0, 1, 2, 3
@@ -153,7 +203,7 @@ with (gr.Blocks(title="Babel-ImageNet Quiz") as demo):
153
 
154
  <small>by Gregor Geigle, WΓΌNLP & Computer Vision Lab, University of WΓΌrzburg</small>
155
 
156
- In this quiz, you play against a CLIP model and try to correctly classify the images over the 1000 ImageNet classes (in English) or over our (partial) Babel-ImageNet translations of those classes.
157
  Select your language, click 'Start' and start guessing! We'll keep track of your score and of your opponent's.
158
  > **Disclaimer:** Translations and images are derived automatically and can be wrong, unusual, or mismatch! This is supposed to be a fun game to explore the dataset and see how a CLIP model would answer the questions and not a product.
159
  > We do *not* use the official ImageNet images. Instead, we use images linked in BabelNet for each class, which are often from Wikipedia and have not been checked for suitability.
@@ -164,7 +214,7 @@ Select your language, click 'Start' and start guessing! We'll keep track of your
164
  <summary> <b> FAQ</b> (click me to read)</summary>
165
  <p><b>'Over 1000 classes? I just see 4.'</b> True, you have it easier and you only have to chose between 4 classes. These are the top-4 picks of your opponent (+ the correct class if they are wrong). Your opponent has it harder: they have to deal with all classes.</p>
166
  <p><b>'Who is my opponent?'</b> Your opponent CLIP model is [mSigLIP](https://huggingface.co/timm/ViT-B-16-SigLIP-i18n-256), a powerful but small multilingual model with only 370M parameters.</p>
167
- <p><b>'My game crashed/ I got an error!'</b> This usually happens because of problems with the image URLs. Unfortunately, there is nothing you can do except start a new round by clicking the 'Start' button.</p>
168
  </details>
169
  """)
170
  with gr.Row():
@@ -177,7 +227,7 @@ Select your language, click 'Start' and start guessing! We'll keep track of your
177
  With CLIP, you can search through, filter, or group large image datasets. The image encoder in CLIP also powers many of the large vision language models like Llava 1.5!
178
  </p>
179
  <p>
180
- Your opponent CLIP model in this quiz does 'zero-shot image classification': We encode all possible class labels and the image and we check which class is most similar; this is then the class chosen by CLIP.
181
  </p>
182
  </details>
183
  """)
@@ -209,8 +259,8 @@ Select your language, click 'Start' and start guessing! We'll keep track of your
209
  # language select dropdown
210
  with gr.Row():
211
  language_select = gr.Dropdown(choices=main_language_values, value="EN", interactive=True, label="Select your language:")
212
- randomize_classes = gr.Checkbox(label="Randomize class order (or play in canonic order)")
213
- randomize_images = gr.Checkbox(label="Randomize images (if unchecked, will always show the same image). Other images might be less relevant.")
214
  start_btn = gr.Button(value="Start", variant="primary")
215
 
216
  # quiz area
@@ -224,26 +274,29 @@ Select your language, click 'Start' and start guessing! We'll keep track of your
224
  # with gr.Row():
225
  correct_text = gr.Text("Please click start to begin.")
226
  player_score_text = gr.Text(f"Player score: 0")
227
- clip_score_text = gr.Text(f"CLIP score: 0")
228
-
229
 
230
- # Explanation area
231
 
232
 
233
 
234
  options.select(fn=select,
235
- inputs=[class_idx, language_select, options, correct_choice, model_choice, player_score, clip_score],
236
  outputs=[correct_text, player_score_text, clip_score_text, player_score, clip_score]
237
  ).then(fn=prepare,
238
  inputs=[class_idx, language_select, text_embeddings, class_order, randomize_images],
239
- outputs=[options, image, class_idx, correct_choice, model_choice])
240
 
241
  start_btn.click(fn=change_language,
242
  inputs=[language_select, randomize_images, randomize_classes],
243
  outputs=[text_embeddings, class_idx, class_order, correct_text, player_score_text, clip_score_text, player_score, clip_score]
244
  ).then(fn=prepare,
245
  inputs=[class_idx, language_select, text_embeddings, class_order, randomize_images],
246
- outputs=[options, image, class_idx, correct_choice, model_choice])
 
 
 
 
247
 
248
  # initialization
249
  # demo.load(fn=change_language,
 
56
  text_features = None
57
  correct_text = gr.Text(f"Correct was: ''. Question 1/{len(babel_imagenet[lang][0])} ", label="Game")
58
  player_score_text = gr.Text(f"Your choice: (Score: 0) ", label="Player")
59
+ clip_score_text = gr.Text(f"mSigLIP chose: '' (Score: 0)", label="Opponent")
60
 
61
  return text_features, -1, class_order, correct_text, player_score_text, clip_score_text, 0, 0
62
 
63
+ def select(idx, lang, choice, correct, model_choice, player_score, clip_score, choices):
64
  # checks if answer choice is correct and updated scores
65
  correct_name, correct_value = correct
66
  model_choice_name, model_choice_value = model_choice
67
+ player_choice = choices[choice][0]
68
 
69
  player_correct = choice == correct_value
70
  model_correct = model_choice_value == correct_value
 
73
  clip_score = clip_score + int(model_correct)
74
 
75
  correct_text = gr.Text(f"Correct was: '{correct_name}'. Question {idx+1}/{len(babel_imagenet[lang][0])} ", label="Game")
76
+ player_score_text = gr.Text(f"Your choice: {player_choice} {'βœ…' if player_correct else '❌'} (Score: {player_score}) ", label="Player")
77
+ clip_score_text = gr.Text(f"mSigLIP chose: '{model_choice_name}' {'βœ…' if model_correct else '❌'} (Score: {clip_score})", label="Opponent")
78
 
79
  return correct_text, player_score_text, clip_score_text, player_score, clip_score
80
 
 
132
  next_radio = gr.Radio(choices=choice_values, interactive=True, label="Select the correct answer:", value=None)
133
  next_image = gr.Image(value=img_url, width=IMG_WIDTH, height=IMG_WIDTH, label="What class does this image belong to?")
134
 
135
+ return next_radio, next_image, raw_idx, correct_choice, model_choice, choice_values
136
 
137
 
138
+ def reroll(raw_idx, lang, text_embeddings, class_order, randomize_images):
139
+ # prepared next question, loads image, and computes choices
140
+
141
+ idx = class_order[raw_idx]
142
+ lang_class_idxs = babel_imagenet[lang][0]
143
+ class_idx = lang_class_idxs[idx]
144
+
145
+ img_idx = 0
146
+ if randomize_images:
147
+ img_idx = np.random.choice(len(babelnet_images[class_idx]))
148
+ img_url = babelnet_images[class_idx][img_idx]["url"]
149
+ class_labels = babel_imagenet[lang][1] if lang != "EN" else openai_en_classes
150
+
151
+ if not precomputed_results:
152
+ try:
153
+ image_input = transform(Image.open(requests.get(img_url, stream=True, headers=request_header).raw).convert("RGB")).unsqueeze(0).to(device)
154
+ with torch.no_grad():
155
+ image_features = model.encode_image(image_input).float()
156
+ image_features /= image_features.norm(dim=-1, keepdim=True)
157
+ except:
158
+ gr.Warning("There is a problem with the next class. Skipping it.")
159
+ return prepare(raw_idx, lang, text_embeddings, class_order, randomize_images)
160
+
161
+ similarity = (text_embeddings @ image_features.cpu().numpy().T).squeeze()
162
+ choices = np.argsort(similarity)[-4:].tolist()
163
+ else:
164
+ choices = list(reversed(precomputed_results[lang][idx][img_idx])) # precomputing script uses torch.topk which sorts in reverse here
165
+ if idx not in choices:
166
+ choices = [idx] + choices[1:]
167
+ model_choice_idx = choices[-1]
168
+
169
+ numpy.random.shuffle(choices)
170
+
171
+ choice_names = [class_labels[idx] for idx in choices]
172
+ choice_values = [0, 1, 2, 3]
173
+
174
+ model_choice_idx = choices.index(model_choice_idx)
175
+ model_choice = [choice_names[model_choice_idx], choice_values[model_choice_idx]]
176
+ correct_choice_idx = choices.index(idx)
177
+ correct_choice = [choice_names[correct_choice_idx], choice_values[correct_choice_idx]]
178
+
179
+ choice_values = list(zip(choice_names, choice_values))
180
+
181
+ next_radio = gr.Radio(choices=choice_values, interactive=True, label="Select the correct answer:", value=None)
182
+ next_image = gr.Image(value=img_url, width=IMG_WIDTH, height=IMG_WIDTH, label="What class does this image belong to?")
183
+
184
+ return next_radio, next_image, raw_idx, correct_choice, model_choice, choice_values
185
+
186
 
187
  with (gr.Blocks(title="Babel-ImageNet Quiz") as demo):
188
 
 
191
  player_score = gr.State(0)
192
  clip_score = gr.State(0)
193
  class_order = gr.State([])
194
+ choices = gr.State([])
195
 
196
  text_embeddings = gr.State(None)
197
  correct_choice = gr.State(["nan", 0]) # 0, 1, 2, 3
 
203
 
204
  <small>by Gregor Geigle, WΓΌNLP & Computer Vision Lab, University of WΓΌrzburg</small>
205
 
206
+ In this quiz, you play against a CLIP model (specifically: [mSigLIP](https://huggingface.co/timm/ViT-B-16-SigLIP-i18n-256), a multilingual [SigLIP](https://arxiv.org/abs/2303.15343) model) and try to correctly classify the images over the 1000 ImageNet classes (in English) or over our (partial) Babel-ImageNet translations of those classes.
207
  Select your language, click 'Start' and start guessing! We'll keep track of your score and of your opponent's.
208
  > **Disclaimer:** Translations and images are derived automatically and can be wrong, unusual, or mismatch! This is supposed to be a fun game to explore the dataset and see how a CLIP model would answer the questions and not a product.
209
  > We do *not* use the official ImageNet images. Instead, we use images linked in BabelNet for each class, which are often from Wikipedia and have not been checked for suitability.
 
214
  <summary> <b> FAQ</b> (click me to read)</summary>
215
  <p><b>'Over 1000 classes? I just see 4.'</b> True, you have it easier and you only have to chose between 4 classes. These are the top-4 picks of your opponent (+ the correct class if they are wrong). Your opponent has it harder: they have to deal with all classes.</p>
216
  <p><b>'Who is my opponent?'</b> Your opponent CLIP model is [mSigLIP](https://huggingface.co/timm/ViT-B-16-SigLIP-i18n-256), a powerful but small multilingual model with only 370M parameters.</p>
217
+ <p><b>'My game crashed/ I got an error!'</b> This usually happens because of problems with the image URLs. You can try the button to reroll the image or start a new round by clicking the 'Start' button again.</p>
218
  </details>
219
  """)
220
  with gr.Row():
 
227
  With CLIP, you can search through, filter, or group large image datasets. The image encoder in CLIP also powers many of the large vision language models like Llava 1.5!
228
  </p>
229
  <p>
230
+ Your opponent CLIP model [mSigLIP](https://arxiv.org/abs/2303.15343) in this quiz does 'zero-shot image classification': We encode all possible class labels and the image and we check which class is most similar; this is then the class chosen by CLIP.
231
  </p>
232
  </details>
233
  """)
 
259
  # language select dropdown
260
  with gr.Row():
261
  language_select = gr.Dropdown(choices=main_language_values, value="EN", interactive=True, label="Select your language:")
262
+ randomize_classes = gr.Checkbox(label="Randomize class order (or play in canonic order)", value=True)
263
+ randomize_images = gr.Checkbox(label="Randomize images (if unchecked, will always show the same image). Other images might be less relevant.", value=True)
264
  start_btn = gr.Button(value="Start", variant="primary")
265
 
266
  # quiz area
 
274
  # with gr.Row():
275
  correct_text = gr.Text("Please click start to begin.")
276
  player_score_text = gr.Text(f"Player score: 0")
277
+ clip_score_text = gr.Text(f"mSigLIP score: 0")
278
+ reroll_btn = gr.Button(value="Reroll the image (for bad images or errors)")
279
 
 
280
 
281
 
282
 
283
  options.select(fn=select,
284
+ inputs=[class_idx, language_select, options, correct_choice, model_choice, player_score, clip_score, choices],
285
  outputs=[correct_text, player_score_text, clip_score_text, player_score, clip_score]
286
  ).then(fn=prepare,
287
  inputs=[class_idx, language_select, text_embeddings, class_order, randomize_images],
288
+ outputs=[options, image, class_idx, correct_choice, model_choice, choices])
289
 
290
  start_btn.click(fn=change_language,
291
  inputs=[language_select, randomize_images, randomize_classes],
292
  outputs=[text_embeddings, class_idx, class_order, correct_text, player_score_text, clip_score_text, player_score, clip_score]
293
  ).then(fn=prepare,
294
  inputs=[class_idx, language_select, text_embeddings, class_order, randomize_images],
295
+ outputs=[options, image, class_idx, correct_choice, model_choice, choices])
296
+
297
+ reroll_btn.click(fn=reroll,
298
+ inputs=[class_idx, language_select, text_embeddings, class_order, randomize_images],
299
+ outputs=[options, image, class_idx, correct_choice, model_choice, choices])
300
 
301
  # initialization
302
  # demo.load(fn=change_language,
babel_imagenet-298.json ADDED
The diff for this file is too large to render. See raw diff
 
bin_image.png ADDED
data/images.json CHANGED
The diff for this file is too large to render. See raw diff
 
data/precomputed_results.json CHANGED
The diff for this file is too large to render. See raw diff
 
images.json ADDED
The diff for this file is too large to render. See raw diff
 
language_mapping.json ADDED
@@ -0,0 +1,300 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "AB": "Abkhazian",
3
+ "ACW": "Hijazi Arabic",
4
+ "ADY": "Adyghe",
5
+ "AF": "Afrikaans",
6
+ "AFB": "Gulf Arabic",
7
+ "AII": "Assyrian Neo-Aramaic",
8
+ "AK": "Akan",
9
+ "ALS": "Alemannic",
10
+ "ALT": "Southern Altai",
11
+ "AM": "Amharic",
12
+ "AN": "Aragonese",
13
+ "ANG": "Anglo-Saxon",
14
+ "AR": "Arabic",
15
+ "ARC": "Aramaic",
16
+ "ARY": "Moroccan Arabic",
17
+ "ARZ": "Egyptian Arabic",
18
+ "AS": "Assamese",
19
+ "AST": "Asturian",
20
+ "AV": "Avar",
21
+ "AY": "Aymara",
22
+ "AZ": "Azerbaijani",
23
+ "AZB": "South Azerbaijani",
24
+ "BA": "Bashkir",
25
+ "BAN": "Balinese",
26
+ "BAR": "Bavarian",
27
+ "BAT_SMG": "Samogitian",
28
+ "BCL": "Central Bicolano",
29
+ "BE": "Belarusian",
30
+ "BE_X_OLD": "Belarusian (Tara\u0161kievica)",
31
+ "BG": "Bulgarian",
32
+ "BH": "Bihari",
33
+ "BHO": "Bhojpuri",
34
+ "BJN": "Banjar",
35
+ "BM": "Bambara",
36
+ "BN": "Bengali",
37
+ "BO": "Tibetan",
38
+ "BR": "Breton",
39
+ "BS": "Bosnian",
40
+ "BXR": "Buryat (Russia)",
41
+ "CA": "Catalan",
42
+ "CCC": "Chamicuro",
43
+ "CDO": "Min Dong",
44
+ "CE": "Chechen",
45
+ "CEB": "Cebuano",
46
+ "CHR": "Cherokee",
47
+ "CHY": "Cheyenne",
48
+ "CKB": "Sorani",
49
+ "CO": "Corsican",
50
+ "CR": "Cree",
51
+ "CRH": "Crimean Tatar",
52
+ "CS": "Czech",
53
+ "CSB": "Kashubian",
54
+ "CU": "Old Church Slavonic",
55
+ "CV": "Chuvash",
56
+ "CY": "Welsh",
57
+ "DA": "Danish",
58
+ "DE": "German",
59
+ "DIN": "Dinka",
60
+ "DIQ": "Zazaki",
61
+ "DLM": "Dalmatian",
62
+ "DNG": "Dungan",
63
+ "DSB": "Lower Sorbian",
64
+ "DV": "Divehi",
65
+ "DZ": "Dzongkha",
66
+ "EE": "Ewe",
67
+ "EL": "Greek",
68
+ "EML": "Emilian-Romagnol",
69
+ "EN": "English",
70
+ "ENM": "Middle English",
71
+ "EO": "Esperanto",
72
+ "ES": "Spanish",
73
+ "ET": "Estonian",
74
+ "EU": "Basque",
75
+ "EXT": "Extremaduran",
76
+ "FA": "Persian",
77
+ "FI": "Finnish",
78
+ "FIU_VRO": "V\u00f5ro",
79
+ "FJ": "Fijian",
80
+ "FO": "Faroese",
81
+ "FR": "French",
82
+ "FRO": "Old French",
83
+ "FRP": "Franco-Proven\u00e7al/Arpitan",
84
+ "FRR": "North Frisian",
85
+ "FUR": "Friulian",
86
+ "FY": "West Frisian",
87
+ "GA": "Irish",
88
+ "GAN": "Gan",
89
+ "GD": "Scottish Gaelic",
90
+ "GL": "Galician",
91
+ "GMQ_BOT": "Westrobothnian",
92
+ "GN": "Guarani",
93
+ "GOT": "Gothic",
94
+ "GRC": "Ancient Greek",
95
+ "GU": "Gujarati",
96
+ "GV": "Manx",
97
+ "HA": "Hausa",
98
+ "HAK": "Hakka",
99
+ "HAW": "Hawaiian",
100
+ "HE": "Hebrew",
101
+ "HI": "Hindi",
102
+ "HR": "Croatian",
103
+ "HRX": "Hunsrik",
104
+ "HSB": "Upper Sorbian",
105
+ "HT": "Haitian",
106
+ "HU": "Hungarian",
107
+ "HY": "Armenian",
108
+ "IA": "Interlingua",
109
+ "ID": "Indonesian",
110
+ "IG": "Igbo",
111
+ "IK": "Inupiak",
112
+ "ILO": "Ilokano",
113
+ "INH": "Ingush",
114
+ "IO": "Ido",
115
+ "IS": "Icelandic",
116
+ "IT": "Italian",
117
+ "IU": "Inuktitut",
118
+ "JA": "Japanese",
119
+ "JAM": "Patois",
120
+ "JBO": "Lojban",
121
+ "JV": "Javanese",
122
+ "KA": "Georgian",
123
+ "KAA": "Karakalpak",
124
+ "KAB": "Kabyle",
125
+ "KBD": "Kabardian Circassian",
126
+ "KG": "Kongo",
127
+ "KHB": "L\u00fc",
128
+ "KI": "Kikuyu",
129
+ "KK": "Kazakh",
130
+ "KL": "Greenlandic",
131
+ "KM": "Khmer",
132
+ "KMR": "Northern Kurdish",
133
+ "KN": "Kannada",
134
+ "KO": "Korean",
135
+ "KOI": "Komi-Permyak",
136
+ "KRC": "Karachay-Balkar",
137
+ "KS": "Kashmiri",
138
+ "KSH": "Ripuarian",
139
+ "KU": "Kurdish",
140
+ "KUM": "Kumyk",
141
+ "KV": "Komi",
142
+ "KW": "Cornish",
143
+ "KXD": "Brunei Malay",
144
+ "KY": "Kirghiz",
145
+ "LA": "Latin",
146
+ "LAD": "Ladino",
147
+ "LB": "Luxembourgish",
148
+ "LBE": "Lak",
149
+ "LEZ": "Lezgian",
150
+ "LG": "Luganda",
151
+ "LI": "Limburgish",
152
+ "LIJ": "Ligurian",
153
+ "LMO": "Lombard",
154
+ "LN": "Lingala",
155
+ "LO": "Lao",
156
+ "LT": "Lithuanian",
157
+ "LTG": "Latgalian",
158
+ "LV": "Latvian",
159
+ "LZZ": "Laz",
160
+ "MAI": "Maithili",
161
+ "MDF": "Moksha",
162
+ "MEL": "Central Melanau",
163
+ "MG": "Malagasy",
164
+ "MHR": "Meadow Mari",
165
+ "MI": "Maori",
166
+ "MIC": "Mi'kmaq",
167
+ "MIN": "Minangkabau",
168
+ "MK": "Macedonian",
169
+ "ML": "Malayalam",
170
+ "MN": "Mongolian",
171
+ "MNC": "Manchu",
172
+ "MNW": "Mon",
173
+ "MR": "Marathi",
174
+ "MRJ": "Hill Mari",
175
+ "MS": "Malay",
176
+ "MT": "Maltese",
177
+ "MWL": "Mirandese",
178
+ "MY": "Burmese",
179
+ "MYV": "Erzya",
180
+ "MZN": "Mazandarani",
181
+ "NAH": "Nahuatl",
182
+ "NAP": "Neapolitan",
183
+ "NCI": "Classical Nahuatl",
184
+ "NDS": "Low Saxon",
185
+ "NDS_NL": "Dutch Low Saxon",
186
+ "NE": "Nepali",
187
+ "NEW": "Newar / Nepal Bhasa",
188
+ "NL": "Dutch",
189
+ "NN": "Norwegian (Nynorsk)",
190
+ "NO": "Norwegian (Bokm\u00e5l)",
191
+ "NOG": "Nogai",
192
+ "NON": "Old Norse",
193
+ "NOV": "Novial",
194
+ "NRM": "Norman",
195
+ "NSO": "Northern Sotho",
196
+ "NV": "Navajo",
197
+ "NY": "Chichewa",
198
+ "OC": "Occitan",
199
+ "OJ": "Ojibwe",
200
+ "OLO": "Livvinkarjala",
201
+ "OM": "Oromo",
202
+ "OR": "Oriya",
203
+ "ORV": "Old East Slavic",
204
+ "OS": "Ossetian",
205
+ "OTA": "Ottoman Turkish",
206
+ "OVD": "Elfdalian",
207
+ "PA": "Punjabi",
208
+ "PAM": "Kapampangan",
209
+ "PAP": "Papiamentu",
210
+ "PCD": "Picard",
211
+ "PDC": "Pennsylvania German",
212
+ "PDT": "Plautdietsch",
213
+ "PL": "Polish",
214
+ "PMS": "Piedmontese",
215
+ "PNB": "Western Panjabi",
216
+ "PS": "Pashto",
217
+ "PT": "Portuguese",
218
+ "QU": "Quechua",
219
+ "RM": "Romansh",
220
+ "RMY": "Romani",
221
+ "RO": "Romanian",
222
+ "ROA_RUP": "Aromanian",
223
+ "RU": "Russian",
224
+ "RUE": "Rusyn",
225
+ "SA": "Sanskrit",
226
+ "SAH": "Sakha",
227
+ "SAT": "Santali",
228
+ "SC": "Sardinian",
229
+ "SCN": "Sicilian",
230
+ "SCO": "Scots",
231
+ "SD": "Sindhi",
232
+ "SE": "Northern Sami",
233
+ "SH": "Serbo-Croatian",
234
+ "SHI": "Tashelhit",
235
+ "SHN": "Shan",
236
+ "SI": "Sinhalese",
237
+ "SIMPLE": "Simple English",
238
+ "SK": "Slovak",
239
+ "SL": "Slovenian",
240
+ "SM": "Samoan",
241
+ "SMJ": "Lule Sami",
242
+ "SMN": "Inari Sami",
243
+ "SMS": "Skolt Sami",
244
+ "SN": "Shona",
245
+ "SNE": "Bau Bidayuh",
246
+ "SO": "Somali",
247
+ "SQ": "Albanian",
248
+ "SR": "Serbian",
249
+ "SRN": "Sranan",
250
+ "ST": "Sesotho",
251
+ "STQ": "Saterland Frisian",
252
+ "SU": "Sundanese",
253
+ "SV": "Swedish",
254
+ "SVA": "Svan",
255
+ "SW": "Swahili",
256
+ "SYC": "Classical Syriac",
257
+ "SZL": "Silesian",
258
+ "TA": "Tamil",
259
+ "TCY": "Tulu",
260
+ "TE": "Telugu",
261
+ "TG": "Tajik",
262
+ "TH": "Thai",
263
+ "TI": "Tigrinya",
264
+ "TK": "Turkmen",
265
+ "TL": "Tagalog",
266
+ "TN": "Tswana",
267
+ "TO": "Tongan",
268
+ "TPI": "Tok Pisin",
269
+ "TR": "Turkish",
270
+ "TT": "Tatar",
271
+ "TYV": "Tuvan",
272
+ "UDM": "Udmurt",
273
+ "UG": "Uyghur",
274
+ "UGA": "Ugaritic",
275
+ "UK": "Ukrainian",
276
+ "UR": "Urdu",
277
+ "UZ": "Uzbek",
278
+ "VEC": "Venetian",
279
+ "VEP": "Vepsian",
280
+ "VI": "Vietnamese",
281
+ "VLS": "West Flemish",
282
+ "VO": "Volap\u00fck",
283
+ "WA": "Walloon",
284
+ "WAR": "Waray-Waray",
285
+ "WO": "Wolof",
286
+ "WUU": "Wu",
287
+ "XAL": "Kalmyk",
288
+ "XH": "Xhosa",
289
+ "XMF": "Mingrelian",
290
+ "YI": "Yiddish",
291
+ "YO": "Yoruba",
292
+ "YUA": "Yucatec Maya",
293
+ "ZA": "Zhuang",
294
+ "ZDJ": "Ngazidja Comorian",
295
+ "ZH": "Chinese",
296
+ "ZH_CLASSICAL": "Classical Chinese",
297
+ "ZH_MIN_NAN": "Min Nan",
298
+ "ZH_YUE": "Cantonese",
299
+ "ZU": "Zulu"
300
+ }
precomputed_results.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c04522ddd7d79055f5d26c4e60a809f7725e67032dd46bbd0b8303cdc039e882
3
+ size 26844572