Spaces:
Running
Running
Updating app version July 15th, 2025
Browse files- app.py +8 -0
- data/concepts.json +267 -21
- data/guidelines/USA/English/instructions.md +1 -1
- data/guidelines/USA/English/task.md +1 -3
- data/metadata.json +67 -67
- data/update_metadata_from_concepts.py +3 -0
- logic/data_utils.py +1 -1
- logic/handlers.py +187 -32
- ui/layout.py +77 -7
- ui/main_page.py +94 -33
- ui/selection_page.py +38 -32
app.py
CHANGED
@@ -1,8 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
from ui.layout import build_ui
|
2 |
from logic.data_utils import load_concepts, load_metadata
|
3 |
|
4 |
from config.settings import HF_API_TOKEN, HF_DATASET_NAME
|
5 |
|
|
|
6 |
concepts = load_concepts()
|
7 |
metadata = load_metadata()
|
8 |
|
|
|
1 |
+
# import spacy.cli
|
2 |
+
# spacy.cli.download("ja_core_news_sm")
|
3 |
+
# spacy.cli.download("zh_core_web_sm")
|
4 |
+
import spacy_udpipe
|
5 |
+
spacy_udpipe.download("ja")
|
6 |
+
spacy_udpipe.download("zh")
|
7 |
+
|
8 |
from ui.layout import build_ui
|
9 |
from logic.data_utils import load_concepts, load_metadata
|
10 |
|
11 |
from config.settings import HF_API_TOKEN, HF_DATASET_NAME
|
12 |
|
13 |
+
|
14 |
concepts = load_concepts()
|
15 |
metadata = load_metadata()
|
16 |
|
data/concepts.json
CHANGED
@@ -2639,21 +2639,77 @@
|
|
2639 |
"ጥብስ",
|
2640 |
"ፍርፍር",
|
2641 |
"ሰላጣ",
|
2642 |
-
"ብርዝ"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2643 |
],
|
2644 |
"Clothing": [
|
2645 |
"ሱሪ",
|
2646 |
"ነጠላ",
|
2647 |
"ጋቢ",
|
2648 |
"ቀሚስ",
|
2649 |
-
"
|
2650 |
"ካፖርት",
|
2651 |
"ኮት",
|
2652 |
"ጫማ",
|
2653 |
"ብርድ ልብስ",
|
2654 |
"አንሶላ",
|
2655 |
"ሰዓት",
|
2656 |
-
"ሻሽ"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2657 |
],
|
2658 |
"Buildings (interior and exterior)": [
|
2659 |
"ቤት",
|
@@ -2681,7 +2737,10 @@
|
|
2681 |
"አደባባይ",
|
2682 |
"ቤተመንግስት",
|
2683 |
"መስጊድ ",
|
2684 |
-
"ቤተ ክርስቲያን "
|
|
|
|
|
|
|
2685 |
],
|
2686 |
"Instruments, Tools and Utensils": [
|
2687 |
"ምጣድ",
|
@@ -2693,18 +2752,66 @@
|
|
2693 |
"ዶማ",
|
2694 |
"ቀንበር",
|
2695 |
"ከበሮ",
|
2696 |
-
"ሞሰብ"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2697 |
],
|
2698 |
"Celebrations, Sports and Events": [
|
2699 |
"ሰርግ",
|
2700 |
"ቀብር",
|
2701 |
-
"
|
2702 |
"አዲስ አመት",
|
2703 |
"ኢድ አልፈጥር",
|
2704 |
"ኢድ አልአድሃ",
|
2705 |
-
"
|
2706 |
"ገና",
|
2707 |
-
"ጥምቀት"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2708 |
]
|
2709 |
}
|
2710 |
},
|
@@ -5820,7 +5927,7 @@
|
|
5820 |
"Maji",
|
5821 |
"Sharubati",
|
5822 |
"Mayai",
|
5823 |
-
"Ugali",
|
5824 |
"Wali",
|
5825 |
"Maharagwe",
|
5826 |
"Mahindi",
|
@@ -5829,10 +5936,10 @@
|
|
5829 |
"Kuku",
|
5830 |
"Viazi",
|
5831 |
"Mandazi",
|
5832 |
-
"Mahamri",
|
5833 |
"Chapati",
|
5834 |
"Pilau",
|
5835 |
-
"Samaki"
|
|
|
5836 |
],
|
5837 |
"Clothing": [
|
5838 |
"Kaptura",
|
@@ -5844,7 +5951,7 @@
|
|
5844 |
"Soksi",
|
5845 |
"Kofia",
|
5846 |
"Kitenge",
|
5847 |
-
"
|
5848 |
"Champali",
|
5849 |
"Sidiria"
|
5850 |
],
|
@@ -5897,7 +6004,7 @@
|
|
5897 |
"Tarumbeta",
|
5898 |
"Kayamba",
|
5899 |
"Kinanda",
|
5900 |
-
"
|
5901 |
],
|
5902 |
"Celebrations, Sports and Events": [
|
5903 |
"Harusi",
|
@@ -5917,7 +6024,7 @@
|
|
5917 |
"Siku ya Wafanyakazi /Leba Dei",
|
5918 |
"Sikukuu ya Krismasi",
|
5919 |
"Siku ya Wanawake Duniani",
|
5920 |
-
"Siku ya
|
5921 |
"Siku ya Mama"
|
5922 |
]
|
5923 |
}
|
@@ -6343,7 +6450,6 @@
|
|
6343 |
"Rijtjeshuis",
|
6344 |
"Boerderij",
|
6345 |
"Villa",
|
6346 |
-
"Molen",
|
6347 |
"Flat",
|
6348 |
"Kasteel",
|
6349 |
"Watertoren",
|
@@ -6356,7 +6462,8 @@
|
|
6356 |
"Bunker",
|
6357 |
"Woonboot",
|
6358 |
"Begijnhof",
|
6359 |
-
"Sluis"
|
|
|
6360 |
],
|
6361 |
"Instruments, Tools and Utensils": [
|
6362 |
"Poffertjespan",
|
@@ -6995,7 +7102,28 @@
|
|
6995 |
"Galocha",
|
6996 |
"Chapéu"
|
6997 |
],
|
6998 |
-
"Buildings (interior and exterior)": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6999 |
"Instruments, Tools and Utensils": [
|
7000 |
"Guitarra portuguesa",
|
7001 |
"Cavaquinho",
|
@@ -9443,8 +9571,70 @@
|
|
9443 |
},
|
9444 |
"Venezuela": {
|
9445 |
"Spanish": {
|
9446 |
-
"Food and Beverages": [
|
9447 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9448 |
"Buildings (interior and exterior)": [
|
9449 |
"Casa / Quinta",
|
9450 |
"Apartamento",
|
@@ -9487,13 +9677,69 @@
|
|
9487 |
"Cuartel",
|
9488 |
"Centro Comercial"
|
9489 |
],
|
9490 |
-
"Instruments, Tools and Utensils": [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9491 |
"Celebrations, Sports and Events": [
|
9492 |
"Boda",
|
9493 |
"Funeral",
|
9494 |
"Bautizo",
|
9495 |
"Año Nuevo",
|
9496 |
-
"Cumpleaños"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9497 |
]
|
9498 |
}
|
9499 |
},
|
|
|
2639 |
"ጥብስ",
|
2640 |
"ፍርፍር",
|
2641 |
"ሰላጣ",
|
2642 |
+
"ብርዝ",
|
2643 |
+
"ሽሮ",
|
2644 |
+
"ዶሮ ወጥ",
|
2645 |
+
"ምንቸት አብሽ",
|
2646 |
+
"ጎረድ ጎርድ",
|
2647 |
+
"አልጫ ",
|
2648 |
+
"ገንፎ",
|
2649 |
+
"ጨጨብሳ",
|
2650 |
+
"ፈጢራ",
|
2651 |
+
"ባቅላባ",
|
2652 |
+
"ኽለዋ",
|
2653 |
+
"ክክ ወጥ",
|
2654 |
+
"ምስር ወጥ",
|
2655 |
+
"ድንች ወጥ",
|
2656 |
+
"በየአይነቱ ",
|
2657 |
+
"አነባብሮሽ",
|
2658 |
+
"እንቁላል ፍርፍር",
|
2659 |
+
"ፉል",
|
2660 |
+
"ህልብት",
|
2661 |
+
"ፋታ",
|
2662 |
+
"ጭቆ",
|
2663 |
+
"አንባሻ",
|
2664 |
+
"ቆሎ",
|
2665 |
+
"ንፍሮ",
|
2666 |
+
"ድንች ቅቅል",
|
2667 |
+
"ሳምቡሳ",
|
2668 |
+
"ቦምቦሊኖ",
|
2669 |
+
"አጥሚት",
|
2670 |
+
"ቦርዲ",
|
2671 |
+
"ቡና",
|
2672 |
+
"አረቄ"
|
2673 |
],
|
2674 |
"Clothing": [
|
2675 |
"ሱሪ",
|
2676 |
"ነጠላ",
|
2677 |
"ጋቢ",
|
2678 |
"ቀሚስ",
|
2679 |
+
"ካልስ",
|
2680 |
"ካፖርት",
|
2681 |
"ኮት",
|
2682 |
"ጫማ",
|
2683 |
"ብርድ ልብስ",
|
2684 |
"አንሶላ",
|
2685 |
"ሰዓት",
|
2686 |
+
"ሻሽ",
|
2687 |
+
"እጀ ጠባብ",
|
2688 |
+
"መቀነት",
|
2689 |
+
"ጉንፍ",
|
2690 |
+
"ሹፎን",
|
2691 |
+
"ሽብሽቦ",
|
2692 |
+
"ሂጃብ",
|
2693 |
+
"አባያ",
|
2694 |
+
"ጅልባብ",
|
2695 |
+
"ጀላብያ",
|
2696 |
+
"ጥምጣም",
|
2697 |
+
"ሽርጥ",
|
2698 |
+
"ፎጣ",
|
2699 |
+
"ጎጃም አዘነ",
|
2700 |
+
"ቁምጣ",
|
2701 |
+
"ጥበብ",
|
2702 |
+
"ዉስጥ ልብስ",
|
2703 |
+
"ባርኔጣ",
|
2704 |
+
"ገሳ",
|
2705 |
+
"ካባ",
|
2706 |
+
"ቤሎ",
|
2707 |
+
"መቅና",
|
2708 |
+
"ኒቃብ",
|
2709 |
+
"ማተብ",
|
2710 |
+
"የዉስጥ ሱሪ",
|
2711 |
+
"ሸበጥ",
|
2712 |
+
"ነጠላ ጫማ"
|
2713 |
],
|
2714 |
"Buildings (interior and exterior)": [
|
2715 |
"ቤት",
|
|
|
2737 |
"አደባባይ",
|
2738 |
"ቤተመንግስት",
|
2739 |
"መስጊድ ",
|
2740 |
+
"ቤተ ክርስቲያን ",
|
2741 |
+
"ጎጆ ቤት",
|
2742 |
+
"ሽንት ቤት",
|
2743 |
+
"በረንዳ"
|
2744 |
],
|
2745 |
"Instruments, Tools and Utensils": [
|
2746 |
"ምጣድ",
|
|
|
2752 |
"ዶማ",
|
2753 |
"ቀንበር",
|
2754 |
"ከበሮ",
|
2755 |
+
"ሞሰብ",
|
2756 |
+
"ዋሽንት",
|
2757 |
+
"ክራር",
|
2758 |
+
"ዲቢ",
|
2759 |
+
"ሰፌድ",
|
2760 |
+
"ሰባጤራ",
|
2761 |
+
"እንስራ",
|
2762 |
+
"ቶፋ",
|
2763 |
+
"ጎታ",
|
2764 |
+
"ጀበና",
|
2765 |
+
"ጥዋ",
|
2766 |
+
"ዋንጫ",
|
2767 |
+
"ብርሌ",
|
2768 |
+
"ፋጋ",
|
2769 |
+
"ሰኔል",
|
2770 |
+
"ጭልፋ",
|
2771 |
+
"መገበሪያ",
|
2772 |
+
"ሙግድ",
|
2773 |
+
"ቆጥ",
|
2774 |
+
"መደብ",
|
2775 |
+
"ቁና",
|
2776 |
+
"ቀፎ",
|
2777 |
+
"ሙቅጫ",
|
2778 |
+
"ዘነዘና",
|
2779 |
+
"ዘንቢል",
|
2780 |
+
"ወንፊት"
|
2781 |
],
|
2782 |
"Celebrations, Sports and Events": [
|
2783 |
"ሰርግ",
|
2784 |
"ቀብር",
|
2785 |
+
"የልድተ ቀን",
|
2786 |
"አዲስ አመት",
|
2787 |
"ኢድ አልፈጥር",
|
2788 |
"ኢድ አልአድሃ",
|
2789 |
+
"ተስካር",
|
2790 |
"ገና",
|
2791 |
+
"ጥምቀት",
|
2792 |
+
"መዉሊደ",
|
2793 |
+
"ቡሄ",
|
2794 |
+
"ፋሲካ",
|
2795 |
+
"የመስቀል በዓል",
|
2796 |
+
"ታላቁ ሩጫ",
|
2797 |
+
"ህዳር ጺዎን",
|
2798 |
+
"ቁልቢ ገብርኤል",
|
2799 |
+
"የአድዋ በዓል",
|
2800 |
+
"የአርበኞች ቀን",
|
2801 |
+
"የላባደሮች ቀን",
|
2802 |
+
"የብሄር ብሄረሰቦች ቀን",
|
2803 |
+
"ኢሬቻ",
|
2804 |
+
"ሻደይ",
|
2805 |
+
"ፊቸ ጨምበላላ",
|
2806 |
+
"አሸንዳ",
|
2807 |
+
"ህዳር ሲታጠን",
|
2808 |
+
"የገና ጨዋታ",
|
2809 |
+
"እግር ኳስ ጨዋታ",
|
2810 |
+
"አገዉ ፈረሰኞች",
|
2811 |
+
"ምርቃት",
|
2812 |
+
"እርሻ",
|
2813 |
+
"ትግል",
|
2814 |
+
"ገበጣ"
|
2815 |
]
|
2816 |
}
|
2817 |
},
|
|
|
5927 |
"Maji",
|
5928 |
"Sharubati",
|
5929 |
"Mayai",
|
5930 |
+
"Ugali/Sima",
|
5931 |
"Wali",
|
5932 |
"Maharagwe",
|
5933 |
"Mahindi",
|
|
|
5936 |
"Kuku",
|
5937 |
"Viazi",
|
5938 |
"Mandazi",
|
|
|
5939 |
"Chapati",
|
5940 |
"Pilau",
|
5941 |
+
"Samaki",
|
5942 |
+
"Mkate"
|
5943 |
],
|
5944 |
"Clothing": [
|
5945 |
"Kaptura",
|
|
|
5951 |
"Soksi",
|
5952 |
"Kofia",
|
5953 |
"Kitenge",
|
5954 |
+
"Kiatu",
|
5955 |
"Champali",
|
5956 |
"Sidiria"
|
5957 |
],
|
|
|
6004 |
"Tarumbeta",
|
6005 |
"Kayamba",
|
6006 |
"Kinanda",
|
6007 |
+
"Gitaa"
|
6008 |
],
|
6009 |
"Celebrations, Sports and Events": [
|
6010 |
"Harusi",
|
|
|
6024 |
"Siku ya Wafanyakazi /Leba Dei",
|
6025 |
"Sikukuu ya Krismasi",
|
6026 |
"Siku ya Wanawake Duniani",
|
6027 |
+
"Siku ya Baba",
|
6028 |
"Siku ya Mama"
|
6029 |
]
|
6030 |
}
|
|
|
6450 |
"Rijtjeshuis",
|
6451 |
"Boerderij",
|
6452 |
"Villa",
|
|
|
6453 |
"Flat",
|
6454 |
"Kasteel",
|
6455 |
"Watertoren",
|
|
|
6462 |
"Bunker",
|
6463 |
"Woonboot",
|
6464 |
"Begijnhof",
|
6465 |
+
"Sluis",
|
6466 |
+
"Fietsenstalling"
|
6467 |
],
|
6468 |
"Instruments, Tools and Utensils": [
|
6469 |
"Poffertjespan",
|
|
|
7102 |
"Galocha",
|
7103 |
"Chapéu"
|
7104 |
],
|
7105 |
+
"Buildings (interior and exterior)": [
|
7106 |
+
"Casa",
|
7107 |
+
"Mosteiro",
|
7108 |
+
"Hospital",
|
7109 |
+
"Quinta",
|
7110 |
+
"Igreja",
|
7111 |
+
"Escola",
|
7112 |
+
"Cozinha",
|
7113 |
+
"Restaurante",
|
7114 |
+
"Estação ferroviária",
|
7115 |
+
"Quarto",
|
7116 |
+
"Centro comercial",
|
7117 |
+
"Despensa",
|
7118 |
+
"Parque",
|
7119 |
+
"Castelo",
|
7120 |
+
"Estádio",
|
7121 |
+
"Museu",
|
7122 |
+
"Padaria",
|
7123 |
+
"Pastelaria",
|
7124 |
+
"Bar",
|
7125 |
+
"Posto de abastecimento"
|
7126 |
+
],
|
7127 |
"Instruments, Tools and Utensils": [
|
7128 |
"Guitarra portuguesa",
|
7129 |
"Cavaquinho",
|
|
|
9571 |
},
|
9572 |
"Venezuela": {
|
9573 |
"Spanish": {
|
9574 |
+
"Food and Beverages": [
|
9575 |
+
"Cachapa",
|
9576 |
+
"Hallaca",
|
9577 |
+
"Cachito de Jamón",
|
9578 |
+
"Pabellón Criollo",
|
9579 |
+
"Chicha Criolla",
|
9580 |
+
"Asado Negro",
|
9581 |
+
"Pan de Jamon",
|
9582 |
+
"Papelón con Limón",
|
9583 |
+
"Empanada Venezolana",
|
9584 |
+
"Tequeño",
|
9585 |
+
"Golfeado",
|
9586 |
+
"Patacón",
|
9587 |
+
"Arepa",
|
9588 |
+
"Bollo Pelón",
|
9589 |
+
"Casabe",
|
9590 |
+
"Frescolita",
|
9591 |
+
"Mandoca",
|
9592 |
+
"Ponche Crema",
|
9593 |
+
"Malta",
|
9594 |
+
"Ensalda de Gallina",
|
9595 |
+
"Carne Mechada",
|
9596 |
+
"Chicharrón",
|
9597 |
+
"Guasacaca",
|
9598 |
+
"Licor de Cocuy",
|
9599 |
+
"Majarete",
|
9600 |
+
"Mojito",
|
9601 |
+
"Mondongo de chivo",
|
9602 |
+
"Parilla",
|
9603 |
+
"Pastelito",
|
9604 |
+
"Tizana",
|
9605 |
+
"Vuelve a la Vida",
|
9606 |
+
"Arepa andina / Arepa de trigo",
|
9607 |
+
"Sopa de Mondongo",
|
9608 |
+
"Pisca andina",
|
9609 |
+
"Sancocho",
|
9610 |
+
"Perico",
|
9611 |
+
"Reina Pepeada",
|
9612 |
+
"Dulce de lechosa",
|
9613 |
+
"Queso",
|
9614 |
+
"Ron"
|
9615 |
+
],
|
9616 |
+
"Clothing": [
|
9617 |
+
"Alpargata",
|
9618 |
+
"Ruana",
|
9619 |
+
"Liqui Liqui",
|
9620 |
+
"Manta Guajira / Manta Wayuu",
|
9621 |
+
"Sombrero de Cogollo",
|
9622 |
+
"Guayabera",
|
9623 |
+
"Guayuco",
|
9624 |
+
"Sombrero de Pelo e' Guama",
|
9625 |
+
"Traje de Dama Antañona",
|
9626 |
+
"Blusa",
|
9627 |
+
"Collar de Semillas",
|
9628 |
+
"Falda Llanera",
|
9629 |
+
"Tocado Wayuu",
|
9630 |
+
"Capris",
|
9631 |
+
"Chancla / Chancleta",
|
9632 |
+
"Franela",
|
9633 |
+
"Gorra",
|
9634 |
+
"Zapatos de Goma",
|
9635 |
+
"Pantalón Tubito",
|
9636 |
+
"Franelilla"
|
9637 |
+
],
|
9638 |
"Buildings (interior and exterior)": [
|
9639 |
"Casa / Quinta",
|
9640 |
"Apartamento",
|
|
|
9677 |
"Cuartel",
|
9678 |
"Centro Comercial"
|
9679 |
],
|
9680 |
+
"Instruments, Tools and Utensils": [
|
9681 |
+
"Bandola",
|
9682 |
+
"Arpa",
|
9683 |
+
"Maracas",
|
9684 |
+
"Furruco",
|
9685 |
+
"Charrasca",
|
9686 |
+
"Cuatro",
|
9687 |
+
"Tambor",
|
9688 |
+
"Tostiarepa",
|
9689 |
+
"Pilón",
|
9690 |
+
"Budare",
|
9691 |
+
"Guarura",
|
9692 |
+
"Sebucán",
|
9693 |
+
"Anafre",
|
9694 |
+
"Hamaca",
|
9695 |
+
"Totuma / Tapara",
|
9696 |
+
"Flauta",
|
9697 |
+
"Cesta",
|
9698 |
+
"Coleto ",
|
9699 |
+
"Machete",
|
9700 |
+
"Gurrufío"
|
9701 |
+
],
|
9702 |
"Celebrations, Sports and Events": [
|
9703 |
"Boda",
|
9704 |
"Funeral",
|
9705 |
"Bautizo",
|
9706 |
"Año Nuevo",
|
9707 |
+
"Cumpleaños",
|
9708 |
+
"Feria de la Chinita",
|
9709 |
+
"Diablos Danzantes de Yare",
|
9710 |
+
"Fiesta de San Juan",
|
9711 |
+
"Día de la Divina Pastora",
|
9712 |
+
"Semana Santa",
|
9713 |
+
"Serie del Caribe",
|
9714 |
+
"Beisbol",
|
9715 |
+
"Día de la Independencia de Venezuela",
|
9716 |
+
"Día de la Resistencia Indígena",
|
9717 |
+
"Navidad",
|
9718 |
+
"Paradura del Niño",
|
9719 |
+
"Carnaval",
|
9720 |
+
"Carnaval de El Callao",
|
9721 |
+
"Feria Internacional de San Sebastián",
|
9722 |
+
"Día de Nuestra Señora de Coromoto",
|
9723 |
+
"Parranda de San Pedro",
|
9724 |
+
"Tambores de San Benito",
|
9725 |
+
"Día de la Virgen de la Candelaria",
|
9726 |
+
"Día de la Virgen del Valle",
|
9727 |
+
"Día de Reyes",
|
9728 |
+
"Bolas Criollas",
|
9729 |
+
"Coleo de toros",
|
9730 |
+
"Baloncesto",
|
9731 |
+
"Superliga Profesional de Baloncesto",
|
9732 |
+
"Quema de Judas",
|
9733 |
+
"Feria Internacional del Sol\n",
|
9734 |
+
"Miss Venezuela\n",
|
9735 |
+
"Miss Universo\n",
|
9736 |
+
"La Cruz de Mayo",
|
9737 |
+
"Día de la Madre",
|
9738 |
+
"Día del Padre",
|
9739 |
+
"Día del Maestro",
|
9740 |
+
"Ferias de San Felipe",
|
9741 |
+
"Día del Niño",
|
9742 |
+
"Futbol"
|
9743 |
]
|
9744 |
}
|
9745 |
},
|
data/guidelines/USA/English/instructions.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5 |
- Images should NOT have empty backgrounds NOR watermarks.
|
6 |
- The complexity of the image will contribute to the interestingness of the description.
|
7 |
- You can blur all/selected faces before submitting your image. Once submitted, faces cannot be deblurred (you can still, however, re-upload the image if you want to).
|
8 |
-
- If you don’t have personal pictures for a concept, please use public images:
|
9 |
- [Google images](images.google.com)
|
10 |
|
11 |
- When searching on images.google.com, you can click on “Tools” → “Usage rights” → “Creative Commons licenses”
|
|
|
5 |
- Images should NOT have empty backgrounds NOR watermarks.
|
6 |
- The complexity of the image will contribute to the interestingness of the description.
|
7 |
- You can blur all/selected faces before submitting your image. Once submitted, faces cannot be deblurred (you can still, however, re-upload the image if you want to).
|
8 |
+
- If you don’t have personal pictures for a concept, please use public images by providing their URL (instead of downloading them):
|
9 |
- [Google images](images.google.com)
|
10 |
|
11 |
- When searching on images.google.com, you can click on “Tools” → “Usage rights” → “Creative Commons licenses”
|
data/guidelines/USA/English/task.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1 |
-
# Wonders: Multicultural Images and Captions for Inclusive AI
|
2 |
|
3 |
-
We want to collect images and annotations that are relevant for your culture.
|
4 |
- **Main concept:** Choose the main category and concept for which you want to share data. You can type a new concept if it’s culturally relevant and missing from our list.
|
5 |
-
- **Image:** An image where the *main concept is clearly visible*. The image needs to (1) show the concept *in typical contexts* where it can be found in your country, and (2) *include other* objects/people whenever possible. *Pictures taken by yourself* are preferred. Otherwise,
|
6 |
- **Description:** A long description (around 40 words) that provides extensive and detailed visual information. Descriptions must be *objective*: focus on how you would describe the image to someone who can’t see it, without adding your own opinions/speculations. The text needs to *include the main concept* and describes the content of the image in detail by including:
|
7 |
- **Who?** The visual *appearance* and observable *emotions* (e.g., “is smiling”) of persons and animals.
|
8 |
- **What?** The *actions* performed in the image.
|
|
|
|
|
1 |
|
|
|
2 |
- **Main concept:** Choose the main category and concept for which you want to share data. You can type a new concept if it’s culturally relevant and missing from our list.
|
3 |
+
- **Image:** An image where the *main concept is clearly visible*. The image needs to (1) show the concept *in typical contexts* where it can be found in your country, and (2) *include other* objects/people whenever possible. *Pictures taken by yourself* are preferred. Otherwise, do not download images from the Web. Instead, add the image URL below for publicly-licensed images (e.g., from pexels.com or freepik.com). For more details, see “Instructions” below.
|
4 |
- **Description:** A long description (around 40 words) that provides extensive and detailed visual information. Descriptions must be *objective*: focus on how you would describe the image to someone who can’t see it, without adding your own opinions/speculations. The text needs to *include the main concept* and describes the content of the image in detail by including:
|
5 |
- **Who?** The visual *appearance* and observable *emotions* (e.g., “is smiling”) of persons and animals.
|
6 |
- **What?** The *actions* performed in the image.
|
data/metadata.json
CHANGED
@@ -8,8 +8,8 @@
|
|
8 |
"Password": "Password (Optional)",
|
9 |
"Concept": "Main Concept",
|
10 |
"Image": "Image",
|
11 |
-
"Image_URL": "Image URL (optional, if no image is
|
12 |
-
"Description": "Description",
|
13 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
14 |
"Clear_btn": "Clear",
|
15 |
"Submit_btn": "Submit",
|
@@ -34,8 +34,8 @@
|
|
34 |
"Password": "Password (Optional)",
|
35 |
"Concept": "Main Concept",
|
36 |
"Image": "Image",
|
37 |
-
"Image_URL": "Image URL (optional, if no image is
|
38 |
-
"Description": "Description",
|
39 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
40 |
"Clear_btn": "Clear",
|
41 |
"Submit_btn": "Submit",
|
@@ -61,7 +61,7 @@
|
|
61 |
"Concept": "Main Concept",
|
62 |
"Image": "Image",
|
63 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
64 |
-
"Description": "Description",
|
65 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
66 |
"Clear_btn": "Clear",
|
67 |
"Submit_btn": "Submit",
|
@@ -87,7 +87,7 @@
|
|
87 |
"Concept": "Main Concept",
|
88 |
"Image": "Image",
|
89 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
90 |
-
"Description": "Description",
|
91 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
92 |
"Clear_btn": "Clear",
|
93 |
"Submit_btn": "Submit",
|
@@ -113,7 +113,7 @@
|
|
113 |
"Concept": "Main Concept",
|
114 |
"Image": "Image",
|
115 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
116 |
-
"Description": "Description",
|
117 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
118 |
"Clear_btn": "Clear",
|
119 |
"Submit_btn": "Submit",
|
@@ -139,7 +139,7 @@
|
|
139 |
"Concept": "Main Concept",
|
140 |
"Image": "Image",
|
141 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
142 |
-
"Description": "Description",
|
143 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
144 |
"Clear_btn": "Clear",
|
145 |
"Submit_btn": "Submit",
|
@@ -165,7 +165,7 @@
|
|
165 |
"Concept": "Main Concept",
|
166 |
"Image": "Image",
|
167 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
168 |
-
"Description": "Description",
|
169 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
170 |
"Clear_btn": "Clear",
|
171 |
"Submit_btn": "Submit",
|
@@ -191,7 +191,7 @@
|
|
191 |
"Concept": "Main Concept",
|
192 |
"Image": "Image",
|
193 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
194 |
-
"Description": "Description",
|
195 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
196 |
"Clear_btn": "Clear",
|
197 |
"Submit_btn": "Submit",
|
@@ -217,7 +217,7 @@
|
|
217 |
"Concept": "Main Concept",
|
218 |
"Image": "Image",
|
219 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
220 |
-
"Description": "Description",
|
221 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
222 |
"Clear_btn": "Clear",
|
223 |
"Submit_btn": "Submit",
|
@@ -243,7 +243,7 @@
|
|
243 |
"Concept": "Main Concept",
|
244 |
"Image": "Image",
|
245 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
246 |
-
"Description": "Description",
|
247 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
248 |
"Clear_btn": "Clear",
|
249 |
"Submit_btn": "Submit",
|
@@ -269,7 +269,7 @@
|
|
269 |
"Concept": "Main Concept",
|
270 |
"Image": "Image",
|
271 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
272 |
-
"Description": "Description",
|
273 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
274 |
"Clear_btn": "Clear",
|
275 |
"Submit_btn": "Submit",
|
@@ -295,7 +295,7 @@
|
|
295 |
"Concept": "Main Concept",
|
296 |
"Image": "Image",
|
297 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
298 |
-
"Description": "Description",
|
299 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
300 |
"Clear_btn": "Clear",
|
301 |
"Submit_btn": "Submit",
|
@@ -321,7 +321,7 @@
|
|
321 |
"Concept": "Main Concept",
|
322 |
"Image": "Image",
|
323 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
324 |
-
"Description": "Description",
|
325 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
326 |
"Clear_btn": "Clear",
|
327 |
"Submit_btn": "Submit",
|
@@ -345,7 +345,7 @@
|
|
345 |
"Concept": "Main Concept",
|
346 |
"Image": "Image",
|
347 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
348 |
-
"Description": "Description",
|
349 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
350 |
"Clear_btn": "Clear",
|
351 |
"Submit_btn": "Submit",
|
@@ -371,7 +371,7 @@
|
|
371 |
"Concept": "Main Concept",
|
372 |
"Image": "Image",
|
373 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
374 |
-
"Description": "Description",
|
375 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
376 |
"Clear_btn": "Clear",
|
377 |
"Submit_btn": "Submit",
|
@@ -397,7 +397,7 @@
|
|
397 |
"Concept": "Main Concept",
|
398 |
"Image": "Image",
|
399 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
400 |
-
"Description": "Description",
|
401 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
402 |
"Clear_btn": "Clear",
|
403 |
"Submit_btn": "Submit",
|
@@ -423,7 +423,7 @@
|
|
423 |
"Concept": "Main Concept",
|
424 |
"Image": "Image",
|
425 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
426 |
-
"Description": "Description",
|
427 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
428 |
"Clear_btn": "Clear",
|
429 |
"Submit_btn": "Submit",
|
@@ -449,7 +449,7 @@
|
|
449 |
"Concept": "Main Concept",
|
450 |
"Image": "Image",
|
451 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
452 |
-
"Description": "Description",
|
453 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
454 |
"Clear_btn": "Clear",
|
455 |
"Submit_btn": "Submit",
|
@@ -475,7 +475,7 @@
|
|
475 |
"Concept": "Main Concept",
|
476 |
"Image": "Image",
|
477 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
478 |
-
"Description": "Description",
|
479 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
480 |
"Clear_btn": "Clear",
|
481 |
"Submit_btn": "Submit",
|
@@ -499,7 +499,7 @@
|
|
499 |
"Concept": "Main Concept",
|
500 |
"Image": "Image",
|
501 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
502 |
-
"Description": "Description",
|
503 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
504 |
"Clear_btn": "Clear",
|
505 |
"Submit_btn": "Submit",
|
@@ -525,7 +525,7 @@
|
|
525 |
"Concept": "Main Concept",
|
526 |
"Image": "Image",
|
527 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
528 |
-
"Description": "Description",
|
529 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
530 |
"Clear_btn": "Clear",
|
531 |
"Submit_btn": "Submit",
|
@@ -551,7 +551,7 @@
|
|
551 |
"Concept": "Main Concept",
|
552 |
"Image": "Image",
|
553 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
554 |
-
"Description": "Description",
|
555 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
556 |
"Clear_btn": "Clear",
|
557 |
"Submit_btn": "Submit",
|
@@ -575,7 +575,7 @@
|
|
575 |
"Concept": "Main Concept",
|
576 |
"Image": "Image",
|
577 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
578 |
-
"Description": "Description",
|
579 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
580 |
"Clear_btn": "Clear",
|
581 |
"Submit_btn": "Submit",
|
@@ -599,7 +599,7 @@
|
|
599 |
"Concept": "Main Concept",
|
600 |
"Image": "Image",
|
601 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
602 |
-
"Description": "Description",
|
603 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
604 |
"Clear_btn": "Clear",
|
605 |
"Submit_btn": "Submit",
|
@@ -625,7 +625,7 @@
|
|
625 |
"Concept": "Main Concept",
|
626 |
"Image": "Image",
|
627 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
628 |
-
"Description": "Description",
|
629 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
630 |
"Clear_btn": "Clear",
|
631 |
"Submit_btn": "Submit",
|
@@ -651,7 +651,7 @@
|
|
651 |
"Concept": "Main Concept",
|
652 |
"Image": "Image",
|
653 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
654 |
-
"Description": "Description",
|
655 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
656 |
"Clear_btn": "Clear",
|
657 |
"Submit_btn": "Submit",
|
@@ -701,7 +701,7 @@
|
|
701 |
"Concept": "Main Concept",
|
702 |
"Image": "Image",
|
703 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
704 |
-
"Description": "Description",
|
705 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
706 |
"Clear_btn": "Clear",
|
707 |
"Submit_btn": "Submit",
|
@@ -725,7 +725,7 @@
|
|
725 |
"Concept": "Main Concept",
|
726 |
"Image": "Image",
|
727 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
728 |
-
"Description": "Description",
|
729 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
730 |
"Clear_btn": "Clear",
|
731 |
"Submit_btn": "Submit",
|
@@ -749,7 +749,7 @@
|
|
749 |
"Concept": "Main Concept",
|
750 |
"Image": "Image",
|
751 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
752 |
-
"Description": "Description",
|
753 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
754 |
"Clear_btn": "Clear",
|
755 |
"Submit_btn": "Submit",
|
@@ -773,7 +773,7 @@
|
|
773 |
"Concept": "Main Concept",
|
774 |
"Image": "Image",
|
775 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
776 |
-
"Description": "Description",
|
777 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
778 |
"Clear_btn": "Clear",
|
779 |
"Submit_btn": "Submit",
|
@@ -797,7 +797,7 @@
|
|
797 |
"Concept": "Main Concept",
|
798 |
"Image": "Image",
|
799 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
800 |
-
"Description": "Description",
|
801 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
802 |
"Clear_btn": "Clear",
|
803 |
"Submit_btn": "Submit",
|
@@ -821,7 +821,7 @@
|
|
821 |
"Concept": "Main Concept",
|
822 |
"Image": "Image",
|
823 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
824 |
-
"Description": "Description",
|
825 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
826 |
"Clear_btn": "Clear",
|
827 |
"Submit_btn": "Submit",
|
@@ -845,7 +845,7 @@
|
|
845 |
"Concept": "Main Concept",
|
846 |
"Image": "Image",
|
847 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
848 |
-
"Description": "Description",
|
849 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
850 |
"Clear_btn": "Clear",
|
851 |
"Submit_btn": "Submit",
|
@@ -871,7 +871,7 @@
|
|
871 |
"Concept": "Main Concept",
|
872 |
"Image": "Image",
|
873 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
874 |
-
"Description": "Description",
|
875 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
876 |
"Clear_btn": "Clear",
|
877 |
"Submit_btn": "Submit",
|
@@ -895,7 +895,7 @@
|
|
895 |
"Concept": "Main Concept",
|
896 |
"Image": "Image",
|
897 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
898 |
-
"Description": "Description",
|
899 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
900 |
"Clear_btn": "Clear",
|
901 |
"Submit_btn": "Submit",
|
@@ -921,7 +921,7 @@
|
|
921 |
"Concept": "Main Concept",
|
922 |
"Image": "Image",
|
923 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
924 |
-
"Description": "Description",
|
925 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
926 |
"Clear_btn": "Clear",
|
927 |
"Submit_btn": "Submit",
|
@@ -947,7 +947,7 @@
|
|
947 |
"Concept": "Main Concept",
|
948 |
"Image": "Image",
|
949 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
950 |
-
"Description": "Description",
|
951 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
952 |
"Clear_btn": "Clear",
|
953 |
"Submit_btn": "Submit",
|
@@ -973,7 +973,7 @@
|
|
973 |
"Concept": "Main Concept",
|
974 |
"Image": "Image",
|
975 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
976 |
-
"Description": "Description",
|
977 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
978 |
"Clear_btn": "Clear",
|
979 |
"Submit_btn": "Submit",
|
@@ -999,7 +999,7 @@
|
|
999 |
"Concept": "Main Concept",
|
1000 |
"Image": "Image",
|
1001 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1002 |
-
"Description": "Description",
|
1003 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1004 |
"Clear_btn": "Clear",
|
1005 |
"Submit_btn": "Submit",
|
@@ -1025,7 +1025,7 @@
|
|
1025 |
"Concept": "Main Concept",
|
1026 |
"Image": "Image",
|
1027 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1028 |
-
"Description": "Description",
|
1029 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1030 |
"Clear_btn": "Clear",
|
1031 |
"Submit_btn": "Submit",
|
@@ -1051,7 +1051,7 @@
|
|
1051 |
"Concept": "Main Concept",
|
1052 |
"Image": "Image",
|
1053 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1054 |
-
"Description": "Description",
|
1055 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1056 |
"Clear_btn": "Clear",
|
1057 |
"Submit_btn": "Submit",
|
@@ -1077,7 +1077,7 @@
|
|
1077 |
"Concept": "Main Concept",
|
1078 |
"Image": "Image",
|
1079 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1080 |
-
"Description": "Description",
|
1081 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1082 |
"Clear_btn": "Clear",
|
1083 |
"Submit_btn": "Submit",
|
@@ -1101,7 +1101,7 @@
|
|
1101 |
"Concept": "Main Concept",
|
1102 |
"Image": "Image",
|
1103 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1104 |
-
"Description": "Description",
|
1105 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1106 |
"Clear_btn": "Clear",
|
1107 |
"Submit_btn": "Submit",
|
@@ -1127,7 +1127,7 @@
|
|
1127 |
"Concept": "Main Concept",
|
1128 |
"Image": "Image",
|
1129 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1130 |
-
"Description": "Description",
|
1131 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1132 |
"Clear_btn": "Clear",
|
1133 |
"Submit_btn": "Submit",
|
@@ -1153,7 +1153,7 @@
|
|
1153 |
"Concept": "Main Concept",
|
1154 |
"Image": "Image",
|
1155 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1156 |
-
"Description": "Description",
|
1157 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1158 |
"Clear_btn": "Clear",
|
1159 |
"Submit_btn": "Submit",
|
@@ -1179,7 +1179,7 @@
|
|
1179 |
"Concept": "Main Concept",
|
1180 |
"Image": "Image",
|
1181 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1182 |
-
"Description": "Description",
|
1183 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1184 |
"Clear_btn": "Clear",
|
1185 |
"Submit_btn": "Submit",
|
@@ -1205,7 +1205,7 @@
|
|
1205 |
"Concept": "Main Concept",
|
1206 |
"Image": "Image",
|
1207 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1208 |
-
"Description": "Description",
|
1209 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1210 |
"Clear_btn": "Clear",
|
1211 |
"Submit_btn": "Submit",
|
@@ -1231,7 +1231,7 @@
|
|
1231 |
"Concept": "Main Concept",
|
1232 |
"Image": "Image",
|
1233 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1234 |
-
"Description": "Description",
|
1235 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1236 |
"Clear_btn": "Clear",
|
1237 |
"Submit_btn": "Submit",
|
@@ -1257,7 +1257,7 @@
|
|
1257 |
"Concept": "Main Concept",
|
1258 |
"Image": "Image",
|
1259 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1260 |
-
"Description": "Description",
|
1261 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1262 |
"Clear_btn": "Clear",
|
1263 |
"Submit_btn": "Submit",
|
@@ -1283,7 +1283,7 @@
|
|
1283 |
"Concept": "Main Concept",
|
1284 |
"Image": "Image",
|
1285 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1286 |
-
"Description": "Description",
|
1287 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1288 |
"Clear_btn": "Clear",
|
1289 |
"Submit_btn": "Submit",
|
@@ -1309,7 +1309,7 @@
|
|
1309 |
"Concept": "Main Concept",
|
1310 |
"Image": "Image",
|
1311 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1312 |
-
"Description": "Description",
|
1313 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1314 |
"Clear_btn": "Clear",
|
1315 |
"Submit_btn": "Submit",
|
@@ -1335,7 +1335,7 @@
|
|
1335 |
"Concept": "Main Concept",
|
1336 |
"Image": "Image",
|
1337 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1338 |
-
"Description": "Description",
|
1339 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1340 |
"Clear_btn": "Clear",
|
1341 |
"Submit_btn": "Submit",
|
@@ -1361,7 +1361,7 @@
|
|
1361 |
"Concept": "Main Concept",
|
1362 |
"Image": "Image",
|
1363 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1364 |
-
"Description": "Description",
|
1365 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1366 |
"Clear_btn": "Clear",
|
1367 |
"Submit_btn": "Submit",
|
@@ -1387,7 +1387,7 @@
|
|
1387 |
"Concept": "Main Concept",
|
1388 |
"Image": "Image",
|
1389 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1390 |
-
"Description": "Description",
|
1391 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1392 |
"Clear_btn": "Clear",
|
1393 |
"Submit_btn": "Submit",
|
@@ -1413,7 +1413,7 @@
|
|
1413 |
"Concept": "Main Concept",
|
1414 |
"Image": "Image",
|
1415 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1416 |
-
"Description": "Description",
|
1417 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1418 |
"Clear_btn": "Clear",
|
1419 |
"Submit_btn": "Submit",
|
@@ -1439,7 +1439,7 @@
|
|
1439 |
"Concept": "Main Concept",
|
1440 |
"Image": "Image",
|
1441 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1442 |
-
"Description": "Description",
|
1443 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1444 |
"Clear_btn": "Clear",
|
1445 |
"Submit_btn": "Submit",
|
@@ -1465,7 +1465,7 @@
|
|
1465 |
"Concept": "Main Concept",
|
1466 |
"Image": "Image",
|
1467 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1468 |
-
"Description": "Description",
|
1469 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1470 |
"Clear_btn": "Clear",
|
1471 |
"Submit_btn": "Submit",
|
@@ -1491,7 +1491,7 @@
|
|
1491 |
"Concept": "Main Concept",
|
1492 |
"Image": "Image",
|
1493 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1494 |
-
"Description": "Description",
|
1495 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1496 |
"Clear_btn": "Clear",
|
1497 |
"Submit_btn": "Submit",
|
@@ -1517,7 +1517,7 @@
|
|
1517 |
"Concept": "Main Concept",
|
1518 |
"Image": "Image",
|
1519 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1520 |
-
"Description": "Description",
|
1521 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1522 |
"Clear_btn": "Clear",
|
1523 |
"Submit_btn": "Submit",
|
@@ -1543,7 +1543,7 @@
|
|
1543 |
"Concept": "Main Concept",
|
1544 |
"Image": "Image",
|
1545 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1546 |
-
"Description": "Description",
|
1547 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1548 |
"Clear_btn": "Clear",
|
1549 |
"Submit_btn": "Submit",
|
@@ -1569,7 +1569,7 @@
|
|
1569 |
"Concept": "Main Concept",
|
1570 |
"Image": "Image",
|
1571 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1572 |
-
"Description": "Description",
|
1573 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1574 |
"Clear_btn": "Clear",
|
1575 |
"Submit_btn": "Submit",
|
@@ -1595,7 +1595,7 @@
|
|
1595 |
"Concept": "Main Concept",
|
1596 |
"Image": "Image",
|
1597 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1598 |
-
"Description": "Description",
|
1599 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1600 |
"Clear_btn": "Clear",
|
1601 |
"Submit_btn": "Submit",
|
@@ -1621,7 +1621,7 @@
|
|
1621 |
"Concept": "Main Concept",
|
1622 |
"Image": "Image",
|
1623 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1624 |
-
"Description": "Description",
|
1625 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1626 |
"Clear_btn": "Clear",
|
1627 |
"Submit_btn": "Submit",
|
@@ -1647,7 +1647,7 @@
|
|
1647 |
"Concept": "Main Concept",
|
1648 |
"Image": "Image",
|
1649 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1650 |
-
"Description": "Description",
|
1651 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1652 |
"Clear_btn": "Clear",
|
1653 |
"Submit_btn": "Submit",
|
@@ -1671,7 +1671,7 @@
|
|
1671 |
"Concept": "Main Concept",
|
1672 |
"Image": "Image",
|
1673 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1674 |
-
"Description": "Description",
|
1675 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1676 |
"Clear_btn": "Clear",
|
1677 |
"Submit_btn": "Submit",
|
|
|
8 |
"Password": "Password (Optional)",
|
9 |
"Concept": "Main Concept",
|
10 |
"Image": "Image",
|
11 |
+
"Image_URL": "Image URL (optional, if no image is uploaded)",
|
12 |
+
"Description": "Description in English",
|
13 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
14 |
"Clear_btn": "Clear",
|
15 |
"Submit_btn": "Submit",
|
|
|
34 |
"Password": "Password (Optional)",
|
35 |
"Concept": "Main Concept",
|
36 |
"Image": "Image",
|
37 |
+
"Image_URL": "Image URL (optional, if no image is uploaded)",
|
38 |
+
"Description": "Description in Italian",
|
39 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
40 |
"Clear_btn": "Clear",
|
41 |
"Submit_btn": "Submit",
|
|
|
61 |
"Concept": "Main Concept",
|
62 |
"Image": "Image",
|
63 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
64 |
+
"Description": "Description in French",
|
65 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
66 |
"Clear_btn": "Clear",
|
67 |
"Submit_btn": "Submit",
|
|
|
87 |
"Concept": "Main Concept",
|
88 |
"Image": "Image",
|
89 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
90 |
+
"Description": "Description in Spanish",
|
91 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
92 |
"Clear_btn": "Clear",
|
93 |
"Submit_btn": "Submit",
|
|
|
113 |
"Concept": "Main Concept",
|
114 |
"Image": "Image",
|
115 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
116 |
+
"Description": "Description in Arabic",
|
117 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
118 |
"Clear_btn": "Clear",
|
119 |
"Submit_btn": "Submit",
|
|
|
139 |
"Concept": "Main Concept",
|
140 |
"Image": "Image",
|
141 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
142 |
+
"Description": "Description in Spanish",
|
143 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
144 |
"Clear_btn": "Clear",
|
145 |
"Submit_btn": "Submit",
|
|
|
165 |
"Concept": "Main Concept",
|
166 |
"Image": "Image",
|
167 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
168 |
+
"Description": "Description in English",
|
169 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
170 |
"Clear_btn": "Clear",
|
171 |
"Submit_btn": "Submit",
|
|
|
191 |
"Concept": "Main Concept",
|
192 |
"Image": "Image",
|
193 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
194 |
+
"Description": "Description in Bengali",
|
195 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
196 |
"Clear_btn": "Clear",
|
197 |
"Submit_btn": "Submit",
|
|
|
217 |
"Concept": "Main Concept",
|
218 |
"Image": "Image",
|
219 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
220 |
+
"Description": "Description in French",
|
221 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
222 |
"Clear_btn": "Clear",
|
223 |
"Submit_btn": "Submit",
|
|
|
243 |
"Concept": "Main Concept",
|
244 |
"Image": "Image",
|
245 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
246 |
+
"Description": "Description in Portuguese",
|
247 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
248 |
"Clear_btn": "Clear",
|
249 |
"Submit_btn": "Submit",
|
|
|
269 |
"Concept": "Main Concept",
|
270 |
"Image": "Image",
|
271 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
272 |
+
"Description": "Description in Bulgarian",
|
273 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
274 |
"Clear_btn": "Clear",
|
275 |
"Submit_btn": "Submit",
|
|
|
295 |
"Concept": "Main Concept",
|
296 |
"Image": "Image",
|
297 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
298 |
+
"Description": "Description in Spanish",
|
299 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
300 |
"Clear_btn": "Clear",
|
301 |
"Submit_btn": "Submit",
|
|
|
321 |
"Concept": "Main Concept",
|
322 |
"Image": "Image",
|
323 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
324 |
+
"Description": "Description in Mandarin Chinese",
|
325 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
326 |
"Clear_btn": "Clear",
|
327 |
"Submit_btn": "Submit",
|
|
|
345 |
"Concept": "Main Concept",
|
346 |
"Image": "Image",
|
347 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
348 |
+
"Description": "Description in Yue Chinese",
|
349 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
350 |
"Clear_btn": "Clear",
|
351 |
"Submit_btn": "Submit",
|
|
|
371 |
"Concept": "Main Concept",
|
372 |
"Image": "Image",
|
373 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
374 |
+
"Description": "Description in Czech",
|
375 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
376 |
"Clear_btn": "Clear",
|
377 |
"Submit_btn": "Submit",
|
|
|
397 |
"Concept": "Main Concept",
|
398 |
"Image": "Image",
|
399 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
400 |
+
"Description": "Description in Danish",
|
401 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
402 |
"Clear_btn": "Clear",
|
403 |
"Submit_btn": "Submit",
|
|
|
423 |
"Concept": "Main Concept",
|
424 |
"Image": "Image",
|
425 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
426 |
+
"Description": "Description in Spanish",
|
427 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
428 |
"Clear_btn": "Clear",
|
429 |
"Submit_btn": "Submit",
|
|
|
449 |
"Concept": "Main Concept",
|
450 |
"Image": "Image",
|
451 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
452 |
+
"Description": "Description in Egyptian Arabic",
|
453 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
454 |
"Clear_btn": "Clear",
|
455 |
"Submit_btn": "Submit",
|
|
|
475 |
"Concept": "Main Concept",
|
476 |
"Image": "Image",
|
477 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
478 |
+
"Description": "Description in Oromo",
|
479 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
480 |
"Clear_btn": "Clear",
|
481 |
"Submit_btn": "Submit",
|
|
|
499 |
"Concept": "Main Concept",
|
500 |
"Image": "Image",
|
501 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
502 |
+
"Description": "Description in Amharic",
|
503 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
504 |
"Clear_btn": "Clear",
|
505 |
"Submit_btn": "Submit",
|
|
|
525 |
"Concept": "Main Concept",
|
526 |
"Image": "Image",
|
527 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
528 |
+
"Description": "Description in German",
|
529 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
530 |
"Clear_btn": "Clear",
|
531 |
"Submit_btn": "Submit",
|
|
|
551 |
"Concept": "Main Concept",
|
552 |
"Image": "Image",
|
553 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
554 |
+
"Description": "Description in Twi",
|
555 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
556 |
"Clear_btn": "Clear",
|
557 |
"Submit_btn": "Submit",
|
|
|
575 |
"Concept": "Main Concept",
|
576 |
"Image": "Image",
|
577 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
578 |
+
"Description": "Description in Fante",
|
579 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
580 |
"Clear_btn": "Clear",
|
581 |
"Submit_btn": "Submit",
|
|
|
599 |
"Concept": "Main Concept",
|
600 |
"Image": "Image",
|
601 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
602 |
+
"Description": "Description in GA",
|
603 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
604 |
"Clear_btn": "Clear",
|
605 |
"Submit_btn": "Submit",
|
|
|
625 |
"Concept": "Main Concept",
|
626 |
"Image": "Image",
|
627 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
628 |
+
"Description": "Description in Greek",
|
629 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
630 |
"Clear_btn": "Clear",
|
631 |
"Submit_btn": "Submit",
|
|
|
651 |
"Concept": "Main Concept",
|
652 |
"Image": "Image",
|
653 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
654 |
+
"Description": "Description in Hungarian",
|
655 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
656 |
"Clear_btn": "Clear",
|
657 |
"Submit_btn": "Submit",
|
|
|
701 |
"Concept": "Main Concept",
|
702 |
"Image": "Image",
|
703 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
704 |
+
"Description": "Description in Kannada",
|
705 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
706 |
"Clear_btn": "Clear",
|
707 |
"Submit_btn": "Submit",
|
|
|
725 |
"Concept": "Main Concept",
|
726 |
"Image": "Image",
|
727 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
728 |
+
"Description": "Description in Telugu",
|
729 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
730 |
"Clear_btn": "Clear",
|
731 |
"Submit_btn": "Submit",
|
|
|
749 |
"Concept": "Main Concept",
|
750 |
"Image": "Image",
|
751 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
752 |
+
"Description": "Description in Tamil",
|
753 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
754 |
"Clear_btn": "Clear",
|
755 |
"Submit_btn": "Submit",
|
|
|
773 |
"Concept": "Main Concept",
|
774 |
"Image": "Image",
|
775 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
776 |
+
"Description": "Description in Hindi",
|
777 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
778 |
"Clear_btn": "Clear",
|
779 |
"Submit_btn": "Submit",
|
|
|
797 |
"Concept": "Main Concept",
|
798 |
"Image": "Image",
|
799 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
800 |
+
"Description": "Description in Bengali",
|
801 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
802 |
"Clear_btn": "Clear",
|
803 |
"Submit_btn": "Submit",
|
|
|
821 |
"Concept": "Main Concept",
|
822 |
"Image": "Image",
|
823 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
824 |
+
"Description": "Description in Marathi",
|
825 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
826 |
"Clear_btn": "Clear",
|
827 |
"Submit_btn": "Submit",
|
|
|
845 |
"Concept": "Main Concept",
|
846 |
"Image": "Image",
|
847 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
848 |
+
"Description": "Description in Urdu",
|
849 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
850 |
"Clear_btn": "Clear",
|
851 |
"Submit_btn": "Submit",
|
|
|
871 |
"Concept": "Main Concept",
|
872 |
"Image": "Image",
|
873 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
874 |
+
"Description": "Description in Javanese",
|
875 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
876 |
"Clear_btn": "Clear",
|
877 |
"Submit_btn": "Submit",
|
|
|
895 |
"Concept": "Main Concept",
|
896 |
"Image": "Image",
|
897 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
898 |
+
"Description": "Description in Indonesian",
|
899 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
900 |
"Clear_btn": "Clear",
|
901 |
"Submit_btn": "Submit",
|
|
|
921 |
"Concept": "Main Concept",
|
922 |
"Image": "Image",
|
923 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
924 |
+
"Description": "Description in Hebrew",
|
925 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
926 |
"Clear_btn": "Clear",
|
927 |
"Submit_btn": "Submit",
|
|
|
947 |
"Concept": "Main Concept",
|
948 |
"Image": "Image",
|
949 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
950 |
+
"Description": "Description in Japanese",
|
951 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
952 |
"Clear_btn": "Clear",
|
953 |
"Submit_btn": "Submit",
|
|
|
973 |
"Concept": "Main Concept",
|
974 |
"Image": "Image",
|
975 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
976 |
+
"Description": "Description in Jordanian",
|
977 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
978 |
"Clear_btn": "Clear",
|
979 |
"Submit_btn": "Submit",
|
|
|
999 |
"Concept": "Main Concept",
|
1000 |
"Image": "Image",
|
1001 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1002 |
+
"Description": "Description in Spanish",
|
1003 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1004 |
"Clear_btn": "Clear",
|
1005 |
"Submit_btn": "Submit",
|
|
|
1025 |
"Concept": "Main Concept",
|
1026 |
"Image": "Image",
|
1027 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1028 |
+
"Description": "Description in Moroccan Arabic",
|
1029 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1030 |
"Clear_btn": "Clear",
|
1031 |
"Submit_btn": "Submit",
|
|
|
1051 |
"Concept": "Main Concept",
|
1052 |
"Image": "Image",
|
1053 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1054 |
+
"Description": "Description in Dutch",
|
1055 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1056 |
"Clear_btn": "Clear",
|
1057 |
"Submit_btn": "Submit",
|
|
|
1077 |
"Concept": "Main Concept",
|
1078 |
"Image": "Image",
|
1079 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1080 |
+
"Description": "Description in Yoruba",
|
1081 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1082 |
"Clear_btn": "Clear",
|
1083 |
"Submit_btn": "Submit",
|
|
|
1101 |
"Concept": "Main Concept",
|
1102 |
"Image": "Image",
|
1103 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1104 |
+
"Description": "Description in Hausa",
|
1105 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1106 |
"Clear_btn": "Clear",
|
1107 |
"Submit_btn": "Submit",
|
|
|
1127 |
"Concept": "Main Concept",
|
1128 |
"Image": "Image",
|
1129 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1130 |
+
"Description": "Description in Tagalog",
|
1131 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1132 |
"Clear_btn": "Clear",
|
1133 |
"Submit_btn": "Submit",
|
|
|
1153 |
"Concept": "Main Concept",
|
1154 |
"Image": "Image",
|
1155 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1156 |
+
"Description": "Description in Polish",
|
1157 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1158 |
"Clear_btn": "Clear",
|
1159 |
"Submit_btn": "Submit",
|
|
|
1179 |
"Concept": "Main Concept",
|
1180 |
"Image": "Image",
|
1181 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1182 |
+
"Description": "Description in Portuguese",
|
1183 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1184 |
"Clear_btn": "Clear",
|
1185 |
"Submit_btn": "Submit",
|
|
|
1205 |
"Concept": "Main Concept",
|
1206 |
"Image": "Image",
|
1207 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1208 |
+
"Description": "Description in Romanian",
|
1209 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1210 |
"Clear_btn": "Clear",
|
1211 |
"Submit_btn": "Submit",
|
|
|
1231 |
"Concept": "Main Concept",
|
1232 |
"Image": "Image",
|
1233 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1234 |
+
"Description": "Description in Russian",
|
1235 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1236 |
"Clear_btn": "Clear",
|
1237 |
"Submit_btn": "Submit",
|
|
|
1257 |
"Concept": "Main Concept",
|
1258 |
"Image": "Image",
|
1259 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1260 |
+
"Description": "Description in Kinyarwanda",
|
1261 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1262 |
"Clear_btn": "Clear",
|
1263 |
"Submit_btn": "Submit",
|
|
|
1283 |
"Concept": "Main Concept",
|
1284 |
"Image": "Image",
|
1285 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1286 |
+
"Description": "Description in Mandarin Chinese",
|
1287 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1288 |
"Clear_btn": "Clear",
|
1289 |
"Submit_btn": "Submit",
|
|
|
1309 |
"Concept": "Main Concept",
|
1310 |
"Image": "Image",
|
1311 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1312 |
+
"Description": "Description in Korean",
|
1313 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1314 |
"Clear_btn": "Clear",
|
1315 |
"Submit_btn": "Submit",
|
|
|
1335 |
"Concept": "Main Concept",
|
1336 |
"Image": "Image",
|
1337 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1338 |
+
"Description": "Description in Spanish",
|
1339 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1340 |
"Clear_btn": "Clear",
|
1341 |
"Submit_btn": "Submit",
|
|
|
1361 |
"Concept": "Main Concept",
|
1362 |
"Image": "Image",
|
1363 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1364 |
+
"Description": "Description in German",
|
1365 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1366 |
"Clear_btn": "Clear",
|
1367 |
"Submit_btn": "Submit",
|
|
|
1387 |
"Concept": "Main Concept",
|
1388 |
"Image": "Image",
|
1389 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1390 |
+
"Description": "Description in Swahili",
|
1391 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1392 |
"Clear_btn": "Clear",
|
1393 |
"Submit_btn": "Submit",
|
|
|
1413 |
"Concept": "Main Concept",
|
1414 |
"Image": "Image",
|
1415 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1416 |
+
"Description": "Description in Turkish",
|
1417 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1418 |
"Clear_btn": "Clear",
|
1419 |
"Submit_btn": "Submit",
|
|
|
1439 |
"Concept": "Main Concept",
|
1440 |
"Image": "Image",
|
1441 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1442 |
+
"Description": "Description in Ukranian",
|
1443 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1444 |
"Clear_btn": "Clear",
|
1445 |
"Submit_btn": "Submit",
|
|
|
1465 |
"Concept": "Main Concept",
|
1466 |
"Image": "Image",
|
1467 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1468 |
+
"Description": "Description in Uzbek",
|
1469 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1470 |
"Clear_btn": "Clear",
|
1471 |
"Submit_btn": "Submit",
|
|
|
1491 |
"Concept": "Main Concept",
|
1492 |
"Image": "Image",
|
1493 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1494 |
+
"Description": "Description in Vietnamese",
|
1495 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1496 |
"Clear_btn": "Clear",
|
1497 |
"Submit_btn": "Submit",
|
|
|
1517 |
"Concept": "Main Concept",
|
1518 |
"Image": "Image",
|
1519 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1520 |
+
"Description": "Description in Swahili",
|
1521 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1522 |
"Clear_btn": "Clear",
|
1523 |
"Submit_btn": "Submit",
|
|
|
1543 |
"Concept": "Main Concept",
|
1544 |
"Image": "Image",
|
1545 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1546 |
+
"Description": "Description in Somali",
|
1547 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1548 |
"Clear_btn": "Clear",
|
1549 |
"Submit_btn": "Submit",
|
|
|
1569 |
"Concept": "Main Concept",
|
1570 |
"Image": "Image",
|
1571 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1572 |
+
"Description": "Description in Thai",
|
1573 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1574 |
"Clear_btn": "Clear",
|
1575 |
"Submit_btn": "Submit",
|
|
|
1595 |
"Concept": "Main Concept",
|
1596 |
"Image": "Image",
|
1597 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1598 |
+
"Description": "Description in Luganda",
|
1599 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1600 |
"Clear_btn": "Clear",
|
1601 |
"Submit_btn": "Submit",
|
|
|
1621 |
"Concept": "Main Concept",
|
1622 |
"Image": "Image",
|
1623 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1624 |
+
"Description": "Description in Spanish",
|
1625 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1626 |
"Clear_btn": "Clear",
|
1627 |
"Submit_btn": "Submit",
|
|
|
1647 |
"Concept": "Main Concept",
|
1648 |
"Image": "Image",
|
1649 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1650 |
+
"Description": "Description in Shona",
|
1651 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1652 |
"Clear_btn": "Clear",
|
1653 |
"Submit_btn": "Submit",
|
|
|
1671 |
"Concept": "Main Concept",
|
1672 |
"Image": "Image",
|
1673 |
"Image_URL": "Image URL (optional, if no image is loaded)",
|
1674 |
+
"Description": "Description in Ndebele",
|
1675 |
"Instructs_btn": "\ud83d\udcd8 Show instructions",
|
1676 |
"Clear_btn": "Clear",
|
1677 |
"Submit_btn": "Submit",
|
data/update_metadata_from_concepts.py
CHANGED
@@ -9,6 +9,9 @@ for country in concepts:
|
|
9 |
for language in concepts[country]:
|
10 |
if language not in meta[country]:
|
11 |
meta[country][language] = meta["USA"]["English"]
|
|
|
|
|
|
|
12 |
|
13 |
with open("metadata.json", "w", encoding="utf-8") as f:
|
14 |
json.dump(meta, f, indent=2)
|
|
|
9 |
for language in concepts[country]:
|
10 |
if language not in meta[country]:
|
11 |
meta[country][language] = meta["USA"]["English"]
|
12 |
+
# FIXME: Remove this after we ask language leads to translate
|
13 |
+
if not meta[country][language]["Description"].endswith(language):
|
14 |
+
meta[country][language]["Description"] += f"in {language}"
|
15 |
|
16 |
with open("metadata.json", "w", encoding="utf-8") as f:
|
17 |
json.dump(meta, f, indent=2)
|
logic/data_utils.py
CHANGED
@@ -169,7 +169,7 @@ class CustomHFDatasetSaver:
|
|
169 |
if values_dic.get("username"):
|
170 |
sample_dir = os.path.join("logged_in_users", values_dic["country"], values_dic["language"], values_dic["username"], str(current_timestamp))
|
171 |
else:
|
172 |
-
sample_dir = os.path.join("anonymous_users", values_dic["country"], values_dic["language"], str(uuid.uuid4()))
|
173 |
|
174 |
os.makedirs(os.path.join(self.local_ds_folder, sample_dir), exist_ok=True)
|
175 |
|
|
|
169 |
if values_dic.get("username"):
|
170 |
sample_dir = os.path.join("logged_in_users", values_dic["country"], values_dic["language"], values_dic["username"], str(current_timestamp))
|
171 |
else:
|
172 |
+
sample_dir = os.path.join("anonymous_users", values_dic["country"], values_dic["language"], str(uuid.uuid4()), str(current_timestamp))
|
173 |
|
174 |
os.makedirs(os.path.join(self.local_ds_folder, sample_dir), exist_ok=True)
|
175 |
|
logic/handlers.py
CHANGED
@@ -3,6 +3,8 @@ import datetime
|
|
3 |
import io
|
4 |
import PIL
|
5 |
import requests
|
|
|
|
|
6 |
from datasets import load_dataset, concatenate_datasets, Image
|
7 |
from data.lang2eng_map import lang2eng_mapping
|
8 |
from data.words_map import words_mapping
|
@@ -19,6 +21,25 @@ import time
|
|
19 |
import re
|
20 |
import os
|
21 |
import glob
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
def update_image(image_url):
|
24 |
try:
|
@@ -45,7 +66,11 @@ def update_timestamp():
|
|
45 |
return gr.Textbox(datetime.datetime.now().timestamp(), label="Timestamp", visible=False) # FIXME visible=False)
|
46 |
|
47 |
|
48 |
-
def clear_data():
|
|
|
|
|
|
|
|
|
49 |
return (None, None, None, None, None, gr.update(value=None),
|
50 |
gr.update(value=[]), gr.update(value=[]), gr.update(value=[]),
|
51 |
gr.update(value=[]), gr.update(value=[]))
|
@@ -59,11 +84,23 @@ def exit():
|
|
59 |
gr.update(value=None), gr.update(value=None))
|
60 |
|
61 |
|
62 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
# Perform your validation logic here
|
|
|
64 |
if image is None:
|
65 |
return gr.Button("Submit", variant="primary", interactive=False), None, None, # False
|
66 |
-
|
|
|
|
|
|
|
67 |
# Define maximum dimensions
|
68 |
MAX_WIDTH = 1024
|
69 |
MAX_HEIGHT = 1024
|
@@ -93,6 +130,24 @@ def validate_inputs(image, ori_img): # is_blurred
|
|
93 |
return gr.Button("Submit", variant="primary", interactive=True), result_image, ori_img # is_blurred
|
94 |
|
95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
def add_prefix(example, column_name, prefix):
|
97 |
example[column_name] = (f"{prefix}/" + example[column_name])
|
98 |
return example
|
@@ -135,7 +190,10 @@ def update_user_data(username, password, country, language_choice, HF_DATASET_NA
|
|
135 |
|
136 |
# Handle all empty
|
137 |
if not datasets_list:
|
138 |
-
|
|
|
|
|
|
|
139 |
|
140 |
dataset = concatenate_datasets(datasets_list)
|
141 |
# TODO: we should link username with password and language and country, otherwise there will be an error when loading with different language and clicking on the example
|
@@ -171,7 +229,33 @@ def update_user_data(username, password, country, language_choice, HF_DATASET_NA
|
|
171 |
d['image_file'], d['image_url'], d['caption'] or "", d['country'],
|
172 |
d['language'], d['category'], d['concept'], additional_concepts_by_category, d['id']] # d['is_blurred']
|
173 |
)
|
174 |
-
return gr.Dataset(samples=samples), None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
else:
|
176 |
# TODO: should we show the entire dataset instead? What about "other data" tab?
|
177 |
return gr.Dataset(samples=[]), None
|
@@ -181,13 +265,13 @@ def update_language(local_storage, metadata_dict, concepts_dict):
|
|
181 |
country, language, email, password, = local_storage
|
182 |
# my_translator = GoogleTranslator(source='english', target=metadata_dict[country][language])
|
183 |
categories = concepts_dict[country][lang2eng_mapping.get(language, language)]
|
|
|
184 |
if language in words_mapping:
|
185 |
-
categories_keys_translated = [words_mapping[language].get(cat, cat) for cat in
|
186 |
else:
|
187 |
-
categories_keys_translated =
|
188 |
|
189 |
# Get the 5 categories in alphabetical order
|
190 |
-
categories_list = sorted(list(categories.keys()))[:5]
|
191 |
|
192 |
# Create translated labels for the 5 categories
|
193 |
translated_categories = []
|
@@ -197,6 +281,15 @@ def update_language(local_storage, metadata_dict, concepts_dict):
|
|
197 |
else:
|
198 |
translated_cat = cat
|
199 |
translated_categories.append(translated_cat)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
200 |
|
201 |
fn = metadata_dict[country][language]["Task"]
|
202 |
if os.path.exists(fn):
|
@@ -222,7 +315,7 @@ def update_language(local_storage, metadata_dict, concepts_dict):
|
|
222 |
gr.update(label=metadata_dict[country][language]["Email"], value=email),
|
223 |
gr.update(label=metadata_dict[country][language]["Password"], value=password),
|
224 |
gr.update(choices=categories_keys_translated, interactive=True, label=metadata_dict[country][language]["Category"], allow_custom_value=False, elem_id="category_btn"),
|
225 |
-
gr.update(choices=
|
226 |
gr.update(label=metadata_dict[country][language]["Image"]),
|
227 |
gr.update(label=metadata_dict[country][language]["Image_URL"]),
|
228 |
gr.update(label=metadata_dict[country][language]["Description"]),
|
@@ -243,11 +336,11 @@ def update_language(local_storage, metadata_dict, concepts_dict):
|
|
243 |
gr.update(value=metadata_dict[country][language].get("Hide_btn","👤 Hide Specific Faces")),
|
244 |
gr.update(value=metadata_dict[country][language].get("Unhide_btn","👀 Unhide Faces")),
|
245 |
gr.update(value=metadata_dict[country][language].get("Exclude_btn","Exclude Selected Example")),
|
246 |
-
gr.update(label=translated_categories[0], choices=
|
247 |
-
gr.update(label=translated_categories[1], choices=
|
248 |
-
gr.update(label=translated_categories[2], choices=
|
249 |
-
gr.update(label=translated_categories[3], choices=
|
250 |
-
gr.update(label=translated_categories[4], choices=
|
251 |
)
|
252 |
|
253 |
|
@@ -265,20 +358,58 @@ def update_intro_language(selected_country, selected_language, intro_markdown, m
|
|
265 |
|
266 |
|
267 |
def handle_click_example(user_examples, concepts_dict):
|
268 |
-
print("handle_click_example")
|
269 |
-
print(user_examples)
|
270 |
-
ex = [item for item in user_examples]
|
271 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
272 |
image_inp = ex[0]
|
273 |
image_url_inp = ex[1]
|
274 |
long_caption_inp = ex[2]
|
275 |
-
country_btn = ex[3]
|
276 |
-
language_btn = ex[4]
|
277 |
category_btn = ex[5]
|
278 |
concept_btn = ex[6]
|
279 |
-
additional_concepts_by_category = ex[7]
|
280 |
exampleid_btn = ex[8]
|
281 |
-
additional_concepts_by_category = [[] if (len(cat_concept)==1 and cat_concept[0]=='') else cat_concept for cat_concept in additional_concepts_by_category]
|
282 |
|
283 |
# import pdb; pdb.set_trace()
|
284 |
# # excluded_btn = ex[10] # TODO: add functionality that if True "exclude" button changes to "excluded"
|
@@ -311,6 +442,16 @@ def handle_click_example(user_examples, concepts_dict):
|
|
311 |
|
312 |
# Need to return values for each category dropdown
|
313 |
return [image_inp, image_url_inp, long_caption_inp, exampleid_btn, category_btn, concept_btn] + additional_concepts_by_category + [True]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
314 |
|
315 |
|
316 |
def is_password_correct(hashed_password, entered_password):
|
@@ -352,16 +493,30 @@ def select_faces_to_hide(image, blur_faces_ids):
|
|
352 |
# pdb.set_trace()
|
353 |
# Draw detections with IDs
|
354 |
for face_id, face_data in enumerate(faces.values(), start=1):
|
355 |
-
|
356 |
-
|
357 |
-
|
358 |
-
|
359 |
-
|
360 |
-
|
361 |
-
|
362 |
-
#
|
363 |
-
|
364 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
365 |
# Update face count
|
366 |
face_count = len(faces)
|
367 |
blur_faces_ids = gr.update(choices=[f"Face ID: {i}" for i in range(1, face_count + 1)])
|
|
|
3 |
import io
|
4 |
import PIL
|
5 |
import requests
|
6 |
+
from typing import Literal
|
7 |
+
|
8 |
from datasets import load_dataset, concatenate_datasets, Image
|
9 |
from data.lang2eng_map import lang2eng_mapping
|
10 |
from data.words_map import words_mapping
|
|
|
21 |
import re
|
22 |
import os
|
23 |
import glob
|
24 |
+
from pyuca import Collator
|
25 |
+
from pillow_heif import register_heif_opener
|
26 |
+
register_heif_opener()
|
27 |
+
|
28 |
+
import spacy_udpipe
|
29 |
+
# ja_nlp = spacy.load("ja_core_news_sm")
|
30 |
+
# zh_nlp = spacy.load("zh_core_web_sm")
|
31 |
+
# import ja_core_news_sm
|
32 |
+
# import zh_core_web_sm
|
33 |
+
import spacy_thai
|
34 |
+
ja_nlp = spacy_udpipe.load("ja")
|
35 |
+
zh_nlp = spacy_udpipe.load("zh")
|
36 |
+
th_nlp = spacy_thai.load()
|
37 |
+
|
38 |
+
|
39 |
+
def sort_with_pyuca(strings):
|
40 |
+
collator = Collator()
|
41 |
+
return sorted(strings, key=collator.sort_key)
|
42 |
+
|
43 |
|
44 |
def update_image(image_url):
|
45 |
try:
|
|
|
66 |
return gr.Textbox(datetime.datetime.now().timestamp(), label="Timestamp", visible=False) # FIXME visible=False)
|
67 |
|
68 |
|
69 |
+
def clear_data(message: Literal["submit", "remove"] | None = None):
|
70 |
+
if message == "submit":
|
71 |
+
gr.Info("If you logged in, you will soon see it at the bottom of the page, where you can edit it or delete it", title="Thank you for submitting your data! 🎉", duration=5)
|
72 |
+
elif message == "remove":
|
73 |
+
gr.Info("", title="Your data has been deleted! 🗑️", duration=5)
|
74 |
return (None, None, None, None, None, gr.update(value=None),
|
75 |
gr.update(value=[]), gr.update(value=[]), gr.update(value=[]),
|
76 |
gr.update(value=[]), gr.update(value=[]))
|
|
|
84 |
gr.update(value=None), gr.update(value=None))
|
85 |
|
86 |
|
87 |
+
def validate_metadata(country, language):
|
88 |
+
# Perform your validation logic here
|
89 |
+
if country is None or language is None:
|
90 |
+
return gr.Button("Proceed", interactive=False)
|
91 |
+
|
92 |
+
return gr.Button("Proceed", interactive=True)
|
93 |
+
|
94 |
+
|
95 |
+
def validate_inputs(image, ori_img, concept): # is_blurred
|
96 |
# Perform your validation logic here
|
97 |
+
# import pdb; pdb.set_trace()
|
98 |
if image is None:
|
99 |
return gr.Button("Submit", variant="primary", interactive=False), None, None, # False
|
100 |
+
|
101 |
+
if concept is None:
|
102 |
+
raise gr.Error("⚠️ Please select the main concept first. Click the ❌ on the image uploader to reset the image.", duration=10)
|
103 |
+
return gr.Button("Submit", variant="primary", interactive=False), None, None, # False
|
104 |
# Define maximum dimensions
|
105 |
MAX_WIDTH = 1024
|
106 |
MAX_HEIGHT = 1024
|
|
|
130 |
return gr.Button("Submit", variant="primary", interactive=True), result_image, ori_img # is_blurred
|
131 |
|
132 |
|
133 |
+
def count_words(caption, language):
|
134 |
+
match language:
|
135 |
+
case "Japanese":
|
136 |
+
doc = ja_nlp(caption)
|
137 |
+
tokens = [tok.text for tok in doc if not tok.is_punct]
|
138 |
+
num_words = len(tokens)
|
139 |
+
case "Chinese":
|
140 |
+
doc = zh_nlp(caption)
|
141 |
+
tokens = [tok.text for tok in doc if not tok.is_punct]
|
142 |
+
num_words = len(tokens)
|
143 |
+
case "Thai":
|
144 |
+
num_words = len(th_nlp(caption))
|
145 |
+
case _:
|
146 |
+
num_words = len(caption.split())
|
147 |
+
return num_words
|
148 |
+
# return gr.Markdown(f"Number of words: {num_words}")
|
149 |
+
|
150 |
+
|
151 |
def add_prefix(example, column_name, prefix):
|
152 |
example[column_name] = (f"{prefix}/" + example[column_name])
|
153 |
return example
|
|
|
190 |
|
191 |
# Handle all empty
|
192 |
if not datasets_list:
|
193 |
+
if username: # User is logged in but has no data
|
194 |
+
return gr.Dataset(samples=[]), gr.Markdown("<p style='color: red;'>No data available for this user. Please upload an image.</p>")
|
195 |
+
else: # No user logged in
|
196 |
+
return gr.Dataset(samples=[]), gr.Markdown("")
|
197 |
|
198 |
dataset = concatenate_datasets(datasets_list)
|
199 |
# TODO: we should link username with password and language and country, otherwise there will be an error when loading with different language and clicking on the example
|
|
|
229 |
d['image_file'], d['image_url'], d['caption'] or "", d['country'],
|
230 |
d['language'], d['category'], d['concept'], additional_concepts_by_category, d['id']] # d['is_blurred']
|
231 |
)
|
232 |
+
# return gr.Dataset(samples=samples), None
|
233 |
+
# ───────────────────────────────────────────────────
|
234 |
+
# Clean up the “Additional Concepts” column (index 7)
|
235 |
+
cleaned = []
|
236 |
+
for row in samples:
|
237 |
+
# row is a list, index 7 holds the list-of-lists
|
238 |
+
ac = row[7]
|
239 |
+
|
240 |
+
# flatten & drop empty strings
|
241 |
+
vals = []
|
242 |
+
for sub in ac:
|
243 |
+
if isinstance(sub, list):
|
244 |
+
for v in sub:
|
245 |
+
v = v.strip()
|
246 |
+
if v:
|
247 |
+
vals.append(v)
|
248 |
+
|
249 |
+
# now vals contains every non-empty string from every sub-list
|
250 |
+
# e.g. ['Arquitectura colonial española', 'Año Nuevo', 'Bata',
|
251 |
+
# 'Aborrajado', 'Ajiaco', 'Abanico/ventilador']
|
252 |
+
|
253 |
+
# make a copy and replace only that field
|
254 |
+
row_copy = list(row)
|
255 |
+
row_copy[7] = ", ".join(vals)
|
256 |
+
cleaned.append(row_copy)
|
257 |
+
|
258 |
+
return gr.Dataset(samples=cleaned), None
|
259 |
else:
|
260 |
# TODO: should we show the entire dataset instead? What about "other data" tab?
|
261 |
return gr.Dataset(samples=[]), None
|
|
|
265 |
country, language, email, password, = local_storage
|
266 |
# my_translator = GoogleTranslator(source='english', target=metadata_dict[country][language])
|
267 |
categories = concepts_dict[country][lang2eng_mapping.get(language, language)]
|
268 |
+
categories_list = sort_with_pyuca(list(categories.keys()))
|
269 |
if language in words_mapping:
|
270 |
+
categories_keys_translated = [words_mapping[language].get(cat, cat) for cat in categories_list]
|
271 |
else:
|
272 |
+
categories_keys_translated = categories_list
|
273 |
|
274 |
# Get the 5 categories in alphabetical order
|
|
|
275 |
|
276 |
# Create translated labels for the 5 categories
|
277 |
translated_categories = []
|
|
|
281 |
else:
|
282 |
translated_cat = cat
|
283 |
translated_categories.append(translated_cat)
|
284 |
+
|
285 |
+
# Load all possible concepts
|
286 |
+
concepts_list = []
|
287 |
+
# cats = [] # FIXME: Assumes concepts are unique across all categories
|
288 |
+
for cat in concepts_dict[country][language]:
|
289 |
+
for concept in concepts_dict[country][language][cat]:
|
290 |
+
# cats.append(cat)
|
291 |
+
concepts_list.append(concept)
|
292 |
+
concepts_list = sort_with_pyuca(concepts_list)
|
293 |
|
294 |
fn = metadata_dict[country][language]["Task"]
|
295 |
if os.path.exists(fn):
|
|
|
315 |
gr.update(label=metadata_dict[country][language]["Email"], value=email),
|
316 |
gr.update(label=metadata_dict[country][language]["Password"], value=password),
|
317 |
gr.update(choices=categories_keys_translated, interactive=True, label=metadata_dict[country][language]["Category"], allow_custom_value=False, elem_id="category_btn"),
|
318 |
+
gr.update(choices=concepts_list, interactive=True, label=metadata_dict[country][language]["Concept"], allow_custom_value=True, elem_id="concept_btn"),
|
319 |
gr.update(label=metadata_dict[country][language]["Image"]),
|
320 |
gr.update(label=metadata_dict[country][language]["Image_URL"]),
|
321 |
gr.update(label=metadata_dict[country][language]["Description"]),
|
|
|
336 |
gr.update(value=metadata_dict[country][language].get("Hide_btn","👤 Hide Specific Faces")),
|
337 |
gr.update(value=metadata_dict[country][language].get("Unhide_btn","👀 Unhide Faces")),
|
338 |
gr.update(value=metadata_dict[country][language].get("Exclude_btn","Exclude Selected Example")),
|
339 |
+
gr.update(label=translated_categories[0], choices=sort_with_pyuca(concepts_dict[country][lang2eng_mapping.get(language, language)][categories_list[0]])),
|
340 |
+
gr.update(label=translated_categories[1], choices=sort_with_pyuca(concepts_dict[country][lang2eng_mapping.get(language, language)][categories_list[1]])),
|
341 |
+
gr.update(label=translated_categories[2], choices=sort_with_pyuca(concepts_dict[country][lang2eng_mapping.get(language, language)][categories_list[2]])),
|
342 |
+
gr.update(label=translated_categories[3], choices=sort_with_pyuca(concepts_dict[country][lang2eng_mapping.get(language, language)][categories_list[3]])),
|
343 |
+
gr.update(label=translated_categories[4], choices=sort_with_pyuca(concepts_dict[country][lang2eng_mapping.get(language, language)][categories_list[4]])),
|
344 |
)
|
345 |
|
346 |
|
|
|
358 |
|
359 |
|
360 |
def handle_click_example(user_examples, concepts_dict):
|
361 |
+
# print("handle_click_example")
|
362 |
+
# print(user_examples)
|
363 |
+
# ex = [item for item in user_examples]
|
364 |
+
# ───────────────────────────────────────────────────────────────
|
365 |
+
# 1) Turn the flat string in slot 7 back into a list-of-lists
|
366 |
+
ex = list(user_examples)
|
367 |
+
raw_ac = ex[7] if len(ex) > 7 else ""
|
368 |
+
|
369 |
+
country_btn = ex[3]
|
370 |
+
language_btn = ex[4]
|
371 |
+
concepts = concepts_dict[country_btn][language_btn]
|
372 |
+
categories_list = sort_with_pyuca(list(concepts.keys()))
|
373 |
+
# NOTE: assuming concepts are unique across all categories
|
374 |
+
if isinstance(raw_ac, str):
|
375 |
+
parts = [p.strip() for p in raw_ac.split(",")]
|
376 |
+
if raw_ac.strip() == "":
|
377 |
+
additional_concepts_by_category = [[], [], [] ,[], []]
|
378 |
+
else:
|
379 |
+
additional_concepts_by_category = [[], [], [] ,[], []]
|
380 |
+
for p in parts:
|
381 |
+
if p in concepts[categories_list[0]]:
|
382 |
+
additional_concepts_by_category[0].append(p)
|
383 |
+
continue
|
384 |
+
elif p in concepts[categories_list[1]]:
|
385 |
+
additional_concepts_by_category[1].append(p)
|
386 |
+
continue
|
387 |
+
elif p in concepts[categories_list[2]]:
|
388 |
+
additional_concepts_by_category[2].append(p)
|
389 |
+
continue
|
390 |
+
elif p in concepts[categories_list[3]]:
|
391 |
+
additional_concepts_by_category[3].append(p)
|
392 |
+
continue
|
393 |
+
elif p in concepts[categories_list[4]]:
|
394 |
+
additional_concepts_by_category[4].append(p)
|
395 |
+
continue
|
396 |
+
# check if any of the lists are empty, if so, add an empty string
|
397 |
+
# for i in range(len(additional_concepts_by_category)):
|
398 |
+
# if not additional_concepts_by_category[i]:
|
399 |
+
# additional_concepts_by_category[i].append("")
|
400 |
+
|
401 |
+
else:
|
402 |
+
# if it somehow already is a list, leave it
|
403 |
+
additional_concepts_by_category = raw_ac
|
404 |
+
# ───────────────────────────────────────────────────────────────
|
405 |
image_inp = ex[0]
|
406 |
image_url_inp = ex[1]
|
407 |
long_caption_inp = ex[2]
|
|
|
|
|
408 |
category_btn = ex[5]
|
409 |
concept_btn = ex[6]
|
410 |
+
# additional_concepts_by_category = ex[7]
|
411 |
exampleid_btn = ex[8]
|
412 |
+
# additional_concepts_by_category = [[] if (len(cat_concept)==1 and cat_concept[0]=='') else cat_concept for cat_concept in additional_concepts_by_category]
|
413 |
|
414 |
# import pdb; pdb.set_trace()
|
415 |
# # excluded_btn = ex[10] # TODO: add functionality that if True "exclude" button changes to "excluded"
|
|
|
442 |
|
443 |
# Need to return values for each category dropdown
|
444 |
return [image_inp, image_url_inp, long_caption_inp, exampleid_btn, category_btn, concept_btn] + additional_concepts_by_category + [True]
|
445 |
+
# return [
|
446 |
+
# image_inp,
|
447 |
+
# image_url_inp,
|
448 |
+
# long_caption_inp,
|
449 |
+
# exampleid_btn,
|
450 |
+
# category_btn,
|
451 |
+
# concept_btn,
|
452 |
+
# *additional_concepts_by_category,
|
453 |
+
# True # loading_example flag
|
454 |
+
# ]
|
455 |
|
456 |
|
457 |
def is_password_correct(hashed_password, entered_password):
|
|
|
493 |
# pdb.set_trace()
|
494 |
# Draw detections with IDs
|
495 |
for face_id, face_data in enumerate(faces.values(), start=1):
|
496 |
+
x1, y1, x2, y2 = face_data['facial_area']
|
497 |
+
box_h = y2 - y1
|
498 |
+
|
499 |
+
# 1) dynamic scale & thickness
|
500 |
+
scale = max(0.5, box_h / 150)
|
501 |
+
thickness = max(1, int(box_h / 200))
|
502 |
+
|
503 |
+
# 2) prepare text & size
|
504 |
+
text = f"ID:{face_id}"
|
505 |
+
font = cv2.FONT_HERSHEY_SIMPLEX
|
506 |
+
(tw, th), baseline = cv2.getTextSize(text, font, scale, thickness)
|
507 |
+
|
508 |
+
# 3) background rectangle (semi‐opaque or solid)
|
509 |
+
bg_tl = (x1, y1 - th - baseline - 4)
|
510 |
+
bg_br = (x1 + tw + 4, y1)
|
511 |
+
cv2.rectangle(face_images, bg_tl, bg_br, (0,0,0), cv2.FILLED)
|
512 |
+
|
513 |
+
# 4) put contrasting text
|
514 |
+
cv2.putText(face_images, text,
|
515 |
+
(x1 + 2, y1 - baseline - 2),
|
516 |
+
font, scale, (255,255,255), thickness, cv2.LINE_AA)
|
517 |
+
|
518 |
+
# 5) draw the face box (optional: use same contrasting color)
|
519 |
+
cv2.rectangle(face_images, (x1, y1), (x2, y2), (0,255,0), thickness)
|
520 |
# Update face count
|
521 |
face_count = len(faces)
|
522 |
blur_faces_ids = gr.update(choices=[f"Face ID: {i}" for i in range(1, face_count + 1)])
|
ui/layout.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1 |
import gradio as gr
|
|
|
2 |
|
3 |
from logic.data_utils import CustomHFDatasetSaver
|
4 |
from data.lang2eng_map import lang2eng_mapping
|
@@ -9,6 +10,7 @@ from functools import partial
|
|
9 |
|
10 |
from .selection_page import build_selection_page
|
11 |
from .main_page import build_main_page
|
|
|
12 |
|
13 |
def get_key_by_value(dictionary, value):
|
14 |
for key, val in dictionary.items():
|
@@ -25,22 +27,62 @@ def load_concepts(category, concept_btn, local_storage, loading_example, concept
|
|
25 |
# I'm doing this to avoid the case where the user load a previous example and the concept 'reamins' selected even if category changed
|
26 |
if loading_example:
|
27 |
concept_val = concept_btn if concept_btn else None
|
28 |
-
|
|
|
|
|
|
|
29 |
else:
|
30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
|
32 |
def switch_ui(country, language, username, password, flag=False, metadata_dict=None):
|
|
|
33 |
print(f"Language: {language}, Country: {country}")
|
34 |
|
|
|
|
|
|
|
|
|
35 |
# Hide the selection page and show the main UI.
|
36 |
if flag:
|
|
|
|
|
37 |
local_storage = [None, None, "", ""]
|
|
|
38 |
return (local_storage, gr.update(visible=flag), gr.update(visible=not flag),
|
39 |
gr.update(visible=not flag),
|
40 |
-
gr.update(choices=
|
41 |
gr.update(value=None, choices=[], label="Language", allow_custom_value=False, interactive=False))
|
42 |
|
43 |
else:
|
|
|
|
|
44 |
local_storage = [country, language, username, password]
|
45 |
return local_storage, gr.update(visible=flag), gr.update(visible=not flag), gr.update(visible=not flag)
|
46 |
|
@@ -54,7 +96,12 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
54 |
}
|
55 |
.compact-btn {
|
56 |
}
|
|
|
|
|
|
|
|
|
57 |
"""
|
|
|
58 |
with gr.Blocks(css=custom_css) as ui:
|
59 |
local_storage = gr.State([None, None, "", ""])
|
60 |
loading_example = gr.State(False) # to check if the values are loaded from a user click on an example in
|
@@ -71,6 +118,7 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
71 |
image_inp = cmp_main_ui["image_inp"]
|
72 |
image_url_inp = cmp_main_ui["image_url_inp"]
|
73 |
long_caption_inp = cmp_main_ui["long_caption_inp"]
|
|
|
74 |
category_btn = cmp_main_ui["category_btn"]
|
75 |
concept_btn = cmp_main_ui["concept_btn"]
|
76 |
category_concept_dropdowns = cmp_main_ui["category_concept_dropdowns"]
|
@@ -104,6 +152,15 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
104 |
inputs=[category_btn, concept_btn, local_storage, loading_example],
|
105 |
outputs=[concept_btn, loading_example]
|
106 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
####
|
108 |
|
109 |
# is_blurred = gr.State(False) # Initialize as False
|
@@ -114,6 +171,12 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
114 |
# gr.Warning(f"⚠️ The image URL is not valid. Please provide a valid image URL.")
|
115 |
|
116 |
# Event listeners
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
gr.on(
|
118 |
triggers=[image_url_inp.change],
|
119 |
fn=update_image,
|
@@ -136,10 +199,17 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
136 |
gr.on(
|
137 |
triggers=[image_inp.change],
|
138 |
fn=validate_inputs,
|
139 |
-
inputs=[image_inp, ori_img], # is_blurred
|
140 |
outputs=[submit_btn, image_inp, ori_img], # is_blurred
|
141 |
)
|
142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
# Clear Button
|
144 |
clear_btn.click(
|
145 |
fn=clear_data,
|
@@ -257,7 +327,7 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
257 |
category_concept_dropdowns[0], category_concept_dropdowns[1], category_concept_dropdowns[2],
|
258 |
category_concept_dropdowns[3], category_concept_dropdowns[4]
|
259 |
],
|
260 |
-
).
|
261 |
fn=partial(switch_ui, flag=True, metadata_dict=metadata_dict),
|
262 |
inputs=[country_choice, language_choice, username, password],
|
263 |
outputs=[local_storage, selection_page, main_ui_placeholder, browse_data_placeholder, country_choice, language_choice],
|
@@ -311,7 +381,7 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
311 |
list(data_outputs.values()),
|
312 |
None,
|
313 |
).success(
|
314 |
-
fn=clear_data,
|
315 |
outputs=[
|
316 |
image_inp, image_url_inp, long_caption_inp, exampleid_btn,
|
317 |
category_btn, concept_btn,
|
@@ -380,7 +450,7 @@ def build_ui(concepts_dict, metadata_dict, HF_API_TOKEN, HF_DATASET_NAME):
|
|
380 |
],
|
381 |
outputs=None
|
382 |
).success(
|
383 |
-
fn=clear_data,
|
384 |
outputs=[
|
385 |
image_inp, image_url_inp, long_caption_inp, exampleid_btn,
|
386 |
category_btn, concept_btn,
|
|
|
1 |
import gradio as gr
|
2 |
+
import time
|
3 |
|
4 |
from logic.data_utils import CustomHFDatasetSaver
|
5 |
from data.lang2eng_map import lang2eng_mapping
|
|
|
10 |
|
11 |
from .selection_page import build_selection_page
|
12 |
from .main_page import build_main_page
|
13 |
+
from .main_page import sort_with_pyuca
|
14 |
|
15 |
def get_key_by_value(dictionary, value):
|
16 |
for key, val in dictionary.items():
|
|
|
27 |
# I'm doing this to avoid the case where the user load a previous example and the concept 'reamins' selected even if category changed
|
28 |
if loading_example:
|
29 |
concept_val = concept_btn if concept_btn else None
|
30 |
+
if country is None or lang is None:
|
31 |
+
return gr.update(choices=[], value=None), False
|
32 |
+
else:
|
33 |
+
return gr.update(choices=sort_with_pyuca(concepts[country][lang2eng_mapping.get(lang, lang)][category]), value=concept_val), False
|
34 |
else:
|
35 |
+
concepts_list = []
|
36 |
+
# cats = [] # FIXME: Assumes concepts are unique across all categories
|
37 |
+
if country is None or lang is None:
|
38 |
+
return gr.update(choices=[], value=None), False
|
39 |
+
else:
|
40 |
+
for cat in concepts[country][lang]:
|
41 |
+
for concept in concepts[country][lang][cat]:
|
42 |
+
# cats.append(cat)
|
43 |
+
concepts_list.append(concept)
|
44 |
+
return gr.update(choices=sort_with_pyuca(concepts_list), value=None), False
|
45 |
+
# return gr.update(choices=[], value=None), False
|
46 |
+
|
47 |
+
def update_category(category, concept_btn, local_storage, loading_example, concepts):
|
48 |
+
country, lang, _, _ = local_storage
|
49 |
+
if not category and concept_btn:
|
50 |
+
# FIXME: Assumes unique concepts across categories
|
51 |
+
for cat in concepts[country][lang2eng_mapping.get(lang, lang)]:
|
52 |
+
for concept in concepts[country][lang2eng_mapping.get(lang, lang)][cat]:
|
53 |
+
if concept == concept_btn:
|
54 |
+
category = cat
|
55 |
+
return gr.update(choices=sort_with_pyuca(concepts[country][lang2eng_mapping.get(lang, lang)]), value=category), True
|
56 |
+
else:
|
57 |
+
# import pdb; pdb.set_trace()
|
58 |
+
if country is None or lang is None:
|
59 |
+
return gr.update(choices=[], value=None), False
|
60 |
+
else:
|
61 |
+
return gr.update(choices=sort_with_pyuca(concepts[country][lang2eng_mapping.get(lang, lang)]), value=category), False
|
62 |
+
|
63 |
|
64 |
def switch_ui(country, language, username, password, flag=False, metadata_dict=None):
|
65 |
+
# wait for 2 seconds
|
66 |
print(f"Language: {language}, Country: {country}")
|
67 |
|
68 |
+
if not country or not language:
|
69 |
+
gr.Warning(f"⚠️ Please select Country and Language first.", duration=3)
|
70 |
+
return
|
71 |
+
|
72 |
# Hide the selection page and show the main UI.
|
73 |
if flag:
|
74 |
+
gr.Info(f"Loading the Language Selection UI", duration=3)
|
75 |
+
time.sleep(2)
|
76 |
local_storage = [None, None, "", ""]
|
77 |
+
countries = sort_with_pyuca(list(metadata_dict.keys()))
|
78 |
return (local_storage, gr.update(visible=flag), gr.update(visible=not flag),
|
79 |
gr.update(visible=not flag),
|
80 |
+
gr.update(choices=countries, label="Country", value=None),
|
81 |
gr.update(value=None, choices=[], label="Language", allow_custom_value=False, interactive=False))
|
82 |
|
83 |
else:
|
84 |
+
gr.Info(f"Loading the Main UI", duration=3)
|
85 |
+
time.sleep(2)
|
86 |
local_storage = [country, language, username, password]
|
87 |
return local_storage, gr.update(visible=flag), gr.update(visible=not flag), gr.update(visible=not flag)
|
88 |
|
|
|
96 |
}
|
97 |
.compact-btn {
|
98 |
}
|
99 |
+
#image_inp img {
|
100 |
+
object-fit: contain; /* make sure the full image shows */
|
101 |
+
height: 460px; /* set a fixed height */
|
102 |
+
}
|
103 |
"""
|
104 |
+
############################################################################
|
105 |
with gr.Blocks(css=custom_css) as ui:
|
106 |
local_storage = gr.State([None, None, "", ""])
|
107 |
loading_example = gr.State(False) # to check if the values are loaded from a user click on an example in
|
|
|
118 |
image_inp = cmp_main_ui["image_inp"]
|
119 |
image_url_inp = cmp_main_ui["image_url_inp"]
|
120 |
long_caption_inp = cmp_main_ui["long_caption_inp"]
|
121 |
+
num_words_inp = cmp_main_ui["num_words_inp"]
|
122 |
category_btn = cmp_main_ui["category_btn"]
|
123 |
concept_btn = cmp_main_ui["concept_btn"]
|
124 |
category_concept_dropdowns = cmp_main_ui["category_concept_dropdowns"]
|
|
|
152 |
inputs=[category_btn, concept_btn, local_storage, loading_example],
|
153 |
outputs=[concept_btn, loading_example]
|
154 |
)
|
155 |
+
concept_btn.change(
|
156 |
+
fn=partial(update_category, concepts=concepts_dict),
|
157 |
+
inputs=[category_btn, concept_btn, local_storage, loading_example],
|
158 |
+
outputs=[category_btn, loading_example]
|
159 |
+
).then(
|
160 |
+
fn=partial(load_concepts, concepts=concepts_dict),
|
161 |
+
inputs=[category_btn, concept_btn, local_storage, gr.State(True)],
|
162 |
+
outputs=[concept_btn, loading_example]
|
163 |
+
)
|
164 |
####
|
165 |
|
166 |
# is_blurred = gr.State(False) # Initialize as False
|
|
|
171 |
# gr.Warning(f"⚠️ The image URL is not valid. Please provide a valid image URL.")
|
172 |
|
173 |
# Event listeners
|
174 |
+
gr.on(
|
175 |
+
triggers=[country_choice.change, language_choice.change],
|
176 |
+
fn=validate_metadata,
|
177 |
+
inputs=[country_choice, language_choice],
|
178 |
+
outputs=[proceed_btn],
|
179 |
+
)
|
180 |
gr.on(
|
181 |
triggers=[image_url_inp.change],
|
182 |
fn=update_image,
|
|
|
199 |
gr.on(
|
200 |
triggers=[image_inp.change],
|
201 |
fn=validate_inputs,
|
202 |
+
inputs=[image_inp, ori_img, concept_btn], # is_blurred
|
203 |
outputs=[submit_btn, image_inp, ori_img], # is_blurred
|
204 |
)
|
205 |
|
206 |
+
gr.on(
|
207 |
+
triggers=[long_caption_inp.change],
|
208 |
+
fn=count_words,
|
209 |
+
inputs=[long_caption_inp, language_choice],
|
210 |
+
outputs=[num_words_inp],
|
211 |
+
)
|
212 |
+
|
213 |
# Clear Button
|
214 |
clear_btn.click(
|
215 |
fn=clear_data,
|
|
|
327 |
category_concept_dropdowns[0], category_concept_dropdowns[1], category_concept_dropdowns[2],
|
328 |
category_concept_dropdowns[3], category_concept_dropdowns[4]
|
329 |
],
|
330 |
+
).success(
|
331 |
fn=partial(switch_ui, flag=True, metadata_dict=metadata_dict),
|
332 |
inputs=[country_choice, language_choice, username, password],
|
333 |
outputs=[local_storage, selection_page, main_ui_placeholder, browse_data_placeholder, country_choice, language_choice],
|
|
|
381 |
list(data_outputs.values()),
|
382 |
None,
|
383 |
).success(
|
384 |
+
fn=partial(clear_data, "submit"),
|
385 |
outputs=[
|
386 |
image_inp, image_url_inp, long_caption_inp, exampleid_btn,
|
387 |
category_btn, concept_btn,
|
|
|
450 |
],
|
451 |
outputs=None
|
452 |
).success(
|
453 |
+
fn=partial(clear_data, "remove"),
|
454 |
outputs=[
|
455 |
image_inp, image_url_inp, long_caption_inp, exampleid_btn,
|
456 |
category_btn, concept_btn,
|
ui/main_page.py
CHANGED
@@ -4,6 +4,13 @@ from gradio_modal import Modal
|
|
4 |
from data.lang2eng_map import lang2eng_mapping
|
5 |
from data.words_map import words_mapping
|
6 |
import datetime
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
8 |
def build_main_page(concepts_dict, metadata_dict, local_storage):
|
9 |
try:
|
@@ -19,8 +26,19 @@ def build_main_page(concepts_dict, metadata_dict, local_storage):
|
|
19 |
|
20 |
with open(metadata_dict["USA"]["English"]["Instructions"], "r", encoding="utf-8") as f:
|
21 |
INST_TEXT = f.read()
|
22 |
-
|
23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
|
25 |
# gr.Markdown("## Data Collection")
|
26 |
with gr.Row(equal_height=True):
|
@@ -33,25 +51,64 @@ def build_main_page(concepts_dict, metadata_dict, local_storage):
|
|
33 |
with gr.Row(equal_height=True, ):
|
34 |
with gr.Column():
|
35 |
# Main category and concept row - SINGLE SELECTION
|
36 |
-
with gr.
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
|
50 |
with gr.Column():
|
51 |
# short_caption_inp = gr.Textbox(lines=2, label="Short Description", elem_id="short_caption_inp")
|
52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
|
54 |
-
categories_list =
|
55 |
|
56 |
def create_category_dropdown(category, index):
|
57 |
original_category = category
|
@@ -62,7 +119,7 @@ def build_main_page(concepts_dict, metadata_dict, local_storage):
|
|
62 |
display_category = original_category
|
63 |
|
64 |
category_choices = concepts_dict[country][lang2eng_mapping.get(lang, lang)][original_category]
|
65 |
-
sorted_choices =
|
66 |
|
67 |
dropdown = gr.Dropdown(
|
68 |
choices=sorted_choices,
|
@@ -77,24 +134,27 @@ def build_main_page(concepts_dict, metadata_dict, local_storage):
|
|
77 |
|
78 |
category_concept_dropdowns = []
|
79 |
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
|
|
|
|
|
|
87 |
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
|
96 |
-
|
97 |
-
|
98 |
|
99 |
# Third row - category 5 and instructions button
|
100 |
with gr.Row(equal_height=True):
|
@@ -137,6 +197,7 @@ def build_main_page(concepts_dict, metadata_dict, local_storage):
|
|
137 |
"image_inp": image_inp,
|
138 |
"image_url_inp": image_url_inp,
|
139 |
"long_caption_inp": long_caption_inp,
|
|
|
140 |
"category_btn": category_btn,
|
141 |
"concept_btn": concept_btn,
|
142 |
"category_concept_dropdowns": category_concept_dropdowns,
|
|
|
4 |
from data.lang2eng_map import lang2eng_mapping
|
5 |
from data.words_map import words_mapping
|
6 |
import datetime
|
7 |
+
from pyuca import Collator
|
8 |
+
|
9 |
+
|
10 |
+
def sort_with_pyuca(strings):
|
11 |
+
collator = Collator()
|
12 |
+
return sorted(strings, key=collator.sort_key)
|
13 |
+
|
14 |
|
15 |
def build_main_page(concepts_dict, metadata_dict, local_storage):
|
16 |
try:
|
|
|
26 |
|
27 |
with open(metadata_dict["USA"]["English"]["Instructions"], "r", encoding="utf-8") as f:
|
28 |
INST_TEXT = f.read()
|
29 |
+
|
30 |
+
gr.Markdown("# Wonders: Multicultural Images and Captions for Inclusive AI")
|
31 |
+
gr.Markdown("Help us collect culturally rich images and captions to improve AI for everyone!")
|
32 |
+
gr.Markdown("Choose a concept, upload an image showing it in a typical local situation, and write a detailed description about the image.<br> For more information, see the overviews below or click on 'Show instructions' for detailed guidelines.")
|
33 |
+
gr.Markdown(""" \
|
34 |
+
### Notes
|
35 |
+
- By participating in this task, you agree to donate images and captions under [CC BY license](https://creativecommons.org/licenses/by/4.0/), which will allow us to share the data with others to improve AI.
|
36 |
+
- You will be able to **update or remove** any provided data at any time if you wish so.
|
37 |
+
- Participants that provide more data, across more concepts and of high quality (see "Instructions" button) will be **rewarded** (see TODO).
|
38 |
+
"""
|
39 |
+
)
|
40 |
+
# with gr.Accordion("📘 Show task overview", open=False):
|
41 |
+
intro_text_inp = gr.Markdown(TASK_TEXT, visible=False)
|
42 |
|
43 |
# gr.Markdown("## Data Collection")
|
44 |
with gr.Row(equal_height=True):
|
|
|
51 |
with gr.Row(equal_height=True, ):
|
52 |
with gr.Column():
|
53 |
# Main category and concept row - SINGLE SELECTION
|
54 |
+
with gr.Group():
|
55 |
+
gr.Markdown("### Main Concept")
|
56 |
+
gr.Markdown("""\
|
57 |
+
Select the main concept and category for which you want to share data.<br>
|
58 |
+
If you want to add a new concept, you can just type it in the same box (after selecting its category).
|
59 |
+
"""
|
60 |
+
)
|
61 |
+
with gr.Row():
|
62 |
+
# Use concepts_dict to populate the dropdown
|
63 |
+
categories = concepts_dict["USA"]["English"]
|
64 |
+
category_btn = gr.Dropdown(choices=sort_with_pyuca(categories.keys()), interactive=True, label="Main Category",
|
65 |
+
allow_custom_value=False, elem_id="category_btn", multiselect=False, value=None)
|
66 |
+
concept_btn = gr.Dropdown(choices=[], interactive=True, label="Main Concept",
|
67 |
+
allow_custom_value=True, elem_id="concept_btn", multiselect=False)
|
68 |
|
69 |
+
with gr.Group():
|
70 |
+
gr.Markdown("### Image")
|
71 |
+
with gr.Accordion("📘 An image of the main concept in typical contexts (click to read more)", open=False):
|
72 |
+
gr.Markdown("""\=
|
73 |
+
An image where the *main concept is clearly visible*
|
74 |
+
- in typical contexts in your country, and
|
75 |
+
- with other objects/people when possible
|
76 |
+
|
77 |
+
Pictures taken by yourself are preferred.
|
78 |
+
If you want to use an image from the Web, directly add its URL below.
|
79 |
+
- Please use publicly-licensed images (e.g., from pexels.com or freepik.com)
|
80 |
+
|
81 |
+
For more details, click on “Show instructions” below.
|
82 |
+
"""
|
83 |
+
)
|
84 |
+
image_url_inp = gr.Textbox(label="Image URL (Optional, if not uploading an image)", type="text", elem_id="image_url_inp")
|
85 |
+
image_inp = gr.Image(label="Image", elem_id="image_inp", format="png", height=512, width=768)
|
86 |
+
with gr.Row():
|
87 |
+
hide_all_faces_btn = gr.Button("👤 Hide All Faces", elem_id="hide_all_faces_btn")
|
88 |
+
hide_faces_btn = gr.Button("👤 Hide Specific Faces", elem_id="hide_faces_btn")
|
89 |
+
unhide_faces_btn = gr.Button("👀 Unhide Faces", elem_id="unhide_faces_btn")
|
90 |
|
91 |
with gr.Column():
|
92 |
# short_caption_inp = gr.Textbox(lines=2, label="Short Description", elem_id="short_caption_inp")
|
93 |
+
with gr.Group():
|
94 |
+
gr.Markdown("### Description")
|
95 |
+
with gr.Accordion("📘 A detailed description (around 40 words covering who?, what? and where?) for the image (click to read more)", open=False):
|
96 |
+
gr.Markdown("""\
|
97 |
+
A long image description (around 40 words) with extensive and detailed visual information.<br>
|
98 |
+
Descriptions must be *objective*: focus on how you would describe the image to someone who can’t see it, without your own opinions/speculations.
|
99 |
+
The text needs to *include the main concept* and describes the content of the image in detail by including:
|
100 |
+
- **Who?** The visual *appearance* and observable *emotions* (e.g., “is smiling”) of persons and animals.
|
101 |
+
- **What?** The *actions* performed in the image.
|
102 |
+
- **Where?** The *setting* of the image, including the size, color and relationships between objects.
|
103 |
+
|
104 |
+
For more details, click on “Show instructions” below.
|
105 |
+
"""
|
106 |
+
)
|
107 |
+
long_caption_inp = gr.Textbox(lines=6, label="Description", elem_id="long_caption_inp")
|
108 |
+
num_words_inp = gr.Textbox(lines=1, label="Number of words", elem_id="num_words", interactive=False, value=0)
|
109 |
+
# num_words_inp = gr.Markdown("Number of words", elem_id="num_words")
|
110 |
|
111 |
+
categories_list = sort_with_pyuca(list(concepts_dict["USA"]["English"].keys()))
|
112 |
|
113 |
def create_category_dropdown(category, index):
|
114 |
original_category = category
|
|
|
119 |
display_category = original_category
|
120 |
|
121 |
category_choices = concepts_dict[country][lang2eng_mapping.get(lang, lang)][original_category]
|
122 |
+
sorted_choices = sort_with_pyuca(category_choices)
|
123 |
|
124 |
dropdown = gr.Dropdown(
|
125 |
choices=sorted_choices,
|
|
|
134 |
|
135 |
category_concept_dropdowns = []
|
136 |
|
137 |
+
with gr.Group():
|
138 |
+
gr.Markdown("### Additional concepts (optional)")
|
139 |
+
gr.Markdown("Tag any other concept that is visible in the image.")
|
140 |
+
# First row - categories 1 and 2
|
141 |
+
with gr.Row():
|
142 |
+
dropdown1 = create_category_dropdown(categories_list[0], 0)
|
143 |
+
category_concept_dropdowns.append(dropdown1)
|
144 |
+
|
145 |
+
dropdown2 = create_category_dropdown(categories_list[1], 1)
|
146 |
+
category_concept_dropdowns.append(dropdown2)
|
147 |
|
148 |
+
# Second row - categories 3 and 4
|
149 |
+
# with gr.Row():
|
150 |
+
dropdown3 = create_category_dropdown(categories_list[2], 2)
|
151 |
+
category_concept_dropdowns.append(dropdown3)
|
152 |
+
|
153 |
+
dropdown4 = create_category_dropdown(categories_list[3], 3)
|
154 |
+
category_concept_dropdowns.append(dropdown4)
|
155 |
|
156 |
+
dropdown5 = create_category_dropdown(categories_list[4], 4)
|
157 |
+
category_concept_dropdowns.append(dropdown5)
|
158 |
|
159 |
# Third row - category 5 and instructions button
|
160 |
with gr.Row(equal_height=True):
|
|
|
197 |
"image_inp": image_inp,
|
198 |
"image_url_inp": image_url_inp,
|
199 |
"long_caption_inp": long_caption_inp,
|
200 |
+
"num_words_inp": num_words_inp,
|
201 |
"category_btn": category_btn,
|
202 |
"concept_btn": concept_btn,
|
203 |
"category_concept_dropdowns": category_concept_dropdowns,
|
ui/selection_page.py
CHANGED
@@ -2,12 +2,15 @@ import os.path
|
|
2 |
import gradio as gr
|
3 |
from functools import partial
|
4 |
|
|
|
|
|
|
|
5 |
def update_language_options(selected_country, metadata):
|
6 |
with open(metadata["USA"]["English"]["Intro"], "r", encoding="utf-8") as f:
|
7 |
-
|
8 |
# Retrieve the list of languages available for the selected country.
|
9 |
if selected_country in metadata:
|
10 |
-
languages = list(metadata[selected_country].keys())
|
11 |
if len(languages) == 0:
|
12 |
gr.Warning("No languages available for the selected country.")
|
13 |
return gr.Dropdown(choices=[], interactive=False, value=None), gr.Markdown(INTRO_TEXT)
|
@@ -17,40 +20,43 @@ def update_language_options(selected_country, metadata):
|
|
17 |
with open(fn, "r", encoding="utf-8") as f:
|
18 |
INTRO_TEXT = f.read()
|
19 |
# Use gr.Dropdown.update to change the choices of the language dropdown.
|
20 |
-
|
|
|
21 |
else:
|
22 |
return gr.Dropdown(choices=[], interactive=False, value=None, allow_custom_value=False), gr.Markdown(INTRO_TEXT)
|
23 |
|
|
|
24 |
def build_selection_page(metadata_dict):
|
25 |
with gr.Column(visible=True, elem_classes=["compact-container"]) as selection_page:
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
|
|
55 |
|
56 |
return selection_page, country_choice, language_choice, proceed_btn, username, password, intro_markdown
|
|
|
2 |
import gradio as gr
|
3 |
from functools import partial
|
4 |
|
5 |
+
from .main_page import sort_with_pyuca
|
6 |
+
|
7 |
+
|
8 |
def update_language_options(selected_country, metadata):
|
9 |
with open(metadata["USA"]["English"]["Intro"], "r", encoding="utf-8") as f:
|
10 |
+
INTRO_TEXT = f.read() # default
|
11 |
# Retrieve the list of languages available for the selected country.
|
12 |
if selected_country in metadata:
|
13 |
+
languages = sort_with_pyuca(list(metadata[selected_country].keys()))
|
14 |
if len(languages) == 0:
|
15 |
gr.Warning("No languages available for the selected country.")
|
16 |
return gr.Dropdown(choices=[], interactive=False, value=None), gr.Markdown(INTRO_TEXT)
|
|
|
20 |
with open(fn, "r", encoding="utf-8") as f:
|
21 |
INTRO_TEXT = f.read()
|
22 |
# Use gr.Dropdown.update to change the choices of the language dropdown.
|
23 |
+
val = languages[0] if len(languages) == 1 else None
|
24 |
+
return gr.Dropdown(choices=languages, interactive=True, value=val, allow_custom_value=False), gr.Markdown(INTRO_TEXT)
|
25 |
else:
|
26 |
return gr.Dropdown(choices=[], interactive=False, value=None, allow_custom_value=False), gr.Markdown(INTRO_TEXT)
|
27 |
|
28 |
+
|
29 |
def build_selection_page(metadata_dict):
|
30 |
with gr.Column(visible=True, elem_classes=["compact-container"]) as selection_page:
|
31 |
+
with gr.Row():
|
32 |
+
with open(metadata_dict["USA"]["English"]["Intro"], "r", encoding="utf-8") as f:
|
33 |
+
INTRO_TEXT = f.read()
|
34 |
+
intro_markdown = gr.Markdown(INTRO_TEXT)
|
35 |
+
|
36 |
+
gr.Markdown("## Please select your country")
|
37 |
+
|
38 |
+
countries = sort_with_pyuca(list(metadata_dict.keys()))
|
39 |
+
country_choice = gr.Dropdown(
|
40 |
+
choices=countries, label="Country", allow_custom_value=False, value=None,
|
41 |
+
)
|
42 |
+
|
43 |
+
language_choice = gr.Dropdown(
|
44 |
+
choices=[],
|
45 |
+
label="Language",
|
46 |
+
allow_custom_value=False,
|
47 |
+
interactive=False # Initially disabled.
|
48 |
+
)
|
49 |
+
|
50 |
+
# When the country selection changes, update the language dropdown.
|
51 |
+
country_choice.change(
|
52 |
+
fn=partial(update_language_options, metadata=metadata_dict),
|
53 |
+
inputs=country_choice,
|
54 |
+
outputs=[language_choice, intro_markdown]
|
55 |
+
)
|
56 |
+
with gr.Row():
|
57 |
+
username = gr.Textbox(label="Email (optional)", type="email", elem_id="username_text")
|
58 |
+
password = gr.Textbox(label="Password (optional)", type="password", elem_id="password_text")
|
59 |
+
|
60 |
+
proceed_btn = gr.Button("Proceed")
|
61 |
|
62 |
return selection_page, country_choice, language_choice, proceed_btn, username, password, intro_markdown
|