Skip to content

Commit

Permalink
1. updated the rule in the evaluation of different sized regions
Browse files Browse the repository at this point in the history
   (🔥Make sure you are using the same version of the protocol when you compare detection performance with other methods on different size regions🔥);
2. updated sample threshold with pixel ratio;
3. updated configure of dataset path;
4. unified all metric names by "F1";
  • Loading branch information
nico-zck committed Mar 13, 2023
1 parent a99ad26 commit a2a2b4e
Show file tree
Hide file tree
Showing 19 changed files with 50 additions and 37 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
saved_models/ # exclude model checkpoints

# Created by .ignore support plugin (hsz.mobi)
### Python template
# Byte-compiled / optimized / DLL files
Expand Down
2 changes: 1 addition & 1 deletion baselines/libs/configurer/DEFAULT.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: zscore
color_mode: rgb
Expand Down
5 changes: 2 additions & 3 deletions baselines/libs/dataset/base_datasets.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from typing import List

import numpy as np
import torch
from PIL import Image, ImageOps
from numpy.lib.stride_tricks import as_strided
from torch.utils.data import Dataset
from torchvision import transforms
from typing import List

from ..dataset_api.zl_fabric import ZLImage
from dataset_api.zl_fabric import ZLImage

'''
FabricFinal RGB
Expand Down
3 changes: 1 addition & 2 deletions baselines/libs/evaluator/evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,11 @@
from collections import OrderedDict
from datetime import datetime
from math import isnan

from pandas import DataFrame
from tensorboardX import SummaryWriter

from dataset_api import ZLEval
from ..configurer import Configurer
from ..dataset_api import ZLEval


class _Evaluator(ABC):
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_augment/unet_aug/unet-aug.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: '[0,1]'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_fully/unet/unet-defect-group.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: groups
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_fully/unet/unet-defect-total.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: total
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_fully/unet/unet-defect.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_fully/unet/unet-small.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_one_class/cae/cae.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
color_mode: gray
normalization: '[-1,1]'
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_one_class/ocsvm_feat/ocsvm_feat.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
color_mode: gray
normalization: '[-1,1]'
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_one_class/sc/sc.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
color_mode: gray
normalization: histeq
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_transfer/unet_unsup/unet-unsup.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_weakly/bbox/unet_bbox.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: 'zscore'
color_mode: rgb
Expand Down
2 changes: 1 addition & 1 deletion baselines/models/seg_weakly/label/unet_label.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
DATASET:
dataset_dir: /home/nico/Dataset/FabricFinal
dataset_dir: /home/nico/Dataset/ZJU-Leaper
fabrics: all
normalization: 'zscore'
color_mode: rgb
Expand Down
4 changes: 2 additions & 2 deletions dataset_api/eval_pixel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
@Time : 2019-05-07 23:53
@Author : Nico
"""
from collections import OrderedDict

import numpy as np
from collections import OrderedDict
from typing import Tuple


Expand Down Expand Up @@ -86,6 +85,7 @@ def evaluation_pixel(binary_pixel_pred: np.ndarray, binary_pixel_target: np.ndar
Pre=precision,
Rec=recall,
Dice=dice,
F1=dice, # dice index is just the pixel F1-score
# IoU=_iou(confusion),
# nMCC=_mcc(confusion, normalized=True),
)
Expand Down
35 changes: 23 additions & 12 deletions dataset_api/eval_region.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,9 @@
"""

import itertools
import warnings

import numpy as np
import pandas as pd
import warnings
from skimage.measure import label, regionprops
from skimage.measure._regionprops import RegionProperties

Expand Down Expand Up @@ -170,21 +169,33 @@ def _precision_for_region_pred(info_pred_overlap: pd.DataFrame, iou_thresh: floa
:param iou_thresh:
:return:
"""
# if scale == 'all':
# pass
# elif scale == 'small':
# info_pred_overlap = info_pred_overlap[
# (info_pred_overlap['area_target'] <= SMALL_TH)
# | (info_pred_overlap['id_target'].isna() & (info_pred_overlap['area_pred'] <= SMALL_TH))]
# elif scale == 'medium':
# info_pred_overlap = info_pred_overlap[
# ((SMALL_TH < info_pred_overlap['area_target']) & (info_pred_overlap['area_target'] < MEDIUM_TH))
# | (info_pred_overlap['id_target'].isna()
# & ((SMALL_TH < info_pred_overlap['area_pred']) & (info_pred_overlap['area_pred'] < MEDIUM_TH)))]
# elif scale == 'large':
# info_pred_overlap = info_pred_overlap[
# (info_pred_overlap['area_target'] >= MEDIUM_TH)
# | (info_pred_overlap['id_target'].isna() & (info_pred_overlap['area_pred'] >= MEDIUM_TH))]
# else:
# raise NotImplementedError

# NEW: the size constrains only related to the ground-truth
if scale == 'all':
pass
elif scale == 'small':
info_pred_overlap = info_pred_overlap[
(info_pred_overlap['area_target'] <= SMALL_TH)
| (info_pred_overlap['id_target'].isna() & (info_pred_overlap['area_pred'] <= SMALL_TH))]
info_pred_overlap = info_pred_overlap[info_pred_overlap['area_target'] < SMALL_TH]
elif scale == 'medium':
info_pred_overlap = info_pred_overlap[
((SMALL_TH < info_pred_overlap['area_target']) & (info_pred_overlap['area_target'] < MEDIUM_TH))
| (info_pred_overlap['id_target'].isna()
& ((SMALL_TH < info_pred_overlap['area_pred']) & (info_pred_overlap['area_pred'] < MEDIUM_TH)))]
info_pred_overlap = info_pred_overlap[((SMALL_TH <= info_pred_overlap['area_target']) & (info_pred_overlap['area_target'] <= MEDIUM_TH))]
elif scale == 'large':
info_pred_overlap = info_pred_overlap[
(info_pred_overlap['area_target'] >= MEDIUM_TH)
| (info_pred_overlap['id_target'].isna() & (info_pred_overlap['area_pred'] >= MEDIUM_TH))]
info_pred_overlap = info_pred_overlap[info_pred_overlap['area_target'] > MEDIUM_TH]
else:
raise NotImplementedError

Expand Down
7 changes: 5 additions & 2 deletions dataset_api/eval_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@

from .eval_pixel import _compute_confusion_matrix, _f1_score, _acc, _fpr

MIN_AREA = 4
# the size constrain is according to pixel ratio
MIN_AREA_RATIO = 1. / 128.


def evaluation_sample(binary_pixel_pred, binary_pixel_target, info_region):
Expand All @@ -19,10 +20,12 @@ def evaluation_sample(binary_pixel_pred, binary_pixel_target, info_region):
info_overlap: pd.DataFrame = info_region["info_overlap"]

num_img = len(binary_pixel_target)
_, h, w = binary_pixel_target.squeeze().shape
MIN_AREA_TH = (np.float_(h) * MIN_AREA_RATIO) * (np.float_(w) * MIN_AREA_RATIO)

label_pred = np.zeros(num_img, dtype=np.bool)
if not info_pred.empty:
img_pred_ids = info_pred[info_pred['area_pred'] > MIN_AREA]['id_img'].unique()
img_pred_ids = info_pred[info_pred['area_pred'] > MIN_AREA_TH]['id_img'].unique()
label_pred[img_pred_ids] = 1

label_target = np.zeros(num_img, dtype=np.bool)
Expand Down
7 changes: 3 additions & 4 deletions dataset_api/zl_eval.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
@Author : Nico
"""
import json
import numpy as np
import warnings
from collections import OrderedDict

import numpy as np

from .eval_pixel import evaluation_pixel
from .eval_region import evaluation_region
from .eval_sample import evaluation_sample
Expand Down Expand Up @@ -56,12 +55,12 @@ def evaluate(self) -> dict:
diff_size=self.eval_diff_size, return_info=True)
sample_metrics = evaluation_sample(binary_pixel_pred=self.binary_pixel_pred,
binary_pixel_target=self.binary_pixel_target, info_region=info_region)
summary_score = 0.4 * pixel_metrics['Dice'] + 0.4 * region_metrics['F1'] + 0.2 * sample_metrics['F1']
summary_score = 0.4 * pixel_metrics['F1'] + 0.4 * region_metrics['F1'] + 0.2 * sample_metrics['F1']

self.metrics_dict = OrderedDict(
# Pix_Pre=pixel_metrics['Pre'],
# Pix_Rec=pixel_metrics['Rec'],
F1_Pix=pixel_metrics['Dice'],
F1_Pix=pixel_metrics['F1'],

# Reg_Pre=region_metrics['Pre'],
# Reg_Rec=region_metrics['Rec'],
Expand Down

0 comments on commit a2a2b4e

Please sign in to comment.