如何在滑动窗口对象检测中对真阴性进行分类? [关闭]
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
【讨论】:
以上是关于如何在滑动窗口对象检测中对真阴性进行分类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章