У меня есть подготовленная модель сегментации c семанти для tflite
. Он принимает входное изображение формы 1x224x224x3
и дает вывод softmax для трех классов формы 1x50176x3
. В Python работает нормально, как и предполагалось. Я беру argmax
для последнего измерения и изменяю вектор размера 50176 на 224x224
, а затем для каждого значения в матрице сопоставляю его с индексом карты цветов, чтобы получить карту сегментации и показать ее как наложение на исходное изображение. Я перенес модель tflite
в приложение Android
, и теперь я даю входные данные и получаю следующие данные:
private static final int[] colormap = {
0x00000000, //background
0x99ffe119, //healthy
0x993cb44b, //disease
};
imgData = ByteBuffer.allocateDirect(4 * 1 * 224 * 224 * 3);
imgData.order(ByteOrder.nativeOrder());
outputBuffer = ByteBuffer.allocateDirect(1 * 50176 * 3 * 4);
outputBuffer.order(ByteOrder.nativeOrder());
convertBitmapToByteBuffer(bitmap);
results = tflite.run(imgData, outputBuffer);
// To Do: Take argmax of outputBuffer. Reshape it to 224x224 and map to the colors to get segmentation map.
// Show it on original image as overlay.
У меня два вопроса. Правильный ли подход для выделения ByteBuffers
как для входного изображения, так и для вывода?
Во-вторых, как мне сопоставить вывод ByteBuffer
с картой сегментации, аналогично части счетчика Python?
Мне немного комфортно работать с массивами, но когда я конвертирую outputBuffer
в массив, это дает мне неожиданные случайные значения в качестве вывода! Может быть, есть лучший способ достичь цели. Я понятия не имею, как получить результат, аналогичный приложенному изображению (которое взято из моей Python реализации).