4通道位图的字节顺序输入到Tensorflow冻结模型中

时间:2018-06-30 04:06:59

标签: java android python opencv tensorflow

我正在尝试将Android位图转换为与python中的Tensorflow模型相同的格式。

这是最初在TensorFlowObjectDetectionAPIModel中完成的方式:

 bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());


    for (int i = 0; i < intValues.length; ++i) {
      byteValues[i * 3 + 2] = (byte) (intValues[i] & 0xFF);
      byteValues[i * 3 + 1] = (byte) ((intValues[i] >> 8) & 0xFF);
      byteValues[i * 3] = (byte) ((intValues[i] >> 16) & 0xFF);
    }

对于4通道(RGBD)位图,这样做有一些问题。据我了解,Bitmap.setPreMultiplied必须设置为false才能使位图不将第四个通道视为Alpha信息,将其乘以其他三个通道。

这就是我认为解决方案直观的方式(假设Bitmap.setPreMultiplied(false)

    bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

//grabbing the 4 channels into 4 consecutive values of  byteValues
for (int i = 0; i < intValues.length; ++i) {
    byteValues[i * 4 + 2] = (byte) (intValues[i] & 0xFF);
    byteValues[i * 4 + 1] = (byte) ((intValues[i] >> 8) & 0xFF);
    byteValues[i * 4] = (byte) ((intValues[i] >> 16) & 0xFF);
    byteValues[i * 4 + 3] = (byte) ((intValues[i] >> 24) & 0xFF);
}

但是,加载我在python中使用的完全相同的RGB和深度图像,会得到不同的(错误的)识别结果。但是,为了创建tf.record文件,我不得不修改图像的保存方式,从两个文件中提取图像,如下所示:

image = cv2.imread(full_path)[:, :, ::-1]
print(image.tostring())
background = cv2.imread(full_path.replace('JPEG', 'Depth').replace('R', 
'D').replace('jpg', 'png'), 0)
background = np.reshape(background, (480,320,1))
# Image and background are numpy arrays that has dimension of H x W x 3 and H x W x 1
# Concatenate them on depth channel to create an H x W x 4 input
inputs_stacked = np.concatenate([image, background], axis=-1)
# Encode your input as string
encoded_inputs = inputs_stacked.tostring()

然后,以后在tf.train.Example(features=tf.train.Features(feature={下另存为'image/encoded': dataset_util.bytes_feature(encoded_inputs)

最终,我需要知道的是如何在Android Java中获取字节流以匹配tensorflow中的字节流,它是一个H xW x 4 numpy数组,被馈送到对象检测api的dataset_util。

0 个答案:

没有答案