You need to enable JavaScript to run this app.
导航

数据预处理

最近更新时间2022.02.25 17:16:51

首次发布时间2022.02.25 17:16:51

简介

在将原始图像输入到我们SDK之前,往往需要对图像进行各种预处理,如图像格式转换、图像尺寸压缩和图像角度旋转。

输入图的格式选择

对于图像检测算法类型的功能,如人像关键点、人体关键点、手势等,我们的接口支持的输入格式如下表所示:

格式
RGBA8888
BGRA8888
BGR888(人像 手势)
RGB888(人像 手势)
NV21
NV12
YUV420P

RGB类型的数据可以直接输入我们的SDK中,YUV数据可以通过我们的YUV2RGB转换接口完成转换。

对于图像特效类型的功能,如美颜、贴纸等,我们的接口支持的输入和输出格式如下表所示:

格式
glTexture2D
RGBA8888
BGRA8888(仅支持输入)
NV21
NV12
YUV420P

因为图像特效类算法主要在GPU中完成图像的处理和渲染过程,因此我们建议使用glTexture2D作为输入,从而减少数据在CPU内存和显存中进出导致的时间损耗,如果你们使用YUV格式的数据作为输入,我们在底层使用Shader对YUV格式的数据进行YUV to RGBA的格式转换,然后生成纹理再进行特效处理。这种情况下,你们也可以在外部先将YUV数据转成RGBA8888的格式,再输入到特效处理接口中。两种方案的差异在于,前者是在GPU中完成YUV到RGB格式的转换,后者在CPU中完成YUV到RGB的转换,具体方案选型依实际运行环境而定。

输入图的尺寸设置

因为输入图的尺寸影响算法的性能和效果,如果输入图片尺寸过大,算法的运行速度就会下降,但如果输入图片尺寸过小,又有可能导致预测结果的精确度下降,下表是我们针对不同算法模块给出的建议输入尺寸。
相机输出图像在保证人像为正的情况下,如果是一张竖向图片(宽 < 高),我们的建议输入的最小尺寸如下表:

算法宽(像素)高(像素)
人像106点128224
人像280点360640
人像属性360640
手势关键点及检测360640
骨骼检测128224
人体分割128224
头发分割128224
人像比对128224

相机输出图像在保证人像为正的情况下,如果是一张横图(高 < 宽),我们的建议的最小输入尺寸如下表:

算法宽(像素)高(像素)
人像106点224128
人像280点640360
人像属性640360
手势关键点及检测640360
骨骼检测224392
人体分割224128
头发分割224128
人像比对224128

以上尺寸是针对手机端的建议尺寸,如果是非手机设备,输入尺寸可能不同。

输入图的方向设置

我们所有的算法接口都需要输入检测角度,检测角度n表示将图像顺时针旋转n度后人脸为正。因为手机本身在空间中也有可能发生旋转,所以Demo中我们在纹理预处理阶段就将纹理转正,从而直接将手机传感器获取的角度作为检测角度。如果源图像中的人脸不是正方向,比如Android相机输出的YUV数据,需要在YUV旋转角的基础上叠加手机姿态的旋转角。

另外,我们SDK中提供了YUV格式数据和RGBA格式相互转换的接口,这个接口支持对YUV数据进行格式转换的同时,进行旋转、缩放和翻转(前置摄像头需要)操作。

一般,Android后置摄像头的输出需要顺时针旋转90度,前置摄像头需要顺时针旋转270度,为了保证视觉效果,我们一般会对前置输出一个左右镜像操作,来达到我们日常的照镜子效果。ios原生相机的输出是竖屏的,不需要旋转操作。

关于算法输入图像参数stride的解释

可理解为图像每一行占据的字节数。但约定输入接口不接受字节对齐的图像数据,故以RGBA数据为例: stride可默认为image_width*4