import argparse import requests import logging import os import gradio as gr import numpy as np import cv2 import torch import torch.nn as nn from PIL import Image from torchvision import transforms from timm.data.constants import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD from timm.data import create_transform from config import get_config from collections import OrderedDict os.system("python -m pip install -e .") os.system("pip install opencv-python timm diffdist h5py sklearn ftfy") os.system("pip install git+https://github.com/lvis-dataset/lvis-api.git") import detectron2.utils.comm as comm from detectron2.checkpoint import DetectionCheckpointer from detectron2.config import get_cfg from detectron2.data import MetadataCatalog from detectron2.engine import DefaultTrainer as Trainer from detectron2.engine import default_argument_parser, default_setup, hooks, launch from detectron2.evaluation import ( CityscapesInstanceEvaluator, CityscapesSemSegEvaluator, COCOEvaluator, COCOPanopticEvaluator, DatasetEvaluators, LVISEvaluator, PascalVOCDetectionEvaluator, SemSegEvaluator, verify_results, FLICKR30KEvaluator, ) from detectron2.modeling import GeneralizedRCNNWithTTA def parse_option(): parser = argparse.ArgumentParser('RegionCLIP demo script', add_help=False) parser.add_argument('--config-file', type=str, default="configs/CLIP_fast_rcnn_R_50_C4.yaml", metavar="FILE", help='path to config file', ) args, unparsed = parser.parse_known_args() return args def build_transforms(img_size, center_crop=True): t = [] if center_crop: size = int((256 / 224) * img_size) t.append( transforms.Resize(size) ) t.append( transforms.CenterCrop(img_size) ) else: t.append( transforms.Resize(img_size) ) t.append(transforms.ToTensor()) return transforms.Compose(t) def setup(args): """ Create configs and perform basic setups. """ cfg = get_cfg() cfg.merge_from_file(args.config_file) cfg.freeze() default_setup(cfg, args) return cfg ''' build model ''' args = parse_option() cfg = setup(args) model = Trainer.build_model(cfg) DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( cfg.MODEL.WEIGHTS, resume=False ) if cfg.MODEL.META_ARCHITECTURE in ['CLIPRCNN', 'CLIPFastRCNN', 'PretrainFastRCNN'] \ and cfg.MODEL.CLIP.BB_RPN_WEIGHTS is not None\ and cfg.MODEL.CLIP.CROP_REGION_TYPE == 'RPN': # load 2nd pretrained model DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR, bb_rpn_weights=True).resume_or_load( cfg.MODEL.CLIP.BB_RPN_WEIGHTS, resume=False ) ''' build data transform ''' eval_transforms = build_transforms(800, center_crop=False) # display_transforms = build_transforms4display(960, center_crop=False) def localize_object(image, texts): img_t = eval_transforms(Image.fromarray(image).convert("RGB")) * 255 model.eval() with torch.no_grad(): res = model(texts, [{"image": img_t}]) return res image = gr.inputs.Image() gr.Interface( description="Zero-Shot Object Detection with RegionCLIP (https://github.com/microsoft/RegionCLIP)", fn=localize_object, inputs=["image", "text"], outputs=[ gr.outputs.Image( type="pil", label="grounding results"), ], examples=[ ["./birds.png", "a goldfinch"], ["./apples_six.jpg", "a yellow apple"], ["./wines.jpg", "milk shake"], ["./logos.jpg", "a microsoft logo"], ], ).launch()