cvtools / app.py
rifatramadhani's picture
wip
f58205e
# Standard library imports
import os
import gradio as gr
import spaces
# Local imports
from age_estimation.age_estimation import age_estimation as _age_estimation
from detection.face_detection import face_detection
from detection.object_detection import object_detection as _object_detection
from utils.ui_utils import update_input_visibility
@spaces.GPU
def age_estimation(input_type, uploaded_image, image_url, base64_string):
return _age_estimation(input_type, uploaded_image, image_url, base64_string)
@spaces.GPU
def object_detection(input_type, uploaded_image, image_url, base64_string):
return _object_detection(input_type, uploaded_image, image_url, base64_string)
with gr.Blocks() as demo:
# Add a title to the interface
gr.Markdown("# Computer Vision Tools")
# Create a tab for face detection
with gr.Tab("Face Detection"):
# Input Method Selection
face_input_type = gr.Radio(
["Upload File", "Enter URL", "Enter Base64"],
label="Input Method",
value="Upload File", # Default selection
)
# Face Detection Method Selection
face_detection_method = gr.Radio(
["OpenCV", "dlib"],
label="Face Detection Method",
value="OpenCV", # Default selection
)
# Input Components (initially only file upload is visible)
with gr.Row():
face_img_upload = gr.Image(type="pil", label="Upload Image", visible=True)
face_url_input = gr.Textbox(
label="Enter Image URL", placeholder="e.g., https://...", visible=False
)
face_base64_input = gr.Textbox(
label="Enter Base64 String",
placeholder="Enter base64 string here...",
visible=False,
)
# Process Button
face_process_btn = gr.Button("Process Image")
# Output Components
face_image_output = gr.Image(label="Detected Faces Image")
face_bbox_output = gr.JSON(label="Raw Bounding Box Data")
# Link radio button change to visibility update function
face_input_type.change(
fn=update_input_visibility,
inputs=[face_input_type],
outputs=[face_img_upload, face_url_input, face_base64_input],
queue=False,
api_name=False,
)
# Link process button to the face detection function
# The face_detection function will now return a tuple
face_process_btn.click(
fn=face_detection,
inputs=[
face_input_type,
face_img_upload,
face_url_input,
face_base64_input,
face_detection_method,
],
outputs=[face_image_output, face_bbox_output],
)
# Create a tab for age estimation
with gr.Tab("Age Estimation"):
# Input Method Selection
age_input_type = gr.Radio(
["Upload File", "Enter URL", "Enter Base64"],
label="Input Method",
value="Upload File", # Default selection
)
# Input Components (initially only file upload is visible)
with gr.Row():
age_img_upload = gr.Image(type="pil", label="Upload Image", visible=True)
age_url_input = gr.Textbox(
label="Enter Image URL", placeholder="e.g., https://...", visible=False
)
age_base64_input = gr.Textbox(
label="Enter Base64 String",
placeholder="Enter base64 string here...",
visible=False,
)
# Process Button
age_process_btn = gr.Button("Estimate Age")
# Output Components
age_text_output = gr.Textbox(label="Estimated Age Summary")
age_raw_output = gr.JSON(label="Raw Age Estimation Data")
# Link radio button change to visibility update function
age_input_type.change(
fn=update_input_visibility,
inputs=[age_input_type],
outputs=[age_img_upload, age_url_input, age_base64_input],
queue=False,
api_name=False,
)
# Link process button to the age estimation function
# The age_estimation function will now return a tuple
age_process_btn.click(
fn=age_estimation,
inputs=[age_input_type, age_img_upload, age_url_input, age_base64_input],
outputs=[age_text_output, age_raw_output],
)
# Create a tab for object detection
with gr.Tab("Object Detection"):
# Input Method Selection
obj_input_type = gr.Radio(
["Upload File", "Enter URL", "Enter Base64"],
label="Input Method",
value="Upload File", # Default selection
)
# Input Components (initially only file upload is visible)
with gr.Row():
obj_img_upload = gr.Image(type="pil", label="Upload Image", visible=True)
obj_url_input = gr.Textbox(
label="Enter Image URL", placeholder="e.g., https://...", visible=False
)
obj_base64_input = gr.Textbox(
label="Enter Base64 String",
placeholder="Enter base64 string here...",
visible=False,
)
# Process Button
obj_process_btn = gr.Button("Detect Objects")
# Output Components
obj_image_output = gr.Image(
label="Detected Objects Image"
) # Updated label for clarity
obj_raw_output = gr.JSON(label="Raw Object Detection Data") # Added JSON output
# Link radio button change to visibility update function
obj_input_type.change(
fn=update_input_visibility,
inputs=[obj_input_type],
outputs=[obj_img_upload, obj_url_input, obj_base64_input],
queue=False,
api_name=False,
)
# Link process button to the object detection function
# The object_detection function now returns a tuple (image, raw_data)
obj_process_btn.click(
fn=object_detection,
inputs=[obj_input_type, obj_img_upload, obj_url_input, obj_base64_input],
outputs=[obj_image_output, obj_raw_output], # Updated outputs
)
# Launch the Gradio demo
port = int(os.environ.get("GRADIO_SERVER_PORT", 7860))
import sys
if "--server_port" in sys.argv:
port = int(sys.argv[sys.argv.index("--server_port") + 1])
demo.launch(server_port=port, ssr_mode=True, share=True)