TPU-MLIR之精度验证

使用TPU-MLIR进行模型转换的时候我们会在各个阶段对比模型每一层输出的相似度,以确保模型转换的正确性,同时也能够在适配过程中更方便地定位问题来源。

但我们并不知道转换后的模型精度如何,特别是INT8量化后的模型输出,往往与原模型输出存在较大的区别(当然这个区别是在可接受的范围内的),光靠对比输出的相似度我们并不能看出INT8模型的表现究竟怎么样。所以,TPU-MLIR也提供了精度验证的接口,来检验转换后的模型表现。

在进行精度验证前,首先我们需要准备好用于验证的数据集,因为TPU-MLIR里没有自带完整的测试集,所以用于精度验证的数据集需要大家自行下载,对于分类网络主要使用的是IMAGENET2012的验证集,一共有5w张图片,而目标检测网络使用的是COCO2017的验证集,共5k张图。TPU-MLIR后续还会逐步支持更多类型,例如NLP领域的网络,未来也会开放。

另外,对于分类数据集的摆放方式,是将5w张图片分别放在1000个子目录中,对应imagenet里的1000个类别,每个类别下有50张属于该类别的图片,这类摆放方式自然就不再需要额外的标签文件;

对于COCO数据集的话相对比较简单,所有的图片都是放在一个目录下,每张图片的类别信息都会从对应的json文件中提取;

准备好数据集后,我们就可以直接使用model_eval这一接口对mlir模型进行精度验证,主要会用到这五个参数:

  • model_file与dataset参数用于提供模型与数据集路径

  • count用于明确我们要用来验证精度的图片数量,默认情况下是使用整个目录下的数据集

  • dataset_type则是根据验证的模型类型用于指定对应数据集的加载方式

  • postprocess_type则是用来明确输出的后处理方式,然后用相应的metrics来计算精度

那这里不需要提供预处理信息吗?

其实在mlir模型的input_op里就已经包含了对数据的预处理信息,主要包括mean, scale, resize的尺寸与resize时是否保持高宽比, 输入图片数据的pixel_format等,其中Mean和scale用于对输入的pixel value进行线性变换,与大家常用的mean与std相似,只不过它把normalize的部分融合进了mean与std中。

而对于模型的评估方式,分类网络我们主要使用的是Top1与Top5 accuracy,也就是看模型输出的概率中排序最高与前五的类别里是否包含了正确的类别,而目标检测网络我们使用的则是COCO官方的12个评估指标,从不同方面去验证mlir模型的精度。

先将模型输出的检测框经过non-maximum suppression剔除掉重叠与概率较低的候选框后再用剩下的计算与ground truth bounding box的IoU,然后根据不同指标的计算规则计算出相应的average precision与average recall。比如第一个指标是指从IoU=0.5到0.95每间隔0.05计算一次模型针对单个类别的precision, 然后取平均数,再将所有类别的precision累加起来取平均数,这其实就是mAP的其中一种计算方式,而其它两个指标只采用了单个IoU threshold来计算AP。

COCO数据集还会按照物体所占的像素数量来区分大中小物体,TPU-MLIR也会分别对这些不同尺寸物体的检测结果计算AP与AR来验证mlir模型在检测大中小物体上的精度

至于这个AR max=1,10和100指的是分别限制每张图片只有1,10和100个概率最高的检测结果,然后与第一个AP的计算方式相似,按照IoU threshold从0.5到0.95,每隔0.05计算一次单个类别的AR,先取AR在不同IoU下的平均值,再取AR在不同类别下的平均值。

TPU-MLIR目前在github上发布了一系列待解决的问题,非常欢迎对AI编译器感兴趣且想要在空闲时间丰富自己开源项目经历的朋友们来参与,与我们一起完善TPU-MLIR这个新一代的AI编译器。

可添加小编微信bai7426加入TPU-MLIR开发者社区。