真阳性、假阳性、假阴性计算数据帧python

真阳性、假阳性、假阴性计算数据帧python,python,pandas,computer-vision,precision,object-detection,Python,Pandas,Computer Vision,Precision,Object Detection,我已经训练了一个目标探测网络。我有一个地面真相注释CSV格式, 文件名、高度、宽度、xmin、ymin、xmax、ymax、class。当我对输入图像评分时,我得到以下格式的输出CSV:filename、xmin、ymin、xmax、ymax、class、confidence 考虑到IoU,我需要合并这些数据帧。所以基本上输出数据帧应该包含 如果找到匹配项,则基础真相及其相应的预测以及IoU值 如果未找到匹配的IoU则为基本真值和Nan预测值 如果未找到匹配的IoU则为Nan地面真值和预测值 这

我已经训练了一个目标探测网络。我有一个地面真相注释CSV格式,
文件名、高度、宽度、xmin、ymin、xmax、ymax、class
。当我对输入图像评分时,我得到以下格式的输出CSV:
filename、xmin、ymin、xmax、ymax、class、confidence

考虑到
IoU
,我需要合并这些数据帧。所以基本上输出数据帧应该包含

  • 如果找到匹配项,则基础真相及其相应的预测以及
    IoU
  • 如果未找到匹配的
    IoU
    则为基本真值和Nan预测值
  • 如果未找到匹配的
    IoU
    则为Nan地面真值和预测值
  • 这将是计算精度和召回值的中间步骤

    我只是在这里添加了一个非常小的示例dataframe作为示例,用于测试这些条件

    样本预测:

            filename  xmin  ymin  xmax  ymax class  confidence
    0  dummyfile.jpg  4060  2060  4214  2242    DR    0.999985
    1  dummyfile.jpg  3599  1282  3732  1456    DR    0.999900
    
    地面真相样本:

            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
    
    预期最终产出:


    我添加了我目前的方法作为答案。有没有更好的方法来实现这一点?数据可能相当大。

    这是我发现的一种方法

  • 定义IoU功能:
  • 将熊猫作为pd导入
    将numpy作为np导入
    导入操作系统
    def IOU(df):
    ''计算数据帧行内IOU的功能''
    #确定相交矩形的最小和最大坐标
    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)
    #求交矩形的面积
    内部面积=max(0,xmax\u内部-xmin\u内部+1)*max(0,ymax\u内部-ymin\u内部+1)
    #计算实际和预测框的面积
    实际面积=(df.xmax-df.xmin+1)*(df.ymax-df.ymin+1)
    pred_面积=(df.xmax_pred-df.xmin_pred+1)*(df.ymax_pred-df.ymin_pred+1)
    #并上交的计算
    iou=内部面积/浮动(实际面积+预面积-内部面积)
    #返回与并集值的交点
    归还欠条
    
  • 解读地面真相与预测
  • ground\u truth=pd.read\u csv(“示例”\u gt.csv”)
    预测=pd.read\u csv('sample\u preds.csv')
    ###使用_pred后缀重命名预测df列
    pred_cols=prediction.columns.tolist()
    pred_cols.remove('文件名')
    新列=[col+“\u pred”代表pred列中的列]
    new_col_dict=dict(zip(pred_cols,new_cols))
    prediction.rename(列=new\u col\u dict,inplace=True)
    
  • 外接地面真理与预测
  • #####外部连接前提和基本事实df
    newdf=pd.merge(预测,基本事实,'outer',on='filename')
    ###应用iou计算
    newdf['iou']=newdf.apply(iou,axis=1)
    ###筛选所有iou=0
    newdf=newdf[newdf['iou']>0]
    

  • 从地面真实值和预测中获取不匹配值
  • final_df=pd.merge(prediction,newdf,on=prediction.columns.tolist(),how='left')
    final\u df=pd.merge(final\u df,ground\u truth,on=ground\u truth.columns.tolist(),how='outer')
    

    有更快的解决方案吗?