apec-segment / utils /utils.py
FatemehT's picture
style: run pre-commit
8e6512c
import os
import random
import time
import cv2
import numpy
import skimage
import torch
from sklearn.metrics import ( # recall = sensitivity, precision = PPV
accuracy_score,
f1_score,
jaccard_score,
precision_score,
recall_score,
roc_auc_score,
)
""" Seeding the randomness. """
def seeding(seed):
random.seed(seed)
os.environ["PYTHONHASHSEED"] = str(seed)
numpy.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cudnn.deterministic = True
""" Create a directory. """
def create_dir(path):
if not os.path.exists(path):
os.makedirs(path)
else:
pass
""" Calculate the time taken """
def epoch_time(start_time, end_time):
elapsed_time = end_time - start_time
elapsed_mins = int(elapsed_time / 60)
elapsed_secs = int(elapsed_time - (elapsed_mins * 60))
return elapsed_mins, elapsed_secs
"""METRICS"""
def metricsCalculator(y_true, y_pred):
score_jaccard = jaccard_score(y_true, y_pred, pos_label=255)
score_f1 = f1_score(y_true, y_pred, pos_label=255)
score_recall = recall_score(y_true, y_pred, pos_label=255)
score_precision = precision_score(y_true, y_pred, pos_label=255)
score_acc = accuracy_score(y_true, y_pred)
score_auc = roc_auc_score(y_true, y_pred)
scores = [
score_jaccard,
score_f1,
score_recall,
score_precision,
score_acc,
score_auc,
]
print(
f"\t=>Jaccard: {score_jaccard:1.4f} - F1: {score_f1:1.4f} - Recall: {score_recall:1.4f} - Precision: {score_precision:1.4f} - Acc: {score_acc:1.4f} - AUC: {score_auc:1.4f}\n"
)
return scores
def skelEndpoints(maskArray):
skel = skimage.morphology.skeletonize(maskArray.astype("bool"))
skel = numpy.uint8(skel > 0)
# Apply the convolution.
kernel = numpy.uint8([[1, 1, 1], [1, 10, 1], [1, 1, 1]])
src_depth = -1
filtered = cv2.filter2D(skel, src_depth, kernel)
# Look through to find the value of 11.
# This returns a mask of the endpoints, but if you
# just want the coordinates, you could simply
# return numpy.where(filtered==11)
out = numpy.zeros_like(skel)
out[numpy.where(filtered == 11)] = 1
# endCoords = numpy.where(filtered==11)
# endCoords = list(zip(*endCoords))
# startPoint = endCoords[0]
# endPoint = endCoords[1]
# print(f"Skel starts at {startPoint} and finishes at {endPoint}")
# print(sum(out))
out = out.astype("uint8") * 255
return out
def crudeMaskGenerator(maskArray):
skel = skimage.morphology.skeletonize(maskArray.astype("bool"))
skel = numpy.uint8(skel > 0)
radius = 15
crudeMask = numpy.zeros_like(skel)
skelPoints = numpy.argwhere(skel > 0)
# Create a circular mask to dilate the skel
y, x = numpy.ogrid[-radius : radius + 1, -radius : radius + 1]
circleMask = x**2 + y**2 <= radius**2
for i, point in enumerate(skelPoints[:-1]):
yPos = point[0]
xPos = point[1]
if yPos < skel.shape[0] - radius and xPos < skel.shape[1] - radius:
if yPos > radius and xPos > radius:
crudeMask[
int(yPos - radius) : int(yPos + radius + 1),
int(xPos - radius) : int(xPos + radius + 1),
] += circleMask
crudeMask = crudeMask > 0
return crudeMask.astype("uint8") * 255