|
import gradio as gr |
|
import cv2 |
|
import numpy as np |
|
import albumentations as A |
|
import random |
|
|
|
def apply_augmentations(image, flip_h, flip_v, rotate, crop, gray, scale, |
|
prob_flip_h, prob_flip_v, prob_rotate, prob_crop, prob_gray, prob_scale, |
|
rotation_limit): |
|
augmentations = [] |
|
|
|
if flip_h: |
|
augmentations.append(A.HorizontalFlip(p=float(prob_flip_h))) |
|
if flip_v: |
|
augmentations.append(A.VerticalFlip(p=float(prob_flip_v))) |
|
if rotate: |
|
augmentations.append(A.Rotate(limit=(-rotation_limit, rotation_limit), p=float(prob_rotate))) |
|
if crop: |
|
augmentations.append(A.RandomResizedCrop( |
|
size=(image.shape[0], image.shape[1]), |
|
scale=(0.8, 1.0), |
|
p=float(prob_crop) |
|
)) |
|
if gray: |
|
augmentations.append(A.ToGray(p=float(prob_gray))) |
|
if scale: |
|
scale_factor = random.uniform(0.8, 1.2) |
|
augmentations.append(A.Resize( |
|
height=int(image.shape[0] * scale_factor), |
|
width=int(image.shape[1] * scale_factor), |
|
p=float(prob_scale) |
|
)) |
|
|
|
transform = A.Compose(augmentations) |
|
|
|
|
|
augmented_images = [] |
|
for _ in range(9): |
|
augmented = transform(image=image) |
|
augmented_images.append(augmented['image']) |
|
|
|
|
|
max_height = max(img.shape[0] for img in augmented_images) |
|
max_width = max(img.shape[1] for img in augmented_images) |
|
|
|
|
|
padded_images = [] |
|
for img in augmented_images: |
|
h, w = img.shape[:2] |
|
pad_top = (max_height - h) // 2 |
|
pad_bottom = max_height - h - pad_top |
|
pad_left = (max_width - w) // 2 |
|
pad_right = max_width - w - pad_left |
|
|
|
|
|
if len(img.shape) == 3: |
|
padded = cv2.copyMakeBorder(img, pad_top, pad_bottom, pad_left, pad_right, |
|
cv2.BORDER_CONSTANT, value=[128, 128, 128]) |
|
else: |
|
padded = cv2.copyMakeBorder(img, pad_top, pad_bottom, pad_left, pad_right, |
|
cv2.BORDER_CONSTANT, value=[128]) |
|
padded_images.append(padded) |
|
|
|
|
|
rows = [] |
|
for i in range(0, 9, 3): |
|
row = np.hstack(padded_images[i:i+3]) |
|
rows.append(row) |
|
grid = np.vstack(rows) |
|
|
|
return grid |
|
|
|
def main(): |
|
with gr.Blocks() as demo: |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_image = gr.Image(label="Input Image") |
|
with gr.Column(): |
|
output_image = gr.Image(label="Output Image (3x3 Grid)") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
flip_h = gr.Checkbox(label="Horizontal Flip") |
|
prob_flip_h = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
|
|
with gr.Column(): |
|
flip_v = gr.Checkbox(label="Vertical Flip") |
|
prob_flip_v = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
|
|
with gr.Column(): |
|
rotate = gr.Checkbox(label="Rotate") |
|
prob_rotate = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
rotation_limit = gr.Slider(minimum=0, maximum=90, value=10, label="Rotation Limit (±degrees)") |
|
|
|
with gr.Column(): |
|
crop = gr.Checkbox(label="Random Crop") |
|
prob_crop = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
|
|
with gr.Column(): |
|
gray = gr.Checkbox(label="Grayscale") |
|
prob_gray = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
|
|
with gr.Column(): |
|
scale = gr.Checkbox(label="Random Scale (0.8-1.2x)") |
|
prob_scale = gr.Slider(minimum=0, maximum=1, value=0.5, label="Probability") |
|
|
|
with gr.Row(): |
|
run_button = gr.Button("Apply Augmentations") |
|
|
|
run_button.click( |
|
fn=apply_augmentations, |
|
inputs=[ |
|
input_image, |
|
flip_h, flip_v, rotate, crop, gray, scale, |
|
prob_flip_h, prob_flip_v, prob_rotate, prob_crop, prob_gray, prob_scale, |
|
rotation_limit |
|
], |
|
outputs=output_image |
|
) |
|
|
|
demo.launch() |
|
|
|
if __name__ == "__main__": |
|
main() |