Истинно положительный, ложноположительный, ложно отрицательный кадр данных расчета python - PullRequest
0 голосов
/ 12 июля 2020

Я обучил сеть обнаружения объектов. У меня есть аннотация CSV в формате filename, height, width, xmin, ymin, xmax, ymax, class. Когда я оцениваю входное изображение, я получаю выходной CSV в следующем формате: filename, xmin, ymin, xmax, ymax, class, confidence.

Мне нужно объединить эти кадры данных с учетом IoU. Итак, в основном выходной кадр данных должен содержать,

  1. Основную истину и соответствующий ей прогноз вместе с IoU значением, если найдено совпадение
  2. Значения основной истинности и значения Nan Prediction, если IoU совпадение не найдено
  3. Нано значений истинности и прогнозных значений, если IoU совпадение не было найдено.

Это будет промежуточный шаг для вычисления значений точности и повторения .

Я просто добавляю сюда в качестве примера очень маленькую выборку данных, которая проверяет эти условия. 1026 *

        filename  width  height class  xmin  xmax  ymin  ymax
0  dummyfile.jpg   7201    5400    DR  3598  3728  1279  1451
1  dummyfile.jpg   7201    5400    DR  3916  4038  2186  2274

Ожидаемый конечный результат:

окончательный результат

Я добавляю свой текущий подход в качестве ответа. Есть ли лучший способ добиться этого? Данные могут быть довольно большими.

1 Ответ

1 голос
/ 12 июля 2020

Это один из подходов, который я нашел,

  1. Определение функции IoU:
import pandas as pd
import numpy as np
import os

def IOU(df):
    '''funtion to calulcate IOU within rows of dataframe'''
    # determining the minimum and maximum -coordinates of the intersection rectangle
    xmin_inter = max(df.xmin, df.xmin_pred)
    ymin_inter = max(df.ymin, df.ymin_pred)
    xmax_inter = min(df.xmax, df.xmax_pred)
    ymax_inter = min(df.ymax, df.ymax_pred)

    # calculate area of intersection rectangle
    inter_area = max(0, xmax_inter - xmin_inter + 1) * max(0, ymax_inter - ymin_inter + 1)

    # calculate area of actual and predicted boxes
    actual_area = (df.xmax - df.xmin + 1) * (df.ymax - df.ymin + 1)
    pred_area = (df.xmax_pred - df.xmin_pred + 1) * (df.ymax_pred - df.ymin_pred+ 1)

    # computing intersection over union
    iou = inter_area / float(actual_area + pred_area - inter_area)

    # return the intersection over union value
    return iou
чтение достоверных данных и прогнозов CSV
ground_truth=pd.read_csv("sample_gt.csv")
prediction=pd.read_csv('sample_preds.csv')

###renaming prediction df columns with _pred suffix
pred_cols=prediction.columns.tolist()
pred_cols.remove('filename')
new_cols=[col+'_pred' for col in pred_cols ]
new_col_dict=dict(zip(pred_cols,new_cols))
prediction.rename(columns=new_col_dict,inplace=True)
Внешнее соединение наземной истины и предсказания
###outer joining the prediciton and ground truth df
newdf=pd.merge(prediction,ground_truth,'outer',on='filename')

###applying iou calculation
newdf['iou']= newdf.apply(IOU, axis = 1)
###filtering all iou=0
newdf=newdf[newdf['iou']>0]

IoU match

  1. получение несоответствующих значений из наземной истинности и предсказания.
final_df=pd.merge(prediction,newdf,on=prediction.columns.tolist(),how='left')
final_df=pd.merge(final_df,ground_truth,on=ground_truth.columns.tolist(),how='outer')

окончательный результат

...