<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Gradio-Lite: Serverless Gradio Running Entirely in Your Browser</title> <meta name="description" content="Gradio-Lite: Serverless Gradio Running Entirely in Your Browser"> <script type="module" crossorigin src="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@gradio/lite/dist/lite.css" /> <style> html, body { margin: 0; padding: 0; height: 100%; } </style> </head> <body> <gradio-lite> <gradio-file name="app.py" entrypoint> import gradio as gr from transformers_js_py import pipeline from filters import convert pipe = await pipeline('object-detection', 'Xenova/detr-resnet-50') async def fn(image): result = await pipe(image) return result #demo = gr.Interface.from_pipeline(pipe) async def predict(image): result = await pipe(image) print(result) result = convert(result) print(result) return image, result demo = gr.Interface( fn=predict, inputs=gr.Image(type='pil'), outputs=gr.AnnotatedImage(), title='On-Device Object-Detection with Gradio-Lite & Transformers.js' ) demo.launch() </gradio-file> <gradio-file name="filters.py"> def convert(input_data): # Initialize the output list result_labels = [] # Iterate over each item in the input data for item in input_data: # Extract the label label = item['label'] # Extract the bounding box coordinates xmin = item['box']['xmin'] ymin = item['box']['ymin'] xmax = item['box']['xmax'] ymax = item['box']['ymax'] # Convert coordinates into the required output format (list of coordinates) coordinates = [xmin, ymin, xmax, ymax] # Append the tuple of coordinates and label to the output list result_labels.append((coordinates, label)) # Return the output list return result_labels </gradio-file> <gradio-requirements> # Same syntax as requirements.txt transformers-js-py </gradio-requirements> </gradio-lite> </body> </html>