我正在尝试将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。