import gradio as gr import pandas as pd # --------------- Marqo-Ecommerce-Easy ------------------- # Embedding Models for Marqo-Ecommerce-Easy embedding_models = [ 'Amazon-Titan-MultiModal', 'Jina-V1-CLIP', 'Cohere-embedding-v3', 'GCP-Vertex', 'ViT-SO400M-14-SigLip', 'ViT-B-16-SigLip', 'ViT-L-16-SigLip', 'Marqo-Ecommerce-B', 'Marqo-Ecommerce-L' ] # GS-Text2Image-1m gs_text2_image_1m_mAP = [0.694, 0.480, 0.358, 0.740, 0.792, 0.701, 0.754, 0.842, 0.879] gs_text2_image_1m_Recall = [0.868, 0.638, 0.515, 0.910, 0.935, 0.87, 0.907, 0.961, 0.971] gs_text2_image_1m_MRR = [0.693, 0.480, 0.358, 0.740, 0.792, 0.701, 0.754, 0.842, 0.879] gs_text2_image_1m_ndcg = [0.733, 0.511, 0.389, 0.779, 0.825, 0.739, 0.789, 0.871, 0.901] gs_text2_image_1m_data = { "Embedding Model": embedding_models, "mAP": gs_text2_image_1m_mAP, "R@10": gs_text2_image_1m_Recall, "MRR": gs_text2_image_1m_MRR, "nDCG@10": gs_text2_image_1m_ndcg } gs_text2_image_1m_df = pd.DataFrame(gs_text2_image_1m_data) gs_text2_image_1m_df = pd.DataFrame(gs_text2_image_1m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # GS-Category2Image-1m gs_category2_image_1m_mAP = [0.308, 0.175, 0.136, 0.417, 0.423, 0.347, 0.392, 0.479, 0.515] gs_category2_image_1m_Precision = [0.231, 0.122, 0.110, 0.298, 0.302, 0.252, 0.281, 0.336, 0.358] gs_category2_image_1m_MRR = [0.558, 0.369, 0.315, 0.636, 0.644, 0.594, 0.627, 0.744, 0.764] gs_category2_image_1m_ndcg = [0.377, 0.229, 0.178, 0.481, 0.487, 0.414, 0.458, 0.558, 0.590] gs_category2_image_1m_data = { "Embedding Model": embedding_models, "mAP": gs_category2_image_1m_mAP, "P@10": gs_category2_image_1m_Precision, "MRR": gs_category2_image_1m_MRR, "nDCG@10": gs_category2_image_1m_ndcg } gs_category2_image_1m_df = pd.DataFrame(gs_category2_image_1m_data) gs_category2_image_1m_df = pd.DataFrame(gs_category2_image_1m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # AP-Text2Image-3m ap_text2_image_3m_mAP = [0.762, 0.530, 0.433, 0.808, 0.860, 0.797, 0.842, 0.897, 0.928] ap_text2_image_3m_Recall = [0.889, 0.699, 0.597, 0.933, 0.954, 0.917, 0.940, 0.967, 0.978] ap_text2_image_3m_MRR = [0.763, 0.530, 0.433, 0.808, 0.860, 0.797, 0.842, 0.897, 0.928] ap_text2_image_3m_ndcg = [0.791, 0.565, 0.465, 0.837, 0.882, 0.825, 0.865, 0.914, 0.940] ap_text2_image_3m_data = { "Embedding Model": embedding_models, "mAP": ap_text2_image_3m_mAP, "R@10": ap_text2_image_3m_Recall, "MRR": ap_text2_image_3m_MRR, "nDCG@10": ap_text2_image_3m_ndcg } ap_text2_image_3m_df = pd.DataFrame(ap_text2_image_3m_data) ap_text2_image_3m_df = pd.DataFrame(ap_text2_image_3m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # --------------- Marqo-Ecommerce-Hard ------------------- # Embedding Models for Marqo-Ecommerce-Hard hard_embedding_models = [ 'Amazon-Titan-MultiModal', 'Jina-V1-CLIP', 'ViT-SO400M-14-SigLip', 'ViT-B-16-SigLip', 'ViT-L-16-SigLip', 'Marqo-Ecommerce-B', 'Marqo-Ecommerce-L' ] # GS-Text2Image-1m hard_gs_text2_image_1m_mAP = [0.475, 0.285, 0.573, 0.476, 0.540, 0.623, 0.682] hard_gs_text2_image_1m_Recall = [0.648, 0.402, 0.763, 0.660, 0.722, 0.832, 0.878] hard_gs_text2_image_1m_MRR = [0.475, 0.285, 0.574, 0.477, 0.540, 0.624, 0.683] hard_gs_text2_image_1m_ndcg = [0.509, 0.306, 0.613, 0.513, 0.577, 0.668, 0.726] hard_gs_text2_image_1m_data = { "Embedding Model": hard_embedding_models, "mAP": hard_gs_text2_image_1m_mAP, "R@10": hard_gs_text2_image_1m_Recall, "MRR": hard_gs_text2_image_1m_MRR, "nDCG@10": hard_gs_text2_image_1m_ndcg } hard_gs_text2_image_1m_df = pd.DataFrame(hard_gs_text2_image_1m_data) hard_gs_text2_image_1m_df = pd.DataFrame(hard_gs_text2_image_1m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # GS-Category2Image-1m hard_gs_category2_image_1m_mAP = [0.246, 0.123, 0.352, 0.277, 0.324, 0.423, 0.463] hard_gs_category2_image_1m_Precision = [0.429, 0.275, 0.516, 0.458, 0.497, 0.629, 0.652] hard_gs_category2_image_1m_MRR = [0.642, 0.504, 0.707, 0.660, 0.687, 0.810, 0.822] hard_gs_category2_image_1m_ndcg = [0.446, 0.294, 0.529, 0.473, 0.509, 0.644, 0.666] hard_gs_category2_image_1m_data = { "Embedding Model": hard_embedding_models, "mAP": hard_gs_category2_image_1m_mAP, "P@10": hard_gs_category2_image_1m_Precision, "MRR": hard_gs_category2_image_1m_MRR, "nDCG@10": hard_gs_category2_image_1m_ndcg } hard_gs_category2_image_1m_df = pd.DataFrame(hard_gs_category2_image_1m_data) hard_gs_category2_image_1m_df = pd.DataFrame(hard_gs_category2_image_1m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # AP-Text2Image-3m hard_ap_text2_image_3m_mAP = [0.456, 0.265, 0.560, 0.480, 0.544, 0.592, 0.658] hard_ap_text2_image_3m_Recall = [0.627, 0.378, 0.742, 0.650, 0.715, 0.795, 0.854] hard_ap_text2_image_3m_MRR = [0.457, 0.266, 0.564, 0.484, 0.548, 0.597, 0.663] hard_ap_text2_image_3m_ndcg = [0.491, 0.285, 0.599, 0.515, 0.580, 0.637, 0.703] hard_ap_text2_image_3m_data = { "Embedding Model": hard_embedding_models, "mAP": hard_ap_text2_image_3m_mAP, "R@10": hard_ap_text2_image_3m_Recall, "MRR": hard_ap_text2_image_3m_MRR, "nDCG@10": hard_ap_text2_image_3m_ndcg } hard_ap_text2_image_3m_df = pd.DataFrame(hard_ap_text2_image_3m_data) hard_ap_text2_image_3m_df = pd.DataFrame(hard_ap_text2_image_3m_df).sort_values(by="mAP", ascending=False).reset_index(drop=True) # Gradio interface with sortable Dataframe with gr.Blocks(css=""" .gradio-container { display: flex; justify-content: center; align-items: center; min-height: 100vh; flex-direction: column; } """) as demo: gr.Markdown("# Ecommerce Embedding Model Benchmarks") gr.Markdown("This Space contains benchmark results conducted as part of the release of our ecommerce embedding models: [**`Marqo-Ecommerce-L`**](https://huggingface.co/Marqo/marqo-ecommerce-embeddings-L) and [**`Marqo-Ecommerce-B`**](https://huggingface.co/Marqo/marqo-ecommerce-embeddings-B). ") gr.Markdown("Our benchmarking process was divided into two distinct regimes, each using different datasets of ecommerce product listings: **marqo-ecommerce-hard** and **marqo-ecommerce-easy**. Both datasets contained product images and text and only differed in size. The \"easy\" dataset is approximately 10-30 times smaller (200k vs 4M products), and designed to accommodate rate-limited models, specifically Cohere-Embeddings-v3 and GCP-Vertex (with limits of 0.66 rps and 2 rps respectively). The \"hard\" dataset represents the true challenge, since it contains four million ecommerce product listings and is more representative of real-world ecommerce search scenarios.") gr.Markdown('Within both these scenarios, the models were benchmarked against three different tasks:') gr.Markdown('- **Google Shopping Text-to-Image**') gr.Markdown('- **Google Shopping Category-to-Image**') gr.Markdown('- **Amazon Products Text-to-Image**') gr.Markdown('As part of this launch, we also released two evaluation datasets: [`Marqo/google-shopping-general-eval`](https://huggingface.co/datasets/Marqo/google-shopping-general-eval) and [`Marqo/amazon-products-eval`](https://huggingface.co/datasets/Marqo/amazon-products-eval).') gr.Markdown('For more information on these models, benchmark results, and how you can run these evaluations yourself, visit our [blog post](https://www.marqo.ai/blog/introducing-marqos-ecommerce-embedding-models).') # Hard gr.Markdown('## Marqo-Ecommerce-Hard') gr.Markdown('### Google Shopping Text to Image 1m') gr.Dataframe(value=hard_gs_text2_image_1m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) gr.Markdown('### Google Shopping Category to Image 1m') gr.Dataframe(value=hard_gs_category2_image_1m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) gr.Markdown('### Amazon Products Text to Image 3m') gr.Dataframe(value=hard_ap_text2_image_3m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) # Easy gr.Markdown('## Marqo-Ecommerce-Easy') gr.Markdown('### Google Shopping Text to Image') gr.Dataframe(value=gs_text2_image_1m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) gr.Markdown('### Google Shopping Category to Image') gr.Dataframe(value=gs_category2_image_1m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) gr.Markdown('### Amazon Products Text to Image') gr.Dataframe(value=ap_text2_image_3m_df, headers="keys", interactive=True, datatype=["html", "number", "number", "number", "number"]) demo.launch()