Primate_Detection_V2 / app_batch.py
annading's picture
added batch abilities for local install
692e2af
BATCH_SIZE = 8 # Change this to your desired batch size
CUDA_PATH = "/usr/local/cuda-12.3/" # Change this to your CUDA path
from datetime import datetime
import os
import sys
# set CUDA_HOME
os.environ["CUDA_HOME"] = CUDA_PATH
import gradio as gr
from tqdm import tqdm
import cv2
import os
import time
from owl_batch import owl_batch_video
# global CSV_PATH # csv that contains video names and detection results
# global POS_ZIP # zip of positive videos and individual results
# global NEG_ZIP # zip of negative videos and individual results
def run_owl_batch(
input_vids : list[str] | str,
target_prompt: str,
species_prompt: str,
conf_threshold: float,
fps_processed: int,
scaling_factor: float
) -> tuple[str, str, str]:
"""
args:
input_vids: list of video paths
target_prompt: prompt to search for
species_prompt: prompt to query
threshold: threshold for detection
fps_processed: number of frames per second to process
scaling_factor: factor to scale the frames by
returns:
csv_path: path to csv file
pos_zip: path to zip file of positive videos
neg_zip: path to zip file of negative videos
"""
start_time = time.time()
if type(input_vids) == str:
input_vids = [input_vids]
for vid in input_vids:
new_input_vid = vid.replace(" ", "_") # make sure there are no spaces in the name
os.rename(vid, new_input_vid)
# species prompt has to contain target prompt, otherwise add it
if target_prompt not in species_prompt:
species_prompt = f"{species_prompt}, {target_prompt}"
# turn target prompt into a list
target_prompt = target_prompt.split(", ")
now = datetime.now()
timestamp = now.strftime("%Y-%m-%d_%H-%M")
zip_path = owl_batch_video(
input_vids,
target_prompt,
species_prompt,
conf_threshold,
fps_processed=fps_processed,
scaling_factor=1/scaling_factor,
batch_size=BATCH_SIZE,
save_dir=f"temp_{timestamp}")
end_time = time.time()
print(f'Processing time: {end_time - start_time} seconds')
return zip_path
with gr.Blocks() as demo:
gr.HTML(
"""
<h1 align="center" style="font-size:xxx-large">🦍 Primate Detection</h1>
"""
)
with gr.Row():
with gr.Column():
input = gr.File(label="Upload Videos", file_types=['.mp4', '.mov'], file_count="multiple")
target_prompt = gr.Textbox(label="What do you want to detect? (Multiple species should be separated by commas)")
species_prompt = gr.Textbox(label="Which species are in your dataset? (Multiple species should be separated by commas)")
with gr.Accordion("Advanced Options", open=False):
conf_threshold = gr.Slider(
label="Confidence Threshold",
info="Adjust the threshold to change the sensitivity of the model, lower thresholds being more sensitive.",
minimum=0.0,
maximum=1.0,
value=0.3,
step=0.05
)
fps_processed = gr.Slider(
label="Frame Detection Rate",
info="Adjust the frame detection rate. I.e. a value of 120 will run detection every 120 frames, a value of 1 will run detection on every frame. Note: the lower the number the slower the processing time.",
minimum=1,
maximum=120,
value=10,
step=1)
scaling_factor = gr.Slider(
label="Downsample Factor",
info="Adjust the downsample factor. Note: the higher the number the faster the processing time but lower the accuracy.",
minimum=1,
maximum=10,
value=4,
step=1
)
with gr.Row():
clear_btn = gr.ClearButton(components=[input, target_prompt, species_prompt])
run_btn = gr.Button(value="Run Detection", variant='primary')
with gr.Column():
download_file = gr.Files(label="CSV, Video Output", interactive=False)
run_btn.click(fn=run_owl_batch, inputs=[input, target_prompt, species_prompt, conf_threshold, fps_processed, scaling_factor], outputs=[download_file])
gr.DuplicateButton()
gr.Markdown(
"""
## Frequently Asked Questions
##### How can I run the interface on my own computer?
By clicking on the three dots on the top right corner of the interface, you will be able to clone the repository or run it with a Docker image on your local machine. \
For local machine setup instructions please check the README file.
##### The video is very slow to process, how can I speed it up?
You can speed up the processing by adjusting the frame detection rate in the advanced options. The lower the number the slower the processing time. Choosing only\
bounding boxes will make the processing faster. You can also duplicate the space using the Duplicate Button and choose a different GPU which will make the processing faster.
"""
)
demo.launch(share=True)