Spaces:
Running
Running
| # import gradio as gr | |
| # from ultralytics import YOLO | |
| # import os | |
| # import torch | |
| # # --- DOCUMENTATION STRINGS (Coin Detector App) --- | |
| # GUIDELINE_SETUP = """ | |
| # ## 1. Quick Start Guide: Detection and Filtering | |
| # This application uses a trained YOLO model to automatically detect coins in an image and allows you to filter the results based on detection confidence. | |
| # 1. **Upload Image:** Upload the image you want to analyze in the 'Input Image' box. | |
| # 2. **Adjust Threshold:** Use the 'Confidence Threshold' slider to set the minimum certainty required for a coin to be displayed. | |
| # 3. **Review:** The output image will show bounding boxes around all detections that meet or exceed the set threshold. | |
| # """ | |
| # GUIDELINE_INPUT = """ | |
| # ## 2. Expected Inputs and Parameters | |
| # | Input Field | Purpose | Requirement | | |
| # | :--- | :--- | :--- | | |
| # | **Input Image** | The photograph containing the coins you wish to detect. | Must be an image file (e.g., JPG, PNG). | | |
| # | **Confidence Threshold** | Filters the model's predictions. Only detections with a confidence score equal to or higher than this value will be shown. | Slider range: 0.0 (least strict) to 1.0 (most strict). Default is 0.5. | | |
| # **Tip:** If you see too many false positives (non-coins being detected), raise the threshold. If the model misses coins you know are there, try lowering the threshold. | |
| # """ | |
| # GUIDELINE_OUTPUT = """ | |
| # ## 3. Expected Outputs (Annotated Image) | |
| # The output is a single image component displaying the **Annotated Frame**. | |
| # * **Content:** This image is the original input image with colored bounding boxes drawn around every coin detected by the model that passed the `Confidence Threshold` filter. | |
| # * **Bounding Boxes:** Each box confirms a coin detection and is usually accompanied by a label (e.g., 'coin') and the confidence score (e.g., 0.95). | |
| # """ | |
| # # Load the YOLO model | |
| # # NOTE: The model file 'best1.pt' must exist in the same directory or accessible path. | |
| # model = YOLO('best1.pt') | |
| # def predict(img, confidence_threshold): | |
| # # Perform inference | |
| # # Note: Using verbose=False to keep the interface clean during prediction | |
| # results = model(img, verbose=False) | |
| # # Filter predictions based on the confidence threshold | |
| # # The results[0].boxes.data contains the detection results, including confidence scores | |
| # # We filter the bounding boxes data array based on the confidence score (index 4) | |
| # # Then we must convert the filtered list back to a tensor format expected by the plotting function. | |
| # filtered_data = [box.cpu() for box in results[0].boxes.data if box[4] >= confidence_threshold] | |
| # if filtered_data: | |
| # filtered_tensor = torch.stack(filtered_data) | |
| # # Create a deep copy of the original results object to manipulate its boxes data | |
| # filtered_results = results[0].cpu() | |
| # filtered_results.boxes.data = filtered_tensor | |
| # # Plot the results using the filtered results object | |
| # annotated_frame = filtered_results.plot() | |
| # else: | |
| # # If no coins pass the filter, plot the original image without boxes | |
| # annotated_frame = results[0].plot() | |
| # return annotated_frame | |
| # # Create the Gradio interface using gr.Blocks to allow for documentation placement | |
| # with gr.Blocks(title="Coin Detector") as iface: | |
| # gr.Markdown("# Coin Detector") | |
| # gr.Markdown("Upload an image to detect coins. Adjust the confidence threshold to filter results.") | |
| # # 1. Guidelines Section | |
| # with gr.Accordion("User Guidelines and Documentation", open=False): | |
| # gr.Markdown(GUIDELINE_SETUP) | |
| # gr.Markdown("---") | |
| # gr.Markdown(GUIDELINE_INPUT) | |
| # gr.Markdown("---") | |
| # gr.Markdown(GUIDELINE_OUTPUT) | |
| # gr.Markdown("---") | |
| # # 2. Input/Output Layout | |
| # with gr.Row(): | |
| # with gr.Column(scale=2): | |
| # gr.Markdown("## Step 1: Upload an Image ") | |
| # input_img = gr.Image(label="Input Image", type="filepath") | |
| # gr.Markdown("## Step 2: Adjest Confidence Threshold (Optional) ") | |
| # confidence_slider = gr.Slider(minimum=0, maximum=1, value=0.5, label="Confidence Threshold", step=0.01) | |
| # gr.Markdown("## Step 3: Click Detect Coins ") | |
| # submit_btn = gr.Button("Detect Coins", variant="primary") | |
| # with gr.Column(scale=1): | |
| # gr.Markdown("## Result ") | |
| # output_img = gr.Image(label="Output Image") | |
| # # 3. Example Data (if available, added here for completeness) | |
| # # Note: Since no examples were provided, this is commented out or left as placeholders. | |
| # gr.Markdown("## Examples ") | |
| # gr.Examples( | |
| # examples=[["./sample_data/coin.jpeg", 0.5], ["./sample_data/Test21.png", 0.4]], | |
| # inputs=[input_img, confidence_slider], | |
| # outputs=output_img, | |
| # fn=predict, | |
| # cache_examples=False | |
| # ) | |
| # # 4. Event Handler | |
| # submit_btn.click( | |
| # fn=predict, | |
| # inputs=[input_img, confidence_slider], | |
| # outputs=output_img | |
| # ) | |
| # # Launch the Gradio interface | |
| # iface.queue() | |
| # iface.launch(share=True) | |
| import gradio as gr | |
| from ultralytics import YOLO | |
| import torch | |
| import os | |
| # --- DOCUMENTATION STRINGS (Coin Detector App) --- | |
| GUIDELINE_SETUP = """ | |
| ## 1. Quick Start Guide: Detection and Filtering | |
| This application uses a trained YOLO model to automatically detect coins in an image and allows you to filter the results based on detection confidence. | |
| 1. **Upload Image:** Upload the image you want to analyze in the 'Input Image' box. | |
| 2. **Adjust Threshold:** Use the 'Confidence Threshold' slider to set the minimum certainty required for a coin to be displayed. | |
| 3. **Run:** Click the **"Detect Coins"** button. | |
| 4. **Review:** The output image will show bounding boxes around all detections that meet or exceed the set threshold. | |
| """ | |
| GUIDELINE_INPUT = """ | |
| ## 2. Expected Inputs and Parameters | |
| | Input Field | Purpose | Requirement | | |
| | :--- | :--- | :--- | | |
| | **Input Image** | The photograph containing the coins you wish to detect. | Must be an image file (e.g., JPG, PNG). | | |
| | **Confidence Threshold** | Filters the model's predictions. Only detections with a confidence score equal to or higher than this value will be shown. | Slider range: 0.0 (least strict) to 1.0 (most strict). Default is 0.5. | | |
| **Tip:** If you see too many false positives (non-coins being detected), raise the threshold. If the model misses coins you know are there, try lowering the threshold. | |
| """ | |
| GUIDELINE_OUTPUT = """ | |
| ## 3. Expected Outputs (Annotated Image) | |
| The output is a single image component displaying the **Annotated Frame**. | |
| * **Content:** This image is the original input image with colored bounding boxes drawn around every coin detected by the model that passed the `Confidence Threshold` filter. | |
| * **Bounding Boxes:** Each box confirms a coin detection and is usually accompanied by a label (e.g., 'coin') and the confidence score (e.g., 0.95). | |
| """ | |
| # Load the YOLO model | |
| model = YOLO('best1.pt') | |
| def predict(img, confidence_threshold): | |
| # Perform inference | |
| # Using verbose=False to suppress unnecessary console output during inference | |
| results = model(img, verbose=True) | |
| # We filter the bounding boxes data array based on the confidence score (index 4) | |
| # Filter predictions based on the confidence threshold | |
| filtered_data = [box.cpu() for box in results[0].boxes.data if box[4] >= confidence_threshold] | |
| if filtered_data: | |
| # Stack the filtered tensors back into a single tensor | |
| filtered_tensor = torch.stack(filtered_data) | |
| # Create a results object to plot only the filtered boxes | |
| filtered_results = results[0].cpu() | |
| filtered_results.boxes.data = filtered_tensor | |
| # Plot the results using the filtered results object | |
| annotated_frame = filtered_results.plot() | |
| else: | |
| # If no coins pass the filter, plot the original image without boxes | |
| annotated_frame = results[0].plot() | |
| return annotated_frame | |
| # Create the Gradio interface using gr.Blocks to allow for documentation placement | |
| with gr.Blocks(title="Coin Detector") as iface: | |
| gr.Markdown("# Coin Detector") | |
| gr.Markdown("Upload an image to detect coins. Adjust the confidence threshold to filter results.") | |
| # 1. Guidelines Section | |
| with gr.Accordion("User Guidelines and Documentation", open=False): | |
| gr.Markdown(GUIDELINE_SETUP) | |
| gr.Markdown("---") | |
| gr.Markdown(GUIDELINE_INPUT) | |
| gr.Markdown("---") | |
| gr.Markdown(GUIDELINE_OUTPUT) | |
| gr.Markdown("---") | |
| # 2. Input/Output Layout | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("## Step 1: Upload an Image Having Coin") | |
| input_img = gr.Image(label="Input Image", type="filepath") | |
| gr.Markdown("## Step 2: Set the Confidence Threshold (Optional) ") | |
| confidence_slider = gr.Slider(minimum=0, maximum=1, value=0.5, label="Confidence Threshold", step=0.01) | |
| gr.Markdown("## Step 3: Click Detect Coins Button") | |
| submit_btn = gr.Button("Detect Coins", variant="primary") | |
| with gr.Column(scale=2): | |
| gr.Markdown("## Result ") | |
| output_img = gr.Image(label="Detected Coins ") | |
| # 3. Example Data (if available, added here for completeness) | |
| # Note: Since no examples were provided, this is commented out or left as placeholders. | |
| gr.Markdown("## Examples ") | |
| gr.Examples( | |
| examples=[["./sample_data/coin.jpeg", 0.5], ["./sample_data/Test21.png", 0.4]], | |
| inputs=[input_img, confidence_slider], | |
| outputs=output_img, | |
| fn=predict, | |
| cache_examples=False | |
| ) | |
| # 3. Event Handler | |
| submit_btn.click( | |
| fn=predict, | |
| inputs=[input_img, confidence_slider], | |
| outputs=output_img | |
| ) | |
| # Launch the Gradio interface | |
| iface.queue() | |
| iface.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=True | |
| ) |