File size: 2,753 Bytes
e2a99cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import tensorflow as tf
import numpy as np
import time
import os
from keras.utils import image_dataset_from_directory

val_dir="/media/data/plants_diseases_dataset/valid"
path="/media/data/plants_diseases_dataset/"
img_size=(224,224)
batch_size=32
INPUT_SHAPE = (224, 224, 3)

keras_model = tf.keras.models.load_model("models/mobileNet_10.keras")


converter = tf.lite.TFLiteConverter.from_keras_model(keras_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open("models/mobilenet_int8.tflite", "wb") as f:
    f.write(tflite_model)


def evaluate_models(keras_model, tflite_model_path, dataset):
    """Compare size, speed, and accuracy of Keras vs TFLite model."""
    keras_size = os.path.getsize("models/mobileNet_10.keras") / 1024**2
    tflite_size = os.path.getsize(tflite_model_path) / 1024**2



    interpreter = tf.lite.Interpreter(model_path=tflite_model_path)
    interpreter.allocate_tensors()
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    correct = 0
    total = 0
    times = []

    for batch_images, batch_labels in dataset.take(50):  
        batch_images = batch_images.numpy()
        batch_labels = tf.argmax(batch_labels, axis=1).numpy()

        for i in range(len(batch_images)):
            input_data = np.expand_dims(batch_images[i], axis=0).astype(np.float32)
            start = time.time()
            interpreter.set_tensor(input_details[0]['index'], input_data)
            interpreter.invoke()
            output = interpreter.get_tensor(output_details[0]['index'])
            times.append(time.time() - start)

            pred = np.argmax(output)
            if pred == batch_labels[i]:
                correct += 1
            total += 1

    tflite_acc = correct / total
    avg_time = np.mean(times) * 1000  
    print(f"\nModel sizes:")
    print(f" - Keras: {keras_size:.2f} MB")
    print(f" - TFLite INT8: {tflite_size:.2f} MB")
    print("---------------------------------------------")
    _, keras_acc = keras_model.evaluate(dataset, verbose=0)
    print(f"\n Keras Model Accuracy: {keras_acc*100:.2f}%")

    print(f" TFLite Model Accuracy: {tflite_acc*100:.2f}%")
    print(f" Avg Inference Time (1 image): {avg_time:.2f} ms")

    print("\n Summary:")
    print(f" - Size reduction: {(1 - tflite_size/keras_size)*100:.1f}%")
    print(f" - Accuracy drop: {(keras_acc - tflite_acc)*100:.2f}%")



val_ds=image_dataset_from_directory(val_dir,
                                    image_size=img_size,
                                    batch_size=batch_size,
                                    label_mode="categorical")
evaluate_models(keras_model, "models/mobilenet_int8.tflite", val_ds)