def edit_class(project, class_name): """ Edit the class name and tags for an existing class in the given project. """ project = urllib.parse.unquote(project) class_name = urllib.parse.unquote(class_name) path = project_utils.lookup_project_path(project) # Get new class name and tags new_class_name, new_tag1, new_tag2 = utils.get_class_name_and_tags( request.form) # Update project config config = project_utils.load_project_config(path) del config['classes'][class_name] config['classes'][new_class_name] = [new_tag1, new_tag2] project_utils.write_project_config(path, config) # Update directory names data_dirs = [] for split in SPLITS: data_dirs.extend([ directories.get_videos_dir(path, split), directories.get_frames_dir(path, split), directories.get_tags_dir(path, split), ]) # Feature directories follow the format <dataset_dir>/<split>/<model>/<num_layers_to_finetune>/<label> features_dir = directories.get_features_dir(path, split) if os.path.exists(features_dir): model_dirs = [ os.path.join(features_dir, model_dir) for model_dir in os.listdir(features_dir) ] data_dirs.extend([ os.path.join(model_dir, tuned_layers) for model_dir in model_dirs for tuned_layers in os.listdir(model_dir) ]) logreg_dir = directories.get_logreg_dir(path) if os.path.exists(logreg_dir): data_dirs.extend([ os.path.join(logreg_dir, model_dir) for model_dir in os.listdir(logreg_dir) ]) for base_dir in data_dirs: class_dir = os.path.join(base_dir, class_name) if os.path.exists(class_dir): new_class_dir = os.path.join(base_dir, new_class_name) os.rename(class_dir, new_class_dir) return redirect(url_for('project_details', project=project))
def edit_tag(project, tag_idx): data = request.form project = urllib.parse.unquote(project) path = project_utils.lookup_project_path(project) config = project_utils.load_project_config(path) tags = config['tags'] new_tag_name = data['newTagName'] # Update tag name tags[tag_idx] = new_tag_name project_utils.write_project_config(path, config) return redirect(url_for('project_details', project=project))
def create_tag(project): data = request.form project = urllib.parse.unquote(project) path = project_utils.lookup_project_path(project) config = project_utils.load_project_config(path) tag_name = data['newTagName'] tags = config['tags'] new_tag_index = config['max_tag_index'] + 1 tags[new_tag_index] = tag_name config['max_tag_index'] = new_tag_index project_utils.write_project_config(path, config) return redirect(url_for('project_details', project=project))
def remove_class(project, class_name): """ Remove the given class from the config file of the given project. No data will be deleted. """ project = urllib.parse.unquote(project) class_name = urllib.parse.unquote(class_name) path = project_utils.lookup_project_path(project) # Update project config config = project_utils.load_project_config(path) del config['classes'][class_name] project_utils.write_project_config(path, config) return redirect(url_for("project_details", project=project))
def remove_tag_from_class(): """ Remove selected tag from class label in project config. """ data = request.json path = data['path'] tag_index = data['tagIndex'] class_name = data['className'] config = project_utils.load_project_config(path) config['classes'][class_name].remove(int(tag_index)) project_utils.write_project_config(path, config) return jsonify(success=True)
def remove_tag(project, tag_idx): project = urllib.parse.unquote(project) path = project_utils.lookup_project_path(project) config = project_utils.load_project_config(path) tags = config['tags'] # Remove tag from the overall tags list del tags[tag_idx] # Remove tag from the classes for class_label, class_tags in config['classes'].items(): if tag_idx in class_tags: class_tags.remove(tag_idx) project_utils.write_project_config(path, config) return redirect(url_for('project_details', project=project))
def assign_tag_to_class(): """ Assign selected tag to class label in project config. """ data = request.json path = data['path'] tag_index = data['tagIndex'] class_name = data['className'] config = project_utils.load_project_config(path) class_tags = config['classes'][class_name] class_tags.append(int(tag_index)) class_tags.sort() project_utils.write_project_config(path, config) return jsonify(success=True)
def add_class(project): """ Add a new class to the given project. """ data = request.form project = urllib.parse.unquote(project) path = project_utils.lookup_project_path(project) class_name = data['className'] # Update project config config = project_utils.load_project_config(path) config['classes'][class_name] = [] project_utils.write_project_config(path, config) # Setup directory structure for split in SPLITS: videos_dir = directories.get_videos_dir(path, split, class_name) if not os.path.exists(videos_dir): os.mkdir(videos_dir) return redirect(url_for("project_details", project=project))
def flip_videos(): """ Flip the videos horizontally for given class and copy tags of selected original videos for flipped version of it. """ data = request.json project = data['projectName'] path = project_utils.lookup_project_path(project) config = project_utils.load_project_config(path) counterpart_class_name = str(data['counterpartClassName']) original_class_name = str(data['originalClassName']) copy_video_tags = data['videosToCopyTags'] if counterpart_class_name not in config['classes']: config['classes'][counterpart_class_name] = config['classes'][original_class_name] \ if copy_video_tags['train'] or copy_video_tags['valid'] else [] project_utils.write_project_config(path, config) for split in SPLITS: videos_path_in = os.path.join(path, f'videos_{split}', original_class_name) videos_path_out = os.path.join(path, f'videos_{split}', counterpart_class_name) original_tags_path = os.path.join(path, f'tags_{split}', original_class_name) counterpart_tags_path = os.path.join(path, f'tags_{split}', counterpart_class_name) # Create directory to save flipped videos os.makedirs(videos_path_out, exist_ok=True) os.makedirs(counterpart_tags_path, exist_ok=True) video_list = [video for video in os.listdir(videos_path_in) if video.endswith(VIDEO_EXT)] for video in video_list: output_video_list = [op_video for op_video in os.listdir(videos_path_out) if op_video.endswith(VIDEO_EXT)] print(f'Processing video: {video}') if '_flipped' in video: flipped_video_name = ''.join(video.split('_flipped')) else: flipped_video_name = video.split('.')[0] + '_flipped' + VIDEO_EXT if flipped_video_name not in output_video_list: # Original video as input original_video = ffmpeg.input(os.path.join(videos_path_in, video)) # Do horizontal flip flipped_video = ffmpeg.hflip(original_video) # Get flipped video output flipped_video_output = ffmpeg.output(flipped_video, filename=os.path.join(videos_path_out, flipped_video_name)) # Run to render and save video ffmpeg.run(flipped_video_output) # Copy tags of original video to flipped video (in train/valid set) if video in copy_video_tags[split]: original_tags_file = os.path.join(original_tags_path, video.replace(VIDEO_EXT, '.json')) flipped_tags_file = os.path.join(counterpart_tags_path, flipped_video_name.replace(VIDEO_EXT, '.json')) if os.path.exists(original_tags_file): with open(original_tags_file) as f: original_video_tags = json.load(f) original_video_tags['file'] = flipped_video_name with open(flipped_tags_file, 'w') as f: f.write(json.dumps(original_video_tags, indent=2)) print("Processing complete!") return jsonify(status=True, url=url_for("project_details", project=project))