TensorFlow Lite Android图像分类张量0-1转0-255像素范围方法问询
解决方案
你遇到的是TFLite图像预处理的数值范围适配问题,有两种可直接落地的修改方式:
方案1:移除归一化操作(优先选择,实现最简单)
你当前代码里的getPreprocessNormalizeOp()就是负责把原始0255像素归一化到01的算子,如果你训练的模型要求输入为原始0~255范围的数值,直接删除这行算子的添加逻辑即可:
/** Loads input image, and applys preprocessing. */ private TensorImage loadImage(final Bitmap bitmap, int sensorOrientation) { // Loads bitmap into a TensorImage. image.load(bitmap); // Creates processor for the TensorImage. int cropSize = Math.min(bitmap.getWidth(), bitmap.getHeight()); int numRoration = sensorOrientation / 90; ImageProcessor imageProcessor = new ImageProcessor.Builder() .add(new ResizeWithCropOrPadOp(cropSize, cropSize)) .add(new ResizeOp(imageSizeX, imageSizeY, ResizeMethod.BILINEAR)) .add(new Rot90Op(numRoration)) // 删掉原来的归一化算子,保留原始0~255像素值 .build(); return imageProcessor.process(image); }
注:这里同时修正了你原代码里的笔误,process的入参应该是你加载完bitmap的image对象,不是inputImageBuffer。
方案2:调整归一化参数实现数值乘以255
如果你需要保留原有归一化逻辑,只是要把01范围的数值放大到0255,可以通过修改NormalizeOp的参数实现:
TFLite Support库的NormalizeOp运算公式为 输出值 = (输入值 - 均值) / 标准差,要实现输入*255的效果,只需要设置均值为0,标准差为1/255f即可,修改getPreprocessNormalizeOp()的返回值:
private NormalizeOp getPreprocessNormalizeOp() { // 三通道RGB图配置,单通道图只需传单个0和1/255f即可 return new NormalizeOp(new float[]{0f, 0f, 0f}, new float[]{1/255f, 1/255f, 1/255f}); }
验证注意事项
修改完成后可以通过如下代码打印张量的数值范围,确认是否符合0~255的要求:
TensorImage output = loadImage(bitmap, sensorOrientation); float[] buffer = output.getTensorBuffer().getFloatArray(); float max = buffer[0], min = buffer[0]; for (float f : buffer) { max = Math.max(max, f); min = Math.min(min, f); } Log.d("PREPROCESS", "数值范围:" + min + " ~ " + max);
内容的提问来源于stack exchange,提问作者andreadaou
相关产品推荐
相关产品推荐

