File size: 2,146 Bytes
db8c322
 
a425514
 
 
 
 
 
db8c322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a425514
 
 
db8c322
a425514
db8c322
 
a425514
db8c322
 
a425514
db8c322
 
a425514
db8c322
 
 
 
 
 
 
 
 
 
 
 
a425514
db8c322
 
 
 
 
a425514
db8c322
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
import os
import numpy as np
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Dropout, GlobalAveragePooling2D, Input
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# Define paths
base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))
train_dir = os.path.join(base_dir, 'Data/train')
val_dir = os.path.join(base_dir, 'Data/test')

# Image generators with augmentation
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=30,
    zoom_range=0.2,
    horizontal_flip=True,
    shear_range=0.2,
    width_shift_range=0.2,
    height_shift_range=0.2
)
val_datagen = ImageDataGenerator(rescale=1./255)

# Use a larger image size for better accuracy
img_size = 128

train_generator = train_datagen.flow_from_directory(
    train_dir, target_size=(img_size, img_size), batch_size=32, color_mode='rgb', class_mode='categorical')

validation_generator = val_datagen.flow_from_directory(
    val_dir, target_size=(img_size, img_size), batch_size=32, color_mode='rgb', class_mode='categorical')

# Load base model
base_model = MobileNetV2(include_top=False, input_shape=(img_size, img_size, 3), weights='imagenet')
base_model.trainable = False  # Freeze base layers

# Add custom classification head
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(256, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(7, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=predictions)
model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])

# Callbacks
callbacks = [
    EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True),
    ModelCheckpoint('best_model.keras', monitor='val_loss', save_best_only=True)
]

# Train the model
model.fit(train_generator, validation_data=validation_generator, epochs=30, callbacks=callbacks)

# Save the final model
model.save("emotion_model.keras")