Spaces:
Runtime error
Runtime error
| import io | |
| import time | |
| import requests | |
| import streamlit as st | |
| from openfoodfacts.images import generate_image_url | |
| from PIL import Image | |
| def send_prediction_request(image_url: str, model_name: str, server_base_url: str): | |
| return requests.get( | |
| f"{server_base_url}/api/v1/images/predict", | |
| params={"image_url": image_url, "models": model_name, "output_image": 1}, | |
| ) | |
| def get_product(barcode: str): | |
| r = requests.get(f"https://world.openfoodfacts.org/api/v2/product/{barcode}") | |
| if r.status_code == 404: | |
| return None | |
| return r.json()["product"] | |
| def run(barcode: str, model_names: list[str], server_base_url: str): | |
| product = get_product(barcode) | |
| st.markdown(f"[Product page](https://world.openfoodfacts.org/product/{barcode})") | |
| if not product: | |
| st.error(f"Product {barcode} not found") | |
| return | |
| images = product.get("images", []) | |
| if not images: | |
| st.error(f"No images found for product {barcode}") | |
| return | |
| for image_id, _ in images.items(): | |
| if not image_id.isdigit(): | |
| continue | |
| image_url = generate_image_url(barcode, f"{image_id}") | |
| for model_name in model_names: | |
| start = time.monotonic() | |
| response = send_prediction_request(image_url, model_name, server_base_url) | |
| elapsed = time.monotonic() - start | |
| if response.headers["Content-Type"] != "image/jpeg": | |
| st.error(f"Error: {response.text}") | |
| continue | |
| image = Image.open(io.BytesIO(response.content)) | |
| st.write(f"Image {image_id}") | |
| st.image(image, caption=f"Model: {model_name} ({elapsed:.2f}s)") | |
| st.divider() | |
| st.title("Object detection demo") | |
| st.markdown( | |
| "This Streamlit is useful to test object detection models running in production at Open Food Facts." | |
| ) | |
| default_barcode = st.query_params["barcode"] if "barcode" in st.query_params else "" | |
| model_names = st.multiselect( | |
| "Models", | |
| options=[ | |
| "nutrition-table-yolo", | |
| "nutrition-table", | |
| "nutriscore", | |
| "nutriscore-yolo", | |
| "universal-logo-detector", | |
| ], | |
| help="Select the model(s) to use", | |
| default=["nutrition-table-yolo", "nutrition-table"], | |
| ) | |
| barcode = st.text_input( | |
| "barcode", help="Barcode of the product", value=default_barcode | |
| ).strip() | |
| st.query_params["barcode"] = barcode | |
| # Default server is staging | |
| server_base_url = "https://robotoff.openfoodfacts.net" | |
| if "env" in st.query_params: | |
| if st.query_params["env"] == "prod": | |
| server_base_url = "https://robotoff.openfoodfacts.net" | |
| elif st.query_params["env"] == "dev": | |
| server_base_url = "http://localhost:5000" | |
| if barcode: | |
| run(barcode, model_names, server_base_url) | |