Open Leminhhuy2386 opened 5 months ago
You just have to do one minor fix. In the file utils_test.py
and function compute_pro()
change the following line:
from binary_amaps = np.zeros_like(amaps, dtype=np.bool)
to binary_amaps = np.zeros_like(amaps, dtype=bool)
def compute_pro(masks: ndarray, amaps: ndarray, num_th: int = 200) -> None:
"""Compute the area under the curve of per-region overlaping (PRO) and 0 to 0.3 FPR
Args:
category (str): Category of product
masks (ndarray): All binary masks in test. masks.shape -> (num_test_data, h, w)
amaps (ndarray): All anomaly maps in test. amaps.shape -> (num_test_data, h, w)
num_th (int, optional): Number of thresholds
"""
assert isinstance(amaps, ndarray), "type(amaps) must be ndarray"
assert isinstance(masks, ndarray), "type(masks) must be ndarray"
assert amaps.ndim == 3, "amaps.ndim must be 3 (num_test_data, h, w)"
assert masks.ndim == 3, "masks.ndim must be 3 (num_test_data, h, w)"
assert amaps.shape == masks.shape, "amaps.shape and masks.shape must be same"
assert set(masks.flatten()) == {0, 1}, "set(masks.flatten()) must be {0, 1}"
assert isinstance(num_th, int), "type(num_th) must be int"
# df = pd.DataFrame([], columns=["pro", "fpr", "threshold"])
d = {'pro':[], 'fpr':[],'threshold': []}
##########################LINE TO CHANGE##########################
binary_amaps = np.zeros_like(amaps, dtype=np.bool) # change to "bool" instead of "np.bool"
#################################################################
min_th = amaps.min()
max_th = amaps.max()
delta = (max_th - min_th) / num_th
for th in np.arange(min_th, max_th, delta):
binary_amaps[amaps <= th] = 0
binary_amaps[amaps > th] = 1
pros = []
for binary_amap, mask in zip(binary_amaps, masks):
for region in measure.regionprops(measure.label(mask)):
axes0_ids = region.coords[:, 0]
axes1_ids = region.coords[:, 1]
tp_pixels = binary_amap[axes0_ids, axes1_ids].sum()
pros.append(tp_pixels / region.area)
inverse_masks = 1 - masks
fp_pixels = np.logical_and(inverse_masks, binary_amaps).sum()
fpr = fp_pixels / inverse_masks.sum()
# df = df.append({"pro": mean(pros), "fpr": fpr, "threshold": th}, ignore_index=True)
d['pro'].append(mean(pros))
d['fpr'].append(fpr)
d['threshold'].append(th)
df = pd.DataFrame(d)
# Normalize FPR from 0 ~ 1 to 0 ~ 0.3
df = df[df["fpr"] < 0.3]
df["fpr"] = df["fpr"] / df["fpr"].max()
pro_auc = auc(df["fpr"], df["pro"])
return pro_auc
Dears, I ran the example in colab and it has error as the attached image. Could you please check you code again? Thank you very much!