| import gradio as gr |
| import numpy as np |
| from PIL import Image |
| import torch |
| import random |
|
|
| import os |
| import shutil |
| import config |
| from models.yolo import YOLOv3 |
| from utils.data import PascalDataModule |
| from utils.loss import YoloLoss |
| from utils.gradcam import generate_gradcam |
| from utils.utils import generate_result |
| from markdown import model_stats, data_stats |
|
|
| datamodule = PascalDataModule( |
| train_csv_path=f"{config.DATASET}/train.csv", |
| test_csv_path=f"{config.DATASET}/test.csv", |
| batch_size=config.BATCH_SIZE, |
| shuffle=config.SHUFFLE, |
| num_workers=os.cpu_count() - 1, |
| ) |
| datamodule.setup() |
|
|
|
|
| class FilterModel(torch.nn.Module): |
| def __init__(self): |
| super().__init__() |
| self.yolo = YOLOv3.load_from_checkpoint( |
| "model.ckpt", |
| map_location={"cuda:1": "cpu"}, |
| in_channels=3, |
| num_classes=config.NUM_CLASSES, |
| epochs=config.NUM_EPOCHS, |
| loss_fn=YoloLoss, |
| datamodule=datamodule, |
| learning_rate=config.LEARNING_RATE, |
| maxlr=config.LEARNING_RATE, |
| scheduler_steps=len(datamodule.train_dataloader()), |
| device_count=config.NUM_WORKERS, |
| ) |
|
|
| def forward(self, x): |
| x = self.yolo(x) |
| return x[-1] |
|
|
|
|
| model = FilterModel() |
|
|
| prediction_image = None |
|
|
|
|
| def upload_file(files): |
| file_paths = [file.name for file in files] |
| return file_paths |
|
|
|
|
| def read_image(path): |
| img = Image.open(path) |
| img.load() |
| data = np.asarray(img, dtype="uint8") |
| return data |
|
|
|
|
| |
| |
| |
| |
| |
|
|
| all_imgs = os.listdir(config.IMG_DIR) |
| random.shuffle(all_imgs) |
| sample_images = [f"{config.IMG_DIR}/{all_imgs[i]}" for i in range(10)] |
|
|
|
|
| def get_gradcam_images(gradcam_layer, images, gradcam_opacity): |
| gradcam_images = [] |
| target_layers = [model.yolo.layers[int(gradcam_layer)]] |
| gradcam_images = generate_gradcam( |
| model=model, |
| target_layers=target_layers, |
| images=images, |
| use_cuda=False, |
| transparency=gradcam_opacity, |
| ) |
| return gradcam_images |
|
|
|
|
| def show_hide_gradcam(status): |
| if not status: |
| return [gr.update(visible=False) for i in range(3)] |
| return [gr.update(visible=True) for i in range(3)] |
|
|
|
|
| def set_prediction_image(evt: gr.SelectData, gallery): |
| global prediction_image |
| if isinstance(gallery[evt.index], dict): |
| prediction_image = gallery[evt.index]["name"] |
| else: |
| prediction_image = gallery[evt.index][0]["name"] |
|
|
|
|
| def predict(is_gradcam, gradcam_layer, gradcam_opacity): |
| gradcam_images = [None] |
| img = read_image(prediction_image) |
| image_transformed = config.test_transforms(image=img, bboxes=[])["image"] |
| if is_gradcam: |
| images = [image_transformed] |
| gradcam_images = get_gradcam_images(gradcam_layer, images, gradcam_opacity) |
|
|
| data = image_transformed.unsqueeze(0) |
|
|
| if not os.path.exists("output"): |
| os.mkdir("output") |
| else: |
| shutil.rmtree("output") |
| os.mkdir("output") |
| generate_result( |
| model=model.yolo, |
| data=data, |
| thresh=0.6, |
| iou_thresh=0.5, |
| anchors=model.yolo.scaled_anchors, |
| ) |
| result_images = os.listdir("output") |
| result_images = [ |
| f"output/{file}" for file in result_images if file.endswith(".png") |
| ] |
| return { |
| output: gr.update(value=result_images[0]), |
| gradcam_output: gr.update(value=gradcam_images[0]), |
| } |
|
|
|
|
| with gr.Blocks() as app: |
| gr.Markdown("## ERA Session13 - PASCAL-VOC Object Detection with YoloV3") |
| with gr.Row(): |
| with gr.Column(): |
| with gr.Box(): |
| is_gradcam = gr.Checkbox( |
| label="GradCAM Images", |
| info="Display GradCAM images?", |
| ) |
| gradcam_layer = gr.Dropdown( |
| choices=list(range(len(model.yolo.layers))), |
| label="Select the layer", |
| info="Please select the layer for which the GradCAM is required", |
| interactive=True, |
| visible=False, |
| ) |
| gradcam_opacity = gr.Slider( |
| minimum=0, |
| maximum=1, |
| value=0.6, |
| label="Opacity", |
| info="Opacity of GradCAM output", |
| interactive=True, |
| visible=False, |
| ) |
|
|
| is_gradcam.input( |
| show_hide_gradcam, |
| inputs=[is_gradcam], |
| outputs=[gradcam_layer, gradcam_opacity], |
| ) |
| with gr.Box(): |
| |
| with gr.Group(): |
| upload_gallery = gr.Gallery( |
| value=None, |
| label="Uploaded images", |
| show_label=False, |
| elem_id="gallery_upload", |
| columns=5, |
| rows=2, |
| height="auto", |
| object_fit="contain", |
| ) |
| upload_button = gr.UploadButton( |
| "Click to Upload images", |
| file_types=["image"], |
| file_count="multiple", |
| ) |
| upload_button.upload(upload_file, upload_button, upload_gallery) |
|
|
| with gr.Group(): |
| sample_gallery = gr.Gallery( |
| value=sample_images, |
| label="Sample images", |
| show_label=True, |
| elem_id="gallery_sample", |
| columns=5, |
| rows=2, |
| height="auto", |
| object_fit="contain", |
| ) |
|
|
| upload_gallery.select(set_prediction_image, inputs=[upload_gallery]) |
| sample_gallery.select(set_prediction_image, inputs=[sample_gallery]) |
|
|
| run_btn = gr.Button() |
| with gr.Column(): |
| with gr.Box(): |
| output = gr.Image(value=None, label="Model Result") |
| with gr.Box(): |
| gradcam_output = gr.Image(value=None, label="GradCAM Image") |
|
|
| run_btn.click( |
| predict, |
| inputs=[ |
| is_gradcam, |
| gradcam_layer, |
| gradcam_opacity, |
| ], |
| outputs=[output, gradcam_output], |
| ) |
|
|
| with gr.Row(): |
| with gr.Box(): |
| with gr.Row(): |
| with gr.Column(): |
| with gr.Box(): |
| gr.Markdown(model_stats) |
| with gr.Column(): |
| with gr.Box(): |
| gr.Markdown(data_stats) |
|
|
| app.launch() |
|
|