File size: 7,643 Bytes
97a245c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
import sys, os, distutils.core
# os.system('python -m pip install pyyaml==5.3.1')
# dist = distutils.core.run_setup("./detectron2/setup.py")
# temp = ' '.join([f"'{x}'" for x in dist.install_requires])
# cmd = "python -m pip install {0}".format(temp)
# os.system(cmd)
sys.path.insert(0, os.path.abspath('./detectron2'))
import detectron2
import numpy as np
import cv2
# from detectron2.utils.logger import setup_logger
# setup_logger()
# # from detectron2.modeling import build_model
# from detectron2 import model_zoo
# from detectron2.engine import DefaultPredictor
# from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
# from detectron2.data import MetadataCatalog, DatasetCatalog
# from detectron2.checkpoint import DetectionCheckpointer
# from detectron2.data.datasets import register_coco_instances
# cfg = get_cfg()
# cfg.OUTPUT_DIR = "./output/splash/"
# # model = build_model(cfg) # returns a torch.nn.Module
# cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
# cfg.DATASETS.TRAIN = ("splash_trains",)
# cfg.DATASETS.TEST = ()
# cfg.DATALOADER.NUM_WORKERS = 2
# cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo
# cfg.SOLVER.IMS_PER_BATCH = 2 # This is the real "batch size" commonly known to deep learning people
# cfg.SOLVER.BASE_LR = 0.00025 # pick a good LR
# cfg.SOLVER.MAX_ITER = 300 # 300 iterations seems good enough for this toy dataset; you will need to train longer for a practical dataset
# cfg.SOLVER.STEPS = [] # do not decay learning rate
# cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128 # The "RoIHead batch size". 128 is faster, and good enough for this toy dataset (default: 512)
# cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1
# cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth") # path to the model we just trained
# cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7 # set a custom testing threshold
# predictor = DefaultPredictor(cfg)
# register_coco_instances("splash_trains", {}, "./coco_annotations/splash/train.json", "./data/Splashes")
# register_coco_instances("splash_vals", {}, "./coco_annotations/splash/val.json", "./data/Splashes")
# from detectron2.utils.visualizer import ColorMode
# splash_metadata = MetadataCatalog.get('splash_vals')
# dataset_dicts = DatasetCatalog.get("splash_vals")
# outputs_array = []
# for d in dataset_dicts:
# im = cv2.imread(d["file_name"])
# outputs = predictor(im)
# outputs_array.append(outputs) # format is documented at https://detectron2.readthedocs.io/tutorials/models.html#model-output-format
# v = Visualizer(im[:, :, ::-1],
# metadata=splash_metadata,
# scale=0.5,
# instance_mode=ColorMode.IMAGE_BW # remove the colors of unsegmented pixels. This option is only available for segmentation models
# )
# out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
# img = out.get_image()[:, :, ::-1]
# filename = os.path.join("./output", d["file_name"][2:])
# if not cv2.imwrite(filename, img):
# print('no image written')
import torch
# SPLASH MICRO PROGRAM
# find percentage of "True" in pred_masks, lower the percentage the better. get from outputs
# may need to calibrate to points
def get_splash_pred_mask(output):
pred_classes = output['instances'].pred_classes.cpu().numpy()
splashes = np.where(pred_classes == 0)[0]
scores = output['instances'].scores[splashes]
if len(scores) == 0:
return None
pred_masks = output['instances'].pred_masks[splashes]
max_instance = torch.argmax(scores)
# pred_mask = pred_masks[max_instance] # splash instance with highest confidence
pred_mask = np.array(pred_masks[max_instance].cpu())
return pred_mask
# function that finds the splash instance with the highest percent confidence
# and returns the
def splash_area_percentage(output, pred_mask=None):
if pred_mask is None:
return
# loops over pixels to get sum of splash pixels
totalSum = 0
for j in range(len(pred_mask)):
totalSum += pred_mask[j].sum()
# return percentage of image that is splash
return totalSum/(len(pred_mask) * len(pred_mask[0]))
# loops over each image
# i = 0
# for output in outputs_array:
# print(dataset_dicts[i]["file_name"])
# # print(output)
# print(splash_area_percentage(output))
# i+=1
# TODO: run splash micro program on one diving clip
# plot splash area percentage and save image
import matplotlib.pyplot as plt
from models.detectron2.splash_detector_setup import get_splash_detector
def get_splash_from_one_frame(filepath, im=None, predictor=None, visualize=False, dive_folder_num=""):
if predictor is None:
predictor=get_splash_detector()
if im is None:
im = cv2.imread(filepath)
outputs = predictor(im)
pred_mask = get_splash_pred_mask(outputs)
area = splash_area_percentage(outputs, pred_mask=pred_mask)
if area is None:
# print("no splash detected in", filepath)
return None, None
if visualize:
pred_boxes = outputs['instances'].pred_boxes
print("pred_boxes", pred_boxes)
for box in pred_boxes:
image = cv2.rectangle(im, (int(box[0]),int(box[1])), (int(box[2]),int(box[3])), color=(0, 0, 255), thickness=2)
out_folder= "./output/data/splash/{}".format(dive_folder_num)
if not os.path.exists(out_folder):
os.makedirs(out_folder)
filename = os.path.join(out_folder, filepath.split('/')[-1])
if not cv2.imwrite(filename, image):
print('no image written to', filename)
break
return area.tolist(), pred_mask
# outputs_array2 = []
# directory = "./MTL-AQA/"
# file_names = os.listdir(directory)
# for file_name in file_names:
# if file_name[:10] == "img_01_06_":
# path = os.path.join(directory, file_name)
# # im = caffe.io.load_image(path)
# print("PATH IM_01_06:", path)
# im = cv2.imread(path)
# outputs = predictor(im)
# outputs_array2.append(outputs) # format is documented at https://detectron2.readthedocs.io/tutorials/models.html#model-output-format
# v = Visualizer(im[:, :, ::-1],
# metadata=splash_metadata,
# scale=0.5,
# instance_mode=ColorMode.IMAGE_BW # remove the colors of unsegmented pixels. This option is only available for segmentation models
# )
# out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
# img = out.get_image()[:, :, ::-1]
# filename = os.path.join("./output/data/img_01_06/", file_name)
# if not cv2.imwrite(filename, img):
# print('no image written')
# i = 0
# splash_area = []
# for output in outputs_array2:
# # print(output)
# area = splash_area_percentage(output)
# if area is None:
# splash_area.append(0)
# else:
# print(area.cpu().data.item())
# splash_area.append(area.cpu().data.item())
# # print(splash_area_percentage(output))
# i+=1
# print(range(i))
# print(splash_area)
# plt.plot(range(i), splash_area)
# plt.savefig('./output/data/img_01_06/img_01_06_splash_graph.png')
# from detectron2.evaluation import COCOEvaluator, inference_on_dataset
# from detectron2.data import build_detection_test_loader
# evaluator = COCOEvaluator("splash_vals", output_dir="./output")
# val_loader = build_detection_test_loader(cfg, "splash_vals")
# print(inference_on_dataset(predictor.model, val_loader, evaluator))
|