Tflite Android: преобразование байтового буфера в карту сегментации - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть подготовленная модель сегментации 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 реализации).

enter image description here

...