#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. Для нормализации вы можете обратиться сюда . Стандартизация также является хорошей практикой. Вы можете посмотреть здесь .