oskarastrom's picture
Output formats
058f18b
raw
history blame
No virus
3.43 kB
import os
import torch
from zipfile import ZipFile
from aris import create_manual_marking, BEAM_WIDTH_DIR, add_metadata_to_result, prep_for_mm
from dataloader import create_dataloader_aris
from inference import do_full_inference, json_dump_round_float
from visualizer import generate_video_batches
def predict_task(filepath, config, output_formats=[], gradio_progress=None):
"""
Main processing task to be run in gradio
- Writes aris frames to dirname(filepath)/frames/{i}.jpg
- Writes json output to dirname(filepath)/{filename}_results.json
- Writes manual marking to dirname(filepath)/{filename}_marking.txt
- Writes video output to dirname(filepath)/{filename}_results.mp4
- Zips all results to dirname(filepath)/{filename}_results.zip
Args:
filepath (str): path to aris file
"""
if (gradio_progress): gradio_progress(0, "In task...")
print("Cuda available in task?", torch.cuda.is_available())
# Set up save directory and define file names
dirname = os.path.dirname(filepath)
filename = os.path.basename(filepath).replace(".aris","").replace(".ddf","")
results_filepath = os.path.join(dirname, f"{filename}_results.json")
marking_filepath = os.path.join(dirname, f"{filename}_marking.txt")
video_filepath = os.path.join(dirname, f"{filename}_results.mp4")
zip_filepath = os.path.join(dirname, f"{filename}_results.zip")
os.makedirs(dirname, exist_ok=True)
# Create dataloader
if (gradio_progress): gradio_progress(0, "Initializing Dataloader...")
dataloader, dataset = create_dataloader_aris(filepath, BEAM_WIDTH_DIR, None)
# Extract aris/didson info. Didson does not yet have pixel-meter info
if ".ddf" in filepath:
image_meter_width = -1
image_meter_height = -1
else:
image_meter_width = dataset.didson.info['xdim'] * dataset.didson.info['pixel_meter_width']
image_meter_height = dataset.didson.info['ydim'] * dataset.didson.info['pixel_meter_height']
frame_rate = dataset.didson.info['framerate']
# run detection + tracking
results = do_full_inference(dataloader, image_meter_width, image_meter_height, gp=gradio_progress, config=config)
# Generate Metadata and extra inference information
results = prep_for_mm(results)
results = add_metadata_to_result(filepath, results)
results['metadata']['hyperparameters'] = config.to_dict()
# Create JSON result file
json_dump_round_float(results, results_filepath)
# Create Manual Marking file
if "Manual Marking" in output_formats and dataset.didson.info['version'][3] == 5:
create_manual_marking(results, out_path=marking_filepath)
# Create Annotated Video
if "Annotated Video" in output_formats:
generate_video_batches(dataset.didson, results, frame_rate, video_filepath,
image_meter_width=image_meter_width, image_meter_height=image_meter_height, gp=gradio_progress)
# Zip up the results
with ZipFile(zip_filepath, 'w') as z:
for file in [results_filepath, marking_filepath, video_filepath, os.path.join(dirname, 'bg_start.jpg')]:
if os.path.exists(file):
z.write(file, arcname=os.path.basename(file))
# Release GPU memory
torch.cuda.empty_cache()
return results, results_filepath, zip_filepath, video_filepath, marking_filepath