测试机器学习模型不用写代码,最完整的检测模型评估指标mAP计算指南

原标题:测试机器学习模型不用写代码!谷歌“what-if”工具轻松搞定

原标题:无需写代码!谷歌推出机器学习模型分析神器,代号What-If

对于使用机器学习解决的大多数常见问题,通常有多种可用的模型。每个模型都有自己的独特之处,并随因素变化而表现不同每个模型在“验证/测试”数据集上来评估性能,性能衡量使用各种统计量如准确度精度(precision),召回率等。选择的统计量通常针对特定应用场景和用例。
对于每个应用场景,选择一个能够客观比较模型的度量指标非常重要。

图片 1

铜灵 编译整理

这篇文章将介绍目标检测(Object Detection)问题中的最常用评估指标-Mean
Average Precision
,即mAP。

倒计时**8**天

今天,谷歌推出了已开源的TensorFlow可视化工具TensorBoard中一项新功能:What-If
Tool,用户可在不编写程序代码的情况下分析机器学习(ML)模型。

大多数时候,这些指标很容易理解和计算。例如,在二元分类中,精确度和召回率是一个一个简单直观的统计量。然而,目标检测是一个非常不同且有趣的问题。即使你的目标检测器在图片中检测到猫,但如果你无法定位,它也没有用处。由于你要预测的是图像中各个物体是否出现及其位置,如何计算mAP将非常有趣。

新智元将于9月20日在北京国家会议中心举办AI WORLD
2018世界人工智能峰会,MIT物理教授、未来生命研究所创始人、《生命3.0》作者Max
Tegmark,将发表演讲《我们如何利用AI,而不是被其压制》
,探讨如何直面AI军事化和杀人武器的出现,欢迎到现场交流!

不用写代码?

在讲解mAP之前,我们先定义目标检测问题。

没错,只需为TensorFlow模型和数据集提供指针,What-If
Tool就能给出一个可用来探索模型结果的可交互的视觉界面。

在目标检测问题中,给定一个图像,找到它所包含的物体,找到它们的位置并对它们进行分类。目标检测模型通常是在一组特定的类集合上进行训练的,所以模型只会定位和分类图像中的那些类。另外,对象的位置通常采用矩形边界框表示。因此,目标检测涉及图像中物体的定位和分类。

来源:Google AI

图片 2

图片 3image

编辑:大明

250张人脸和在模型中检测微笑后的结果

下面所述的Mean Average Precision特别适用于同时预测物体位置及类别的算法。
因此,从图1可以看出,它对评估定位模型、目标检测模型和分割模型非常有用。

【新智元导读】Google AI推出“what-if
”工具,用户完全不需要编写代码就能分析机器学习模型。该工具提供交互式可视化界面,用户可以探索并比较模型结果,可以快速地发现模型中的错误。

What-If
Tool里功能很多,包括自动用Facets将数据集可视化,也有从数据集中手动编辑示例并查看更改效果的功能,还能自动生成部分关系图,显示模型预测随着单个特征的改变而改变的趋势。

1. 为什么是mAP?

构建高效的机器学习系统,需要提出并解决许多问题。仅仅训练模型然后就放着不管是远远不够的。优秀的机器学习从业者要像侦探一样,时刻注意探索如何更好地理解构建的模型:数据点的变化将对模型的预测结果造成什么影响?同一个模型对不同的群体会有哪些不同的表现?用来测试模型的数据集的多样化程度如何等等。

不过,这还不是What-If Tool的全部实力。

目标检测问题中的每个图片都可能包含一些不同类别的物体。如前所述,需要评估模型的物体分类和定位性能。因此,用于图像分类问题的标准指标precision不能直接应用于此。
这就是为什么需要mAP。 我希望读完这篇文章后,你将能够理解它的含义。

要回答这些问题并不容易。要回答这些“假设”问题,通常要编写自定义的一次性代码来分析特定模型。这个过程不仅效率低下,而且除了程序员,其他人很难参与改进机器学习模型的过程。

7大功能

2. 关于Ground Truth

Google AI
PAIR计划的一个重点就是让更广泛的人群能够更方便地对机器学习系统进行检查、评估和调试。

What-If Tool主要有七大功能,不知道有没有你需要的那一款:

对于任何算法,评估指标需要知道ground truth数据。
我们只知道训练、验证和测试数据集的ground truth。对于目标检测问题,ground
truth包括图像中物体的类别以及该图像中每个物体的真实边界框。

今天,我们正式发布What-If工具,该工具是开源的TensorBoard
Web应用程序的一项新功能,它允许用户在不编写代码的情况下分析机器学习模型。
What-If工具给出了TensorFlow模型和数据集的指针,提供了一个交互式可视化界面,用于探索模型结果。

功能一:可视化推断结果

图片 4image

图片 5

根据推断结果的不同,你的示例会被分成不同的颜色,之后可用混淆矩阵和其他自定义形式进行处理,从不同特征的角度显示推断结果。

这里给出了一个实际图片(jpg、png等格式),以及相应的文本注释(边界框坐标(x,
y, w, h)和类别),如图中红色框以及文本标签所示。

What-If工具显示一组250张面部图片及其检测微笑模型的结果

图片 6

对于这个特殊例子,模型在训练时需要原始的图片:

What-If工具功能强大,可以使用Facets自动显示数据集,从数据集手动编辑示例并查看更改的效果,还能自动生成部分依赖图(partial
dependence
plots),显示模型的预测结果随任何单个功能的更改而变化的情况。

功能二:编辑一个数据点,看模型表现如何

图片 7image

图片 8

你可以编辑、添加或删除任何选定数据点的特性或特性值,然后运行推断来测试模型性能,也可上传全新示例。

以及ground
truth的3个坐标及类别(这里假定图片大小是1000x800px,所有的坐标值都是以像素为单位的近似值):

探索数据点上的What-if情景

图片 9

图片 10image

下面详细介绍What-If工具的两个功能。

功能三:发掘单个特征的效果

下面让我们动一下手,去看如何计算mAP。这里我们不谈论不同的目标检测算法,假定我们已经有了一个训练好的模型,现在只需要在验证集上评估其性能。

只需一键,自动对比数据点与模型预测最相似点

可以用来探索为选中数据点中的单个特征自动生成的图,显示特征有效值不同时推断结果的变化。

03

用户只需单击一个按钮,就可以将数据点与模型预测不同结果的最相似点进行比较。我们称这些点为“Counterfactuals”,可以显示出预测模型的决策边界。用户也可以手动编辑数据点,并探索模型预测的变化。

图片 11

前面展示了原始图像和以及对应的ground
truth。训练集和验证集中所有图像都以此方式标注。

在下面的截图中,该工具用于二进制分类模型,该模型根据美国人口普查数据集的公共人口普查数据,预测一个人的年收入是否超过5万美元。这是机器学习研究人员使用的基准预测任务,尤其是在分析算法的公平性时。

功能四:探索反事实示例

训练好的目标检测模型会给出大量的预测结果,但是其中大多数的预测值都会有非常低的置信度(confidence
score),因此我们只考虑那些置信度高于某个阈值的预测结果。

在这种情况下,对于选定的数据点,模型预测该人年收入超过5万美元的信度为73%。该工具自动定位数据集中最相似的人,模型预测其年收入低于5万美元,然后将选定数据点和与之最相似、但预测结果相反的数据点进行并排比较。如下图所示,二者只有在年龄和职业上存在微小的差异,但模型的预测结果已经完全相反了。

轻轻一点,你就能比较数据点与模型预测出不同结果的最相似点。我们将这些点称为“反事实”(Counterfactuals),可以反映出模型的决策边界。

将原始图片送入训练好的模型,在经过置信度阈值筛选之后,目标检测算法给出带有边界框的预测结果:

图片 12

图片 13

图片 14image

对Counterfactuals的比较。二人只有在年龄和职业上存在微小的差异,但模型的预测结果已经完全相反

功能五:按相似度排列示例

现在,由于我们人类是目标检测专家,我们可以知道这些检测结果大致正确。但我们如何量化呢?我们首先需要判断每个检测的正确性。这里采用IoU(Intersection
over Union),它可以作为评价边界框正确性的度量指标。
这是一个非常简单的指标。从名称看,有些人会发现这个名字是自解释的,但我们需要更好的解释。这里会以简短的方式解释IoU,如果想深入理解,可以参考Adrian
Rosebrock的这篇文章(Intersection over Union for object detection)。

模型性能和算法公平性分析

用L1或L2距离从选定的数据点创建距离特性,并将其可视化进行进一步分析。

1. IoU

用户还可以探索不同分类阈值的影响,同时考虑不同数值公平性标准等约束条件。下图所示为微笑探测器模型的结果,该模型在开源CelebA数据集上训练,数据集是已标记的名人面部图像。

图片 15

IoU是预测框与ground
truth的交集和并集的比值。这个量也被称为Jaccard指数,并于20世纪初由Paul
Jaccard首次提出。为了得到交集和并集,我们首先将预测框与ground
truth放在一起,如图所示。

下图所示数据集中的面部图像按照头发是否为棕色分开,两个图像中的每一组都建立一条ROC曲线和一个预测结果的混淆矩阵,再设置一个置信度滑块,设定模型必须在超过某一置信度时才能判定目标的面部是微笑的。本例中,What-If工具自动设置两组的置信度阈值,以优化模型,实现机会均等。

功能六:查看混淆矩阵和ROC曲线

图片 16image

图片 17

对于包含描述真实标签特性的二分类模型和示例,使用阈值、ROC曲线、数值混淆矩阵和成本比交互式地探索模型性能。

对于每个类,预测框和ground
truth重叠的区域是交集,而横跨的总区域就是并集。其中horse类的交集和并集如下图所示(这个例子交集比较大):

使用What-if工具对微笑检测模型两部分数据的预测表现的比较,其中预测模型分类阈值设置满足“机会公平”

图片 18

图片 19image

检测错误分类、评估模型公平性、调查模型不同数据集

功能七:测试算法公平性限制

其中蓝绿色部分是交集,而并集还包括橘色的部分。那么,IoU可以如下计算:

为了说明What-if工具的功能,我们使用预先训练的模型发布了一组Demo:

对于二分类模型来说,这个工具可以将你的数据集分成子数据集,继而探索不同算法公平性约束(fairness
constraints)的影响。

图片 20image

检测错误分类:多类分类模型,模型根据对植物的花的四次观测来预测植物的种类。What-if工具有助于显示模型的决策边界,弄清导致错误分类的原因。

图片 21

2. 鉴别正确的检测结果并计算precision和recall

评估二元分类模型的公平性:上面提到的用于微笑表情检测的图像分类模型。What-if工具有助于评估不同子图像组的算法公平性。在该模型的训练中,有意没有提供来自特定人群的示例,目的是为了显现What-if工具如何能够揭示模型中的这种偏差。对模型预测公平性的评估需要仔细考虑整体背景,不过What-if工具是一个有用的量化起点。

传送门

为了计算precision和recall,与所有机器学习问题一样,我们必须鉴别出True
Positives、False Positives、True Negatives和 False Negatives。

调查模型在不同子群体中的表现:回归模型可以用于根据人口普查信息预测受试者的年龄。What-if工具能显示出模型在不同子群体中的相对表现,以及不同特征如何单独影响预测结果。该模型使用美国人口普查数据集进行训练。

在谷歌官方博客上,研究人员还发布了用预训练模型进行的一组演示,比如检测错误分类的原因,评估二元分类模型的公平性和调查不同子数据集中模型的表现等。可以移步官方博客查看更多,博客地址:

为了获得True Positives and False
Positives,我们需要使用IoU。计算IoU,我们从而确定一个检测结果是正确的还是错误的。最常用的阈值是0.5,即如果IoU>
0.5,则认为它是True Positive,否则认为是False
Positive。而COCO数据集的评估指标建议对不同的IoU阈值进行计算,但为简单起见,我们这里仅讨论一个阈值0.5,这是PASCAL
VOC数据集所用的指标。

What-If工具的实地应用

为了计算Recall,我们需要Negatives的数量。由于图片中我们没有预测到物体的每个部分都被视为Negative,因此计算True
Negatives比较难办。但是我们可以只计算False
Negatives,即我们模型所漏检的物体。

我们将What-If工具在Google内部团队中进行了测试,该工具在测试中显现出了直接价值。有团队很快发现他们的模型错误地忽略了数据集的整个特征,修复了以前未发现的代码错误。
还有团队使用该工具将模型示例按性能高到低排列出来,并发现表现不佳的模型示例的运行模式。

What-If Tool介绍主页:

另外一个需要考虑的因素是模型所给出的各个检测结果的置信度。通过改变置信度阈值,我们可以改变一个预测框是Positive还是
Negative,即改变预测值的正负性。基本上,阈值以上的所有预测(Box +
Class)都被认为是Positives,并且低于该值的都是Negatives。

我们期待Google内外的人们都来使用What-If工具,以更好地理解机器学习模型,并开始评估预测模型的公平性。
我们的代码是开源的,欢迎对该工具继续添砖加瓦。

对于每一个图片,ground
truth数据会给出该图片中各个类别的实际物体数量。我们可以计算每个Positive预测框与ground
truth的IoU值,并取最大的IoU值,认为该预测框检测到了那个IoU最大的ground
truth。然后根据IoU阈值,我们可以计算出一张图片中各个类别的正确检测值(True
Positives, TP)数量以及错误检测值数量(False Positives,
FP)。据此,可以计算出各个类别的precision:

Github:

—返回搜狐,查看更多

图片 22image

责任编辑:

既然我们已经得到了正确的预测值数量(True
Positives),也很容易计算出漏检的物体数(False Negatives,
FN)。据此可以计算出Recall(其实分母可以用ground truth总数):

图片 23image

倒计时 8

3. 计算mAP

mAP这个术语有不同的定义。此度量指标通常用于信息检索和目标检测领域。然而这两个领域计算mAP的方式却不相同。这里我们只谈论目标检测中的mAP计算方法。

返回搜狐,查看更多

在目标检测中,mAP的定义首先出现在PASCAL Visual Objects
Classes竞赛中,这个大赛包含许多图像处理任务,详情可以参考这个

前面我们已经讲述了如何计算Precision和Recall,但是,正如前面所述,至少有两个变量会影响Precision和Recall,即IoU和置信度阈值。IoU是一个简单的几何度量,可以很容易标准化,比如在PASCAL
VOC竞赛中采用的IoU阈值为0.5,而COCO竞赛中在计算mAP较复杂,其计算了一系列IoU阈值(0.05至0.95)下的mAP。但是置信度却在不同模型会差异较大,可能在我的模型中置信度采用0.5却等价于在其它模型中采用0.8置信度,这会导致precision-recall曲线变化。为此,PASCAL
VOC组织者想到了一种方法来解决这个问题,即要采用一种可以用于任何模型的评估指标。在paper中,他们推荐使用如下方式计算Average
Precision:

责任编辑:

For a given task and class, the precision/recall curve is computed
from a method’s ranked output. Recall is defined as the proportion of
all positive examples ranked above a given rank. Precision is the
proportion of all examples above that rank which are from the positive
class. The AP summarises the shape of the precision/recall curve, and
is defined as the mean precision at a set of eleven equally spaced
recall levels [0,0.1,…,1]:

可以看到,为了得到precision-recall曲线,首先要对模型预测结果进行排序(ranked
output,按照各个预测值置信度降序排列)。那么给定一个rank,Recall和Precision仅在高于该rank值的预测结果中计算,改变rank值会改变recall值。这里共选择11个不同的recall([0,
0.1, …, 0.9,
1.0]),可以认为是选择了11个rank,由于按照置信度排序,所以实际上等于选择了11个不同的置信度阈值。那么,AP就定义为在这11个recall下precision的平均值,其可以表征整个precision-recall曲线。

图片 24image

另外,在计算precision时采用一种插值方法(interpolate):

The precision at each recall level r is interpolated by taking the
maximum precision measured for a method for which the corresponding
recall exceeds r:The intention in interpolating the precision/recall
curve in this way is to reduce the impact of the “wiggles” in the
precision/recall curve, caused by small variations in the ranking of
examples.

及对于某个recall值r,precision值取所有recall>r中的最大值(这样保证了p-r曲线是单调递减的,避免曲线出现摇摆):

图片 25image

不过这里VOC数据集在2007年提出的mAP计算方法,而在2010之后却使用了所有数据点,而不是仅使用11个recall值来计算AP(详细参考这篇

Up until 2009 interpolated average precision (Salton and Mcgill 1986)
was used to evaluate both classification and detection. However, from
2010 onwards the method of computing AP changed to use all data points
rather than TREC-style sampling (which only sampled the monotonically
decreasing curve at a fixed set of uniformly-spaced recall values 0,
0.1, 0.2,…, 1). The intention in interpolating the precision–recall
curve was to reduce the impact of the ‘wiggles’ in the
precision–recall curve, caused by small variations in the ranking of
examples. However, the downside of this interpolation was that the
evaluation was too crude to discriminate between the methods at low
AP.

对于各个类别,分别按照上述方式计算AP,取所有类别的AP平均值就是mAP。这就是在目标检测问题中mAP的计算方法。可能有时会发生些许变化,如COCO数据集采用的计算方式更严格,其计算了不同IoU阈值和物体大小下的AP(详情参考

当比较mAP值,记住以下要点:

  • mAP通常是在一个数据集上计算得到的。

  • 虽然解释模型输出的绝对量化并不容易,但mAP作为一个相对较好的度量指标可以帮助我们。
    当我们在流行的公共数据集上计算这个度量时,该度量可以很容易地用来比较目标检测问题的新旧方法。

  • 根据训练数据中各个类的分布情况,mAP值可能在某些类(具有良好的训练数据)非常高,而其他类(具有较少/不良数据)却比较低。所以你的mAP可能是中等的,但是你的模型可能对某些类非常好,对某些类非常不好。因此,建议在分析模型结果时查看各个类的AP值。这些值也许暗示你需要添加更多的训练样本。

04

代码实现

Facebook开源的Detectron包含VOC数据集的mAP计算(

# 按照置信度降序排序sorted_ind = np.argsort(-confidence)BB = BB[sorted_ind, :] # 预测框坐标image_ids = [image_ids[x] for x in sorted_ind] # 各个预测框的对应图片id# 便利预测框,并统计TPs和FPsnd = len(image_ids)tp = np.zerosfp = np.zerosfor d in range: R = class_recs[image_ids[d]] bb = BB[d, :].astype ovmax = -np.inf BBGT = R['bbox'].astype # ground truth if BBGT.size > 0: # 计算IoU # intersection ixmin = np.maximum(BBGT[:, 0], bb[0]) iymin = np.maximum(BBGT[:, 1], bb[1]) ixmax = np.minimum(BBGT[:, 2], bb[2]) iymax = np.minimum(BBGT[:, 3], bb[3]) iw = np.maximum(ixmax - ixmin + 1., 0.) ih = np.maximum(iymax - iymin + 1., 0.) inters = iw * ih # union uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) + (BBGT[:, 2] - BBGT[:, 0] + 1.) * (BBGT[:, 3] - BBGT[:, 1] + 1.) - inters) overlaps = inters / uni ovmax = np.max jmax = np.argmax # 取最大的IoU if ovmax > ovthresh: # 是否大于阈值 if not R['difficult'][jmax]: # 非difficult物体 if not R['det'][jmax]: # 未被检测 tp[d] = 1. R['det'][jmax] = 1 # 标记已被检测 else: fp[d] = 1. else: fp[d] = 1.# 计算precision recallfp = np.cumsumtp = np.cumsumrec = tp / float# avoid divide by zero in case the first detection matches a difficult# ground truthprec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)

这里最终得到一系列的precision和recall值,并且这些值是按照置信度降低排列统计的,可以认为是取不同的置信度阈值得到的。然后据此可以计算AP:

def voc_ap(rec, prec, use_07_metric=False): """Compute VOC AP given precision and recall. If use_07_metric is true, uses the VOC 07 11-point method (default:False). """ if use_07_metric: # 使用07年方法 # 11 个点 ap = 0. for t in np.arange(0., 1.1, 0.1): if np.sum(rec >= t) == 0: p = 0 else: p = np.max(prec[rec >= t]) # 插值 ap = ap + p / 11. else: # 新方式,计算所有点 # correct AP calculation # first append sentinel values at the end mrec = np.concatenate(([0.], rec, [1.])) mpre = np.concatenate(([0.], prec, [0.])) # compute the precision 曲线值 for i in range(mpre.size - 1, 0, -1): mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i]) # to calculate area under PR curve, look for points # where X axis  changes value i = np.where(mrec[1:] != mrec[:-1])[0] # and sum (\Delta recall) * prec ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1]) return ap

计算各个类别的AP值后,取平均值就可以得到最终的mAP值了。但是对于COCO数据集相对比较复杂,不过其提供了计算的API,感兴趣可以看一下

个人技术博客:
加个人微信拉你进机器学习、深度学习交流群,请备注 :
来自简书QQ交流群:651616387 请备注 :
来自简书微信公众号:机器学习算法工程师 —-二维码见下图

扫码关注微信号:机器学习算法工程师,更多干货分享,
或加个人微信,拉你进机器学习、深度学习交流群

图片 26image