fisheye-experimental / scripts /detect_frames.py
oskarastrom's picture
Fixed tracking
1548828
raw
history blame
3.07 kB
import project_path
from lib.yolov5.utils.general import clip_boxes, scale_boxes
import argparse
from datetime import datetime
import torch
import os
from dataloader import create_dataloader_frames_only
from inference import setup_model, do_detection, do_suppression, do_confidence_boost, format_predictions, do_tracking
from visualizer import generate_video_batches
import json
from tqdm import tqdm
import numpy as np
def main(args, verbose=True):
"""
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
TODO: Separate into subtasks in different queues; have a GPU-only queue.
"""
print("In task...")
print("Cuda available in task?", torch.cuda.is_available())
model, device = setup_model(args.weights)
locations = [
"kenai-val"
]
for loc in locations:
in_loc_dir = os.path.join(args.frames, loc)
out_loc_dir = os.path.join(args.output, loc)
print(in_loc_dir)
print(out_loc_dir)
detect_location(in_loc_dir, out_loc_dir, model, device, verbose)
def detect_location(in_loc_dir, out_loc_dir, model, device, verbose):
seq_list = os.listdir(in_loc_dir)
with tqdm(total=len(seq_list), desc="...", ncols=0) as pbar:
for seq in seq_list:
pbar.update(1)
if (seq.startswith(".")): continue
pbar.set_description("Processing " + seq)
in_seq_dir = os.path.join(in_loc_dir, seq)
out_seq_dir = os.path.join(out_loc_dir, seq)
os.makedirs(out_seq_dir, exist_ok=True)
detect(in_seq_dir, out_seq_dir, model, device, verbose)
def detect(in_seq_dir, out_seq_dir, model, device, verbose):
# create dataloader
dataloader = create_dataloader_frames_only(in_seq_dir)
inference, image_shapes, width, height = do_detection(dataloader, model, device, verbose=verbose)
json_obj = {
'image_shapes': image_shapes,
'width': width,
'height': height
}
with open(os.path.join(out_seq_dir, 'pred.json'), 'w') as f:
json.dump(json_obj, f)
torch.save(inference, os.path.join(out_seq_dir, 'inference.pt'))
def argument_parser():
parser = argparse.ArgumentParser()
parser.add_argument("--frames", required=True, help="Path to frame directory. Required.")
parser.add_argument("--output", required=True, help="Path to output directory. Required.")
parser.add_argument("--weights", default='models/v5m_896_300best.pt', help="Path to saved YOLOv5 weights. Default: ../models/v5m_896_300best.pt")
return parser
if __name__ == "__main__":
args = argument_parser().parse_args()
main(args)