import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
import numpy as np
from sklearn.model_selection import train_test_split
import cv2
import os

# Load and preprocess images
def load_images(folder, label, img_size=(64, 64)):
    images, labels = [], []
    for file in os.listdir(folder):
        img = cv2.imread(os.path.join(folder, file))
        img = cv2.resize(img, img_size)
        images.append(img)
        labels.append(label)
    return images, labels

cats_folder = "dataset/cats/"
dogs_folder = "dataset/dogs/"
cat_images, cat_labels = load_images(cats_folder, 0)
dog_images, dog_labels = load_images(dogs_folder, 1)

# Combine and split data
X = np.array(cat_images + dog_images)
y = np.array(cat_labels + dog_labels)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Normalize pixel values
X_train = X_train / 255.0
X_test = X_test / 255.0

# Build CNN model
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
    MaxPooling2D((2, 2)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D((2, 2)),
    Flatten(),
    Dense(128, activation='relu'),
    Dense(1, activation='sigmoid')
])

# Compile and train
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32, validation_data=(X_test, y_test))

# Evaluate
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {accuracy * 100:.2f}%")

