如何在滑动窗口对象检测中对真阴性进行分类? [关闭]

Posted

技术标签:

【中文标题】如何在滑动窗口对象检测中对真阴性进行分类? [关闭]【英文标题】:How to categorize True Negatives in sliding window object detection? [closed] 【发布时间】:2013-04-22 16:53:03 【问题描述】:

我正在收集图像检测器算法的结果。所以基本上我所做的是,从一组图像(大小为 320 x 480)中,我会通过它运行一个 64x128 的滑动窗口,并在一些预定义的比例下运行。

我明白:

True Positives = 当我检测到的窗口与真实情况(带注释的边界框)重叠(在定义的交点大小/质心内)时 误报 = 当算法给我正窗口时,这超出了事实。 False Negatives = 当我未能给出肯定窗口时,而基本事实注释表明存在对象。

但是真正的否定呢?这些真正的否定是我的分类器给我否定结果的所有窗口吗?这听起来很奇怪,因为我一次将一个小窗口 (64x128) 滑动 4 个像素,并且我在检测中使用了大约 8 种不同的比例。如果我这样做,那么每张图片都会有很多真正的底片。

或者我是否准备了一组纯负图像(根本没有物体/人),我只是滑过,如果每张图像中都有一个或多个正检测,我会将其计为假负,反之亦然?

这是一个示例图像(绿色矩形作为基本事实)

【问题讨论】:

对象检测使用术语 TP、FP 和未命中率。底片用的不多。 我投票结束这个问题,因为它不是关于 help center 中定义的编程,而是关于 ML 理论和方法。 【参考方案1】:

我一直看到以下四个术语:

假阴性;结果应该是肯定的,但结果是否定的。 假阳性;结果应该是负面的,但结果是正面的。 真阳性;结果应该是肯定的并且是肯定的。 真阴性;结果应该是否定的并且是否定的。

在您的情况下,如果我理解正确,您正在尝试检测图像中是否有物体。因此,假阴性意味着有一个对象(结果应该是肯定的)但算法没有检测到它(因此返回否定)。真正的否定只是算法正确地说明它检查的区域确实包含一个对象。

您可以选择忽略负值,但这些可用于进一步训练您的算法(例如,使用同时查找两者的算法,而不是将所有无法识别的值设置为 false)。

【讨论】:

请指正,在这个框架中,FP = 2,TP = 3,FN =1,TN = 0?是这样计算的吗? 我不太明白你给术语分配数字是什么意思。 你让我很困惑,如果我不指定,我如何计算 FPR 或 TPR 来绘制 roc 曲线?我不知道我的计算是否正确。如果您知道任何方法,请分享。【参考方案2】:

here 有一个很好的解释。 F1 分数在 wiki 和 here 中解释有助于衡量成功。

我正在尝试编写一个计算 F1 分数的函数:

    /// <param name="realClasses">Class names that exists on the image. A class name may exists more than once.</param>
    /// <param name="foundClasses">Predicted class names. A class name may exists more than once.</param>
    private static void findPosNeg(List<string> realClasses, List<string> foundClasses, out int truePositive, out int falsePositive, out int falseNegative)
                
        Dictionary<string, int> dicReal = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase);
        Dictionary<string, int> dicFound = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase);
        #region fill dictionaries
        foreach (string className in realClasses)
        
            if (!dicReal.ContainsKey(className))
                dicReal[className] = 1;
            else
                dicReal[className]++;
        
        foreach (string className in foundClasses)
        
            if (!dicFound.ContainsKey(className))
                dicFound[className] = 1;
            else
                dicFound[className]++;
        
        #endregion

        truePositive = 0;
        falsePositive = 0;
        falseNegative = 0;
        foreach (string className in dicFound.Keys)
        
            if (!dicReal.ContainsKey(className))
                falsePositive += dicFound[className];
            else
            
                int found = dicFound[className];
                int real = dicReal[className];
                truePositive += Math.Min(found, real);
                if (real > found)
                    falseNegative += real - found;
                else if (found > real)
                    falsePositive += found - real;
            
        
        foreach (string className in dicReal.Keys)
            if (!dicFound.ContainsKey(className))
                falseNegative += dicReal[className];

    
    /// <summary>
    /// Calculates F1Score ref:https://en.wikipedia.org/wiki/Precision_and_recall
    /// </summary>
    private static double calc_F1Score(int truePositive, int falsePositive, int falseNegative, out double precision, out double recall)
    
        precision = (double)truePositive / ((double)truePositive + (double)falsePositive);
        recall = (double)truePositive / ((double)truePositive + (double)falseNegative);
        double div = (precision + recall);
        return (div != 0d) ? 2d * precision * recall / div : 0d;
    

【讨论】:

【参考方案3】:

AFAIK,True Negative 是指图像中存在对象但未在地面实况注释或模型预测中标记的场景。

通常 2D 对象检测系统仅使用两个数据,即地面实况注释和模型预测。然而,为了找到真正的负例,我们需要寻找地面实况注释的超集,其中包含有关图像中存在的所有类实例的信息(不仅仅是那些特定于我们模型的实例)。

例如取给定的图像;如果我们有兴趣为自动驾驶目的进行对象检测,我们可以考虑以下两个基本事实注释:

超级集 GT 注释

汽车(车辆) 人 树 动物 house_window 汉堡(可能扔在路上)

自动驾驶 GT 注释

汽车(车辆) 人 树 动物

使用上述两个基本事实注释,可以计算汉堡和窗口的真负数。但是,我怀疑是否可以在没有超集注释的情况下计算 True Negatives。

【讨论】:

【参考方案4】:

所有可能的不是 fn、fp 或 tp 的矩形都是 tn。

因此,真阴性 (tn) 的数量是巨大的,但也是详尽无遗的。

上下文:通常,在对象检测中,所有包含 tn 的指标都会被忽略,因为会有很多 tn,这使得指标难以使用。

【讨论】:

【参考方案5】:

True Negatives :这是一种背景预测,ground truth 没有这些位置的框,也不存在于预测中。

False Negatives:Ground Truth 有它们的框,但预测在该位置不包含任何框。

【讨论】:

【参考方案6】:

通常,在对象检测任务中,我们不寻找真阴性 (TN) 情况,因为算法告诉我们,我们喜欢检测对象(不是非对象候选者);相反,在分类任务中,我们的目标是决定每个实例被认为是消极的还是积极的。因此,我们自然会在分类任务中出现真阴性 (TN) 案例。 此外,对于目标检测任务,还有更好、更兼容的措施。您可以参考平均平均精度(mAP)来评估您的对象检测算法。 请注意,mAP 与简单的精度平均不同。您可以在以下位置找到有关此主题的更多信息: https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173

【讨论】:

以上是关于如何在滑动窗口对象检测中对真阴性进行分类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

“智能”滑动滑动窗口? [关闭]

如何在 Opencv 中对数据进行分类 [关闭]

在 Matlab 中对滑动窗口应用操作

目标检测算法盘点

学会注意错误

第二十六节,滑动窗口和 Bounding Box 预测