Как исправить разницу в препроцессинге изображений между tenorflow и android studio? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь создать классификационную модель с помощью керасов и развернуть модель на моем телефоне Android.Я использую код этого веб-сайта , чтобы развернуть свою конвертированную модель, которая представляет собой файл .pb, на моем телефоне Android.Я загружаю изображение с телефона, и все работает нормально, но результат прогноза полностью отличается от результата, полученного на моем ПК.

Процедура тестирования на моем ПК:

  1. загрузить изображение с помощью cv2 и преобразовать его в np.float32

  2. , чтобы использовать функцию python keras resnet50 'preprocess_input' для предварительной обработки изображения

  3. увеличить размер изображения для пакетной обработки (размер партии равен 1)

  4. переслать изображение в модель и получить результат

Соответствуетcode:

img = cv2.imread('./my_test_image.jpg')
x = preprocess_input(img.astype(np.float32))
x = np.expand_dims(x, axis=0)
net = load_model('./my_model.h5')
prediction_result = net.predict(x)

И я заметил, что часть Android, предназначенная для предварительной обработки изображений, отличается от метода, который я использовал в keras, для которого используется режим caffe (конвертируйте изображения из RGB в BGR, затем центрируйте каждый цвет по нулю)канал по отношению к набору данных ImageNet).Кажется, что оригинальный код предназначен для режима tf (масштабирует пиксели от -1 до 1).

Итак, я изменил следующий код preprocessBitmap так, как мне кажется, и использовал 3-канальное RGB-изображение со значением пикселя [127,127,127] для его проверки.Код предсказывает тот же результат, что и модель .h5.Но когда я загружаю изображение для классификации, результат прогноза отличается от модели .h5.

У кого-нибудь есть идеи?Большое спасибо.

Я попробовал следующее:

  1. Загрузите 3-канальное изображение RGB в мой телефон со значением пикселя [127,127,127]и используйте измененный код, приведенный ниже, и он даст мне результат прогнозирования, который совпадает с результатом прогнозирования с использованием модели .h5 на ПК.

  2. Проверка преобразованной модели .pb на ПК , используя модуль тензорного потока gfile с изображением, и это дает мне правильный результат прогноза (сравните с моделью .h5).Поэтому я думаю, что преобразованный файл .pb не имеет никаких проблем.

Весь раздел preprocessBitmap

// code of 'preprocessBitmap' section in TensorflowImageClassifier.java
TraceCompat.beginSection("preprocessBitmap");
        // Preprocess the image data from 0-255 int to normalized float based
        // on the provided parameters.
        bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

        for (int i = 0; i < intValues.length; ++i) {
            // this is a ARGB format, so we need to mask the least significant 8 bits to get blue, and next 8 bits to get green and next 8 bits to get red. Since we have an opaque image, alpha can be ignored.
            final int val = intValues[i];

            // original
            /*
            floatValues[i * 3 + 0] = (((val >> 16) & 0xFF) - imageMean) / imageStd;
            floatValues[i * 3 + 1] = (((val >> 8) & 0xFF) - imageMean) / imageStd;
            floatValues[i * 3 + 2] = ((val & 0xFF) - imageMean) / imageStd;
            */

            // what I think it should be to do the same thing in mode caffe when using keras
            floatValues[i * 3 + 0] = (((val >> 16) & 0xFF) - (float)123.68);
            floatValues[i * 3 + 1] = (((val >> 8) & 0xFF) - (float)116.779);
            floatValues[i * 3 + 2] = (((val & 0xFF)) - (float)103.939);
        }
TraceCompat.endSection();
...