JPEGD+VPC+模型推理精度提升建议(Atlas 200/300/500 推理产品)
图片解码、图片抠图/缩放以及模型推理功能串联使用时,可能由于接口调用或配置导致推理精度存在偏差,本节基于该场景给出一些建议。
问题描述
JPEGD+VPC+模型推理串联使用,由于宽/高的对齐、输出图片格式等配置问题,可能会导致JPEGD与VPC之间、或VPC与模型推理之间的衔接存在偏差,进而影响整网的推理精度。
精度提升建议
关于JPEGD+VPC+模型推理多个功能串联使用时的一些问题及精度提升建议如下:
- JPEGD+VPC串联使用时:
由于JPEGD解码后的输出图片的宽stride*高stride有128*16对齐的约束,因此解码后的输出图片的宽、高有一些补边的无效数据,在调用VPC的缩放接口acldvppVpcResizeAsync时,需先调用acldvppSetPicDescWidth和acldvppSetPicDescHeight接口正确设置输入图片的原图宽高,VPC内部会根据原图宽高自行抠图,然后再执行缩放,实现去除无效数据对图像精度的影响。
为保证模型推理的精度,建议参见图1、图2中的正例来编写代码逻辑。
通过图1中的反例也可以看出,jpegd解码后,直接将对齐后的宽高作为原图宽高送入VPC,导致模型推理的输入图片存在无效数据,最终可能影响精度。
JPEGD和VPC的接口调用流程及详细介绍请分别参见JPEGD接口调用流程、VPC接口调用流程。
- 使用VPC时:
- VPC的抠图、缩放两个功能可以通过acldvppVpcCropAsync或acldvppVpcBatchCropAsync接口来完成,该接口的输出图片的宽stride、高stride必须满足16*2对齐,否则接口返回报错。
AscendCL当前提供了acldvppVpcCropAsync接口进行抠图、acldvppVpcResizeAsync接口进行缩放,抠图和缩放串联使用时,可以直接用acldvppVpcCropAsync接口,性能更优。
- VPC的抠图、缩放、贴图三个功能可以通过acldvppVpcCropAndPasteAsync或acldvppVpcBatchCropAndPasteAsync接口来完成,该接口的输出图片的宽stride、高stride必须满足16*2对齐,否则接口返回报错。
- VPC缩放+贴图串联使用时,如果缩放后的图片宽不是16对齐,在贴图时,vpc会增加无效数据(见图2中的反例),使其16对齐,为防止无效数据对后续的推理精度有影响,此处建议用户将宽*高按照16*2对齐的要求进行缩放,见图2中的正例。vpc缩放时,如果完全按vpc等比例缩放,应该输出238*416分辨率的图片,不满足16对齐,存在无效数据,为了使无效数据不影响精度,建议将图片缩放至240*416分辨率。
- VPC贴图时,贴图与输出图片的左边界距离必须满足16对齐,见图2中的正例。检测网络中、等比例缩放场景下,用户在实际使用时,如果贴图与输出图片的左边界距离d3满足16对齐后,可能导致贴图区域不在输出图片的中心位置,这时需注意,检测框与贴图区域左边界的距离d1=检测框与输出图片左边界的距离d2-d3。
例如,图2中,在最后的vpc贴图操作中,输出图片的分辨率为416*416,贴图区域的宽是240*416,贴图相对输出图片的左偏移=(416-240)/2=88,但88不是16对齐的,如果想继续贴图,得确保贴图相对输出图片的左偏移为16对齐,例如96。这时,计算检测框与贴图区域左边界的距离d1=d2-96,而不是d2-88。
- VPC的抠图、缩放两个功能可以通过acldvppVpcCropAsync或acldvppVpcBatchCropAsync接口来完成,该接口的输出图片的宽stride、高stride必须满足16*2对齐,否则接口返回报错。
- 模型推理时:
如果需要硬件AIPP进行色域转换,AIPP色域转换配置中的源图片格式要与VPC的输出图片格式保持一致,如果不一致,例如,VPC的输出格式是yuv420sp,色域转换的配置是yvu420sp(源图片格式)-->rgb888(目标图片格式),uv分量的顺序不同也会影响最后模型推理的精度。
模型推理的接口调用流程及详细介绍请参见模型推理。