Реализация модели MobileNetV2 в Android дает разные результаты прогнозированияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Реализация модели MobileNetV2 в Android дает разные результаты прогнозирования

Сообщение Anonymous »

Я пытаюсь реализовать предварительно обученную облегченную модель DL для классификации документа изображения в Android, я получаю разные результаты между Android и Python, я конвертирую модель в Tensor Flow Lite для реализации в Android.

Код: Выделить всё

    # Load and augment training data
train_generator = train_datagen.flow_from_directory(
directory=train_dir,
target_size=(224, 224),
batch_size=32,
class_mode='categorical',
shuffle=True
)

def create_transfer_learning_model(input_shape, num_classes):
base_model = MobileNetV2(input_shape=input_shape, include_top=False, weights='imagenet')
base_model.trainable = False  # Freeze the pre-trained weights

model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(128, activation='relu'),
layers.Dense(num_classes, activation='softmax')
])

return model

# Load the trained model
model = tf.keras.models.load_model('mobilenetv2_model.h5')

# Convert the model to TensorFlow Lite format
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

# Save the converted model to a .tflite file
with open('mobilenetv2_model.tflite', 'wb') as f:
f.write(tflite_model)
Со стороны Android я использовал тот же размер изображения, что и в данных поезда.

Код: Выделить всё

# Define input shape and number of classes
input_shape = (224, 224, 3)  # Assuming input images are resized to 224x224 RGB images
num_classes = 4  # Number of boat classes

# Create the lightweight transfer learning model
transfer_learning_model = create_transfer_learning_model(input_shape, num_classes)

# Compile the model
transfer_learning_model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
Преобразование растрового изображения в массив байтов происходит следующим образом: я не масштабировал (нормализовал) изображение в Android, поскольку я не нормализовал пиксели на стороне Python:

Код: Выделить всё

 int imageSize = 224;
// Your model expects images of shape (224, 224, 3) where:
// 224 is the width and height of the image.
// 3 represents the RGB channels.
Bitmap.createScaledBitmap(image, imageSize, imageSize, false);

private ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * imageSize * imageSize * 3);
byteBuffer.order(ByteOrder.nativeOrder());

int[] intValues = new int[imageSize * imageSize];
bitmap.getPixels(
intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());

int pixel = 0;
for (int i = 0; i < imageSize; i++) {
for (int j = 0; j < imageSize; j++) {
int val = intValues[pixel++];
// Pass the pixel values as they are without normalization
byteBuffer.putFloat((val >> 16) & 0xFF); // Red
byteBuffer.putFloat((val >> 8) & 0xFF); // Green
byteBuffer.putFloat(val & 0xFF); // Blue
}
}
return byteBuffer;
}
Тестовая база данных представляет собой фотографии, сделанные вручную с устройства Android, и в программе рисования она имеет следующий размер: может ли это привести к потере некоторых функций при изменении размера и почему она дает точный результат в Python size, хотя я также использую target_size=(224, 224),
[img]https://i.sstatic.net /65oSU7nB.png[/img]

Моя база данных выглядит следующим образом:
Количество изображений в каждом классе:
  • BULG_ID: 10 изображений
  • Congo_DrivLI: 10 изображений
  • MUEL_ID: 10 изображений
  • MUEL_PASS: 10 изображений


Подробнее здесь: https://stackoverflow.com/questions/791 ... on-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»