Как передать растровое изображение изображения в мобильную модель Tensorflow?

#android #tensorflow #android-bitmap

#Android #tensorflow #android-bitmap

Вопрос:

Я создал Keras используемую модель Transfer Learning . Я использовал InceptionV3 модель as base и сделал начальные 52 слои as non-trainable . Затем я добавляю custom поверх него свои слои. Обучил его и сохранил в hdf5 файл. Модель, предсказанная A.png на моем laptop . Correct

Я преобразовал его в pb файл с помощью Github инструмента. Затем я предсказал A.png по pb модели laptop . Это было correct .

Затем я переместил pb файл в android asset папку. Я добавляю Tensorflow Mobile зависимость от него (нет TensorflowLite ). Я также добавил то же A.png asset самое. Я загрузил модель и перешел A.png к pb модели. Вывод был wrong классом. Я пробовал с другими изображениями. Всегда указывает на same wrong class . Output never changed .

Итак, я чувствую hdf5 , pb что модель правильная, но в моей есть некоторые mistake code which is passing the A.png to pb model . Пожалуйста, помогите мне!

resized_image -> Растровое изображение A.png inferenceInterface -> интерфейс модели tensorflow INPUT_NODE -> имя входного узла OUTPUT_NODE -> имя выходного узла 1,128,128,3 -> изображение 128×128 и 3 канала

 imageValuesFloat = normalizeBitmap(resized_image,128,127.5f,1.0f);
              inferenceInterface.feed(INPUT_NODE,imageValuesFloat,1,128,128,3);

inferenceInterface.run(OUTPUT_NODES);

//declare array to hold results obtained from model
float[] result = new float[OUTPUT_SIZE];

//copy the output into the result array
inferenceInterface.fetch(OUTPUT_NODE,result);
 

Вот normalizeBitmap функция

 public float[] normalizeBitmap(Bitmap source,int size,float mean,float std){
        float[] output = new float[size * size * 3];
        int[] intValues = new int[source.getHeight() * source.getWidth()];
        source.getPixels(intValues, 0, source.getWidth(), 0, 0, source.getWidth(), source.getHeight());
        for (int i = 0; i < intValues.length;   i) {
            final int val = intValues[i];
            output[i * 3] = (((val >> 16) amp; 0xFF) - mean)/std;
            output[i * 3   1] = (((val >> 8) amp; 0xFF) - mean)/std;
            output[i * 3   2] = ((val amp; 0xFF) - mean)/std;
        }
        return output;
    }
 

Комментарии:

1. Нормализация означает приведение значений от 0 до 1. То, что вы делаете, — это стандартизация, при которой значения имеют среднее значение 0 и стандартное отклонение 1.

2. На самом деле я мало что знал об Android tensorflow. Я знаю о керасе.

3. Я скопировал код с heartbeat.fritz.ai /…

4. Тем временем я видел еще один пример на github. Они использовали 128,5 и 128 в качестве среднего и стандартного отклонения. Я использовал те же значения, и это решило проблему

5. Изображения (цветные) имеют 3 канала, а именно R, G, B, в которых каждый из них имеет значение в диапазоне от 0 до 255. Для того, чтобы перенести изображения в масштабе от 0 до 1, каждое из значений делится на 255. Для нормализации вы можете обратиться сюда . Стандартизация также является хорошей практикой. Вы можете посмотреть здесь .