MaskApi.m
用于操作以RLE格式存储的掩码的接口。
RLE是一种简单而有效的存储二进制掩码的格式。RLE首先将一个向量(或矢量化图像)划分为一系列分段的常量区域,然后对于每个片段只存储该片段的长度。例如,给定m=[0 0 1 1 1 0 1]RLE计数将是[2 3 1 1],或者对于m=[1 1 1 1 1 0]计数将是[0 6 1](请注意,奇数计数始终是零的数字)。与直接存储计数不同,附加压缩是通过基于一个名为leb128的通用方案的可变比特率表示来实现的。
对于较大的分段常量区域,压缩最大。
具体来说,rle的大小与m中的边界数成比例(或者对于图像,与y方向的边界数成比例)。假设形状相当简单,rle表示为o(sqrt(n)),其中n是对象中的像素数。因此,空间使用率大大降低,特别是对于大型简单对象(大N)。
许多常见的屏蔽操作可以直接使用RLE计算(不需要解码)。这包括计算,如面积、并集、交集等。所有这些操作在RLE的大小上都是线性的,换句话说,它们是O(sqrt(n)),其中n是对象的面积。在原始掩码上计算这些操作是O(n)。
因此,使用RLE可以节省大量的计算量。
analyze()
两个图都显示了来自Kaiming He等人的Resnet(BBOX)探测器的分析,他是2015年检测挑战的胜利者。第一个图显示人员类的resnet错误细分;第二个图是对所有类别的resnet平均值的总体分析。
每个图都是一系列PR曲线,当评估设置变得更为宽松时,每个pr曲线都保证严格高于前一个曲线.
-
c75:pr在iou=0.75(ap在特定的iou),曲线下面积对应于ap iou=0.75
-
c50:pR at iou=.50(ap at pascal iou),曲线下面积对应于ap iou=.50
-
loc:pr at iou=.10(忽略定位错误,但不重复检测)。所有剩余设置都使用IOU=0.1。
-
SIM:删除超级类别误报(fps)后的pr。具体来说,任何与具有不同类标签但属于同一超类别的对象的匹配都不算作fp(或tp)。通过将同一超类别中的所有对象设置为与所讨论的类具有相同的类标签,并将其忽略标志设置为1,可以计算出sim。请注意,Person是一个单例超类别,因此其SIM结果与loc相同。
-
Oth:清除所有类混乱后的pr。类似于sim,除非现在检测与任何其他对象匹配,否则它不再是fp(或tp)。通过将所有其他对象设置为与所讨论的类具有相同的类标签,并将其忽略标志设置为1,可以计算出OTH。
-
BG:移除所有背景(和类混淆)fps后的pr。对于单个类别,bg是一个阶跃函数,在达到最大回忆之前为1,然后降至0(在跨类别平均后曲线更平滑)。
-
fn:pr删除所有剩余错误后(非常重要的是ap=1)。
条曲线下的区域显示在图例中的括号中。在Resnet探测器的情况下,IOU=0.75的总AP为.399,完美的定位将使AP增加到.682。有趣的是,清除所有的类混乱(包括在超类别内和跨超类别)只会将AP稍微提高到.713。删除背景fp会将性能提升到.870 ap,其余的错误会丢失检测(尽管如果添加更多检测,这也会添加大量fps)。综上所述,resnet的错误主要是定位不完善和背景混乱。
对于给定的检测器,代码总共生成372个图!共有80个类别、12个超类别和1个总体结果,共有93个不同设置,分析按4个比例(全部、小、中、大,所以934=372个图)进行。文件命名为[SuperCategory]-[Category]-[Size].pdf,对于每个类别的804个结果,整体为-[SuperCategory]-[Size].pdf,对于每个超级类别的124个结果,整体为-[Size].pdf,对于14个整体结果。在所有的情节中,通常最感兴趣的是整体和超类别的结果。
数据格式
[{
"image_id" : int, "category_id" : int, "segmentation" : RLE, "score" : float,
}]
MaskApi.m mask.py.中用encode()转换为RLE格式。