import tensorflow as tf
from tensorflow.keras.layers import Dropout, BatchNormalization
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping
# Assume base Mask R-CNN model is defined as 'mask_rcnn_model'
# Add dropout and batch normalization to the head layers
class MaskRCNNHead(tf.keras.Model):
def __init__(self):
super().__init__()
self.conv1 = tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu')
self.bn1 = BatchNormalization()
self.dropout1 = Dropout(0.3)
self.conv2 = tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu')
self.bn2 = BatchNormalization()
self.dropout2 = Dropout(0.3)
self.mask_conv = tf.keras.layers.Conv2D(1, 1, activation='sigmoid')
def call(self, inputs, training=False):
x = self.conv1(inputs)
x = self.bn1(x, training=training)
x = self.dropout1(x, training=training)
x = self.conv2(x)
x = self.bn2(x, training=training)
x = self.dropout2(x, training=training)
return self.mask_conv(x)
# Replace the mask head in the model
mask_rcnn_model.mask_head = MaskRCNNHead()
# Compile model with lower learning rate
optimizer = Adam(learning_rate=1e-4)
mask_rcnn_model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])
# Use data augmentation
data_augmentation = tf.keras.Sequential([
tf.keras.layers.RandomFlip('horizontal'),
tf.keras.layers.RandomRotation(0.1),
tf.keras.layers.RandomZoom(0.1)
])
# Prepare training dataset with augmentation
train_dataset = train_dataset.map(lambda x, y: (data_augmentation(x, training=True), y))
# Early stopping callback
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
# Train model
history = mask_rcnn_model.fit(train_dataset, epochs=30, validation_data=val_dataset, callbacks=[early_stopping])