import os
from PIL import Image
import shutil

os.makedirs('images', exist_ok=True)
os.makedirs('data/train/cat', exist_ok=True)
os.makedirs('data/test/cat', exist_ok=True)

img_path = 'white_cat.jpg'
if not os.path.isfile(img_path):
    raise FileNotFoundError("Image 'white_cat.jpg' not found in the current directory.")

img = Image.open(img_path)
img = img.convert('RGB')
img.save('images/white_cat.jpg')


for i in range(8):  
    img.save(f"data/train/cat/cat_{i}.jpg")

for i in range(2):  
    img.save(f"data/test/cat/cat_{i}.jpg")


from tensorflow.keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img

datagen = ImageDataGenerator(
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.15,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)

img = load_img('images/white_cat.jpg').resize((150, 150))
x = img_to_array(img)
x = x.reshape((1,) + x.shape)


i = 0
for batch in datagen.flow(x, batch_size=1, save_to_dir='data/train/cat', save_prefix='aug', save_format='jpg'):
    i += 1
    if i >= 5:
        break


from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator


train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(100, 100),
    batch_size=4,
    class_mode='binary'
)

test_generator = test_datagen.flow_from_directory(
    'data/test',
    target_size=(100, 100),
    batch_size=2,
    class_mode='binary'
)


model = models.Sequential([
    layers.Conv2D(16, (3, 3), activation='relu', input_shape=(100, 100, 3)),
    layers.MaxPooling2D(2, 2),
    layers.Flatten(),
    layers.Dense(16, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])


model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])


model.fit(train_generator, epochs=3)


loss, acc = model.evaluate(test_generator)
print(f'\n✅ Test accuracy: {acc:.2f}')
