Пересечение над Союзом на двух участках - PullRequest
1 голос
/ 18 июня 2020

Допустим, у меня есть два Dataframe: Groundtruth и Prediction .

Каждый Dataframe имеет 3 столбца; Action, Start и End .

**Prediction :**

Action  |   Start   | End
-------------------------
 3      |   0       | 10
 2      |   10      | 70
 3      |   80      | 120
 0      |  120      | 350
 7      |  400      | 610
...

**Groundtruth :**

Action  |   Start   | End
-------------------------
 2      |   20      | 140
 0      |  150      | 340
 6      |  420      | 600
...

Я хочу вычислить Intersection-over-Union (IoU) по этим двум фреймам данных, используя все столбцы, то есть действие сначала, чтобы увидеть, правильный ли прогноз или нет, плюс начальный и конечный сегменты для каждого действия, чтобы увидеть, правильно ли начинается и заканчивается.

Вот мой код:

def compute_iou(y_pred, y_true):
    y_pred = y_pred.flatten()
    y_true = y_true.flatten()
    cm = confusion_matrix(y_true, y_pred)
    intersection = np.diag(cm)
    ground_truth_set = cm.sum(axis=1)
    predicted_set = cm.sum(axis=0)
    union = ground_truth_set + predicted_set - intersection
    IoU = intersection / union
    for i in range(len(IoU)):
        if (IoU[i]>0.5):
            IoU[i] = 1
    return round(np.mean(IoU)*100, 3)

Это работает, когда Я хочу рассчитать IoU по столбцу действий.

Теперь, как я могу это адаптировать, чтобы я мог получить IoU для получения перекрывающихся сегментов по начальному и конечному столбцам?

PS : Фреймы данных Groundtruth и Prediction не имеют одинакового количества строк.

1 Ответ

1 голос
/ 18 июня 2020

(редактирование сообщения)

Расчет разбит на три случая:

  • Перекрытие: где активность совпадает, и есть перекрытие между наземным интервалом истинности и интервалом прогнозирования .
  • Нет совпадений: действия совпадают, но такого совпадения нет.
  • Нет совпадений: активность не была спрогнозирована, либо активность неверна.

Вот код:

df = pd.merge(pred, groundtruth, on = "Action", how = "outer",  suffixes = ["_pred", "_gt"])

overlap = df[(df.Start_pred < df.End_gt) & (df.Start_gt < df.End_pred)]

intersection = (overlap[["End_pred", "End_gt"]].min(axis=1) - overlap[["Start_pred", "Start_gt"]].max(axis=1)).sum()

union_where_overlap = (overlap[["End_pred", "End_gt"]].max(axis=1) - overlap[["Start_pred", "Start_gt"]].\
                    min(axis=1)).sum()

no_hit = df[df.isna().sum(axis=1) > 0]
union_no_hit = (no_hit[["End_pred", "End_gt"]].max(axis=1) - no_hit[["Start_pred", "Start_gt"]].min(axis=1)).sum()

no_overlap = df[~((df.Start_pred < df.End_gt) & (df.Start_gt < df.End_pred))].dropna()
union_no_overlap = ((no_overlap.End_pred - no_overlap.Start_pred) + (no_overlap.End_gt - no_overlap.Start_gt)).sum()

IoU = intersection / (union_no_hit + union_where_overlap + union_no_overlap)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...