Я пытаюсь создать классификационную модель с помощью керасов и развернуть модель на моем телефоне Android.Я использую код этого веб-сайта , чтобы развернуть свою конвертированную модель, которая представляет собой файл .pb, на моем телефоне Android.Я загружаю изображение с телефона, и все работает нормально, но результат прогноза полностью отличается от результата, полученного на моем ПК.
Процедура тестирования на моем ПК:
загрузить изображение с помощью cv2 и преобразовать его в np.float32
, чтобы использовать функцию python keras resnet50 'preprocess_input' для предварительной обработки изображения
увеличить размер изображения для пакетной обработки (размер партии равен 1)
переслать изображение в модель и получить результат
Соответствует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.
У кого-нибудь есть идеи?Большое спасибо.
Я попробовал следующее:
Загрузите 3-канальное изображение RGB в мой телефон со значением пикселя [127,127,127]и используйте измененный код, приведенный ниже, и он даст мне результат прогнозирования, который совпадает с результатом прогнозирования с использованием модели .h5 на ПК.
Проверка преобразованной модели .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();