| import gradio as gr |
| import cv2 |
| import torch |
| import numpy as np |
|
|
| |
| model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) |
|
|
| |
| def run_inference(image): |
| |
| image = np.array(image) |
|
|
| |
| results = model(image) |
|
|
| |
| detections = results.pandas().xyxy[0] |
|
|
| |
| object_counts = detections['name'].value_counts() |
|
|
| |
| count_text = "\n".join([f"{obj}: {count}" for obj, count in object_counts.items()]) |
|
|
| |
| annotated_image = results.render()[0] |
| annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB) |
|
|
| return annotated_image, count_text |
|
|
| |
| interface = gr.Interface( |
| fn=run_inference, |
| inputs=gr.Image(type="pil"), |
| outputs=[ |
| gr.Image(type="pil"), |
| gr.Textbox(label="Object Counts", lines=5, interactive=False) |
| ], |
| title="DTECTIFY, The Object Detection with Counts", |
| description="Upload an image and let Detectify detect and count objects in real-time. Get annotated results with bounding boxes and an instant count of objects by category. Fast, accurate, and easy-to-use for all your object detection needs!", |
| css=""" |
| /* General body and background settings */ |
| body { |
| font-family: 'Arial', sans-serif; |
| background: linear-gradient(135deg, #FF6F61, #FF9F9F, #FFEB3B); |
| animation: gradientBG 5s ease infinite; |
| margin: 0; |
| padding: 0; |
| color: white; |
| height: 100vh; |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| text-align: center; |
| overflow-y: auto; |
| } |
| |
| @keyframes gradientBG { |
| 0% { background-position: 0% 50%; } |
| 50% { background-position: 100% 50%; } |
| 100% { background-position: 0% 50%; } |
| } |
| |
| /* Main container styles */ |
| .gradio-container { |
| background: rgba(0, 0, 0, 0.5); |
| border-radius: 20px; |
| padding: 30px; |
| width: 100%; |
| max-width: 800px; |
| box-shadow: 0 8px 15px rgba(0, 0, 0, 0.5); |
| overflow-y: auto; |
| animation: fadeIn 1s ease-out; |
| } |
| |
| /* Fade in effect */ |
| @keyframes fadeIn { |
| from { |
| opacity: 0; |
| } |
| to { |
| opacity: 1; |
| } |
| } |
| |
| /* Header styling */ |
| .gradio-header { |
| font-size: 2.5rem; |
| font-weight: bold; |
| color: #FFEB3B; |
| } |
| |
| /* Description styling */ |
| .gradio-description { |
| font-size: 1.2rem; |
| color: #ffffff; |
| margin-top: 10px; |
| font-style: italic; |
| max-width: 700px; |
| margin-left: auto; |
| margin-right: auto; |
| } |
| |
| /* Button styling with hover effect */ |
| .gr-button { |
| background: linear-gradient(90deg, #4CAF50, #FFC107); |
| color: white; |
| padding: 1rem 2rem; |
| font-size: 1.2rem; |
| border-radius: 12px; |
| border: none; |
| cursor: pointer; |
| transition: transform 0.3s ease, background 0.3s ease, box-shadow 0.3s ease; |
| box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); |
| margin-top: 20px; |
| width: 200px; /* Fixed width for consistency */ |
| } |
| |
| .gr-button:hover { |
| background: linear-gradient(90deg, #FFC107, #4CAF50); |
| transform: scale(1.05); |
| box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3); |
| } |
| |
| .gr-button:active { |
| background: linear-gradient(90deg, #4CAF50, #FFC107); |
| transform: scale(1.1); |
| box-shadow: 0 10px 25px rgba(0, 0, 0, 0.4); |
| } |
| |
| /* Image container styling */ |
| .gr-image-container { |
| margin-top: 20px; |
| border-radius: 15px; |
| box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); |
| } |
| |
| /* Textbox styling */ |
| .gr-textbox { |
| background-color: #333; |
| color: #FFEB3B; |
| border: none; |
| padding: 10px; |
| border-radius: 10px; |
| font-size: 1rem; |
| width: 100%; |
| text-align: left; |
| } |
| |
| .gr-textbox:focus { |
| outline: none; |
| border: 2px solid #FF6F61; |
| } |
| |
| /* Button text formatting */ |
| .gradio-button { |
| text-transform: uppercase; |
| } |
| |
| /* Mobile responsiveness */ |
| @media screen and (max-width: 768px) { |
| .gradio-container { |
| padding: 15px; |
| width: 90%; |
| } |
| |
| .gradio-header { |
| font-size: 2rem; |
| } |
| |
| .gr-button { |
| width: 100%; |
| } |
| } |
| |
| /* Desktop and larger screen adjustments */ |
| @media screen and (min-width: 1024px) { |
| .gr-button { |
| width: 250px; |
| } |
| } |
| """ |
| ) |
|
|
| |
| interface.launch() |
|
|