import numpy as np from pycocotools import mask as mask_utils SHAPE = [720, 1280] def mask_prepare(track_dict): scores, masks = [], [] labels = track_dict["labels"] for instance in labels: masks.append(mask_utils.decode(instance["rle"])) scores.append(instance["score"]) return scores, masks, track_dict def mask_postprocess(scores, masks, track_dict): sorted_idxs = np.argsort(scores)[::-1] # Sort indices in descending order of scores processed_area = np.zeros( SHAPE, dtype=np.uint8 ) # Empty mask to record processed areas for idx in sorted_idxs: current_mask = masks[idx] # Remove overlapping parts with already processed areas current_mask = np.where(processed_area, 0, current_mask) if current_mask.sum() > 0: # Only keep non-empty masks # Update processed area processed_area = np.maximum(processed_area, current_mask) masks[idx] = current_mask valid_rle_masks = [ mask_utils.encode(np.asfortranarray(masks[idx])) for idx in sorted_idxs if masks[idx].sum() > 0 ] valid_idxs = [idx for idx in sorted_idxs if masks[idx].sum() > 0] valid_track_dicts = track_dict.copy() valid_labels = [] for i in range(len(valid_idxs)): vidx = valid_idxs[i] if isinstance(valid_rle_masks[i]["counts"], bytes): valid_rle_masks[i]["counts"] = valid_rle_masks[i]["counts"].decode() valid_track_dicts["labels"][vidx]["rle"] = valid_rle_masks[i] valid_labels.append(valid_track_dicts["labels"][vidx]) valid_track_dicts["labels"] = valid_labels return valid_track_dicts