import tensorflow as tf
from tensorflow.keras import layers, models, losses, optimizers
import numpy as np
# Create a simple dataset with images, class labels, and bounding boxes
# For simplicity, images are 28x28 grayscale, classes: 0 or 1
# Bounding boxes: [x_min, y_min, x_max, y_max] normalized between 0 and 1
num_samples = 1000
image_size = 28
num_classes = 2
# Random images
X = np.random.rand(num_samples, image_size, image_size, 1).astype(np.float32)
# Random class labels (0 or 1)
y = np.random.randint(0, num_classes, size=(num_samples,))
# Random bounding boxes (x_min < x_max, y_min < y_max)
boxes = np.random.rand(num_samples, 4).astype(np.float32)
boxes[:, 2:] = boxes[:, :2] + boxes[:, 2:] * 0.5 # ensure x_max > x_min, y_max > y_min
boxes = np.clip(boxes, 0, 1)
# Convert class labels to one-hot
y_one_hot = tf.keras.utils.to_categorical(y, num_classes)
# Model definition
inputs = layers.Input(shape=(image_size, image_size, 1))
x = layers.Conv2D(16, 3, activation='relu')(inputs)
x = layers.MaxPooling2D()(x)
x = layers.Conv2D(32, 3, activation='relu')(x)
x = layers.MaxPooling2D()(x)
x = layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(x)
# Two outputs: classification and bounding box regression
class_output = layers.Dense(num_classes, activation='softmax', name='class_output')(x)
box_output = layers.Dense(4, activation='sigmoid', name='box_output')(x)
model = models.Model(inputs=inputs, outputs=[class_output, box_output])
# Losses: categorical crossentropy for class, mean squared error for boxes
losses_dict = {
'class_output': losses.CategoricalCrossentropy(),
'box_output': losses.MeanSquaredError()
}
model.compile(optimizer=optimizers.Adam(learning_rate=0.001),
loss=losses_dict,
metrics={'class_output': 'accuracy'})
# Train the model
history = model.fit(X, {'class_output': y_one_hot, 'box_output': boxes},
epochs=10, batch_size=32, validation_split=0.2)
# Predict on a sample
sample_img = X[0:1]
pred_class, pred_box = model.predict(sample_img)
print(f"Predicted class probabilities: {pred_class}")
print(f"Predicted bounding box: {pred_box}")