CoolFace
Apppublic

LinuxWhiz/Coder2

sourceHugging Faceafl-3.0updated 3y agoView on Hugging Face
0likes
app.py147 linesDownload Raw Back to root
1import io2import random3from typing import List, Tuple4 5import aiohttp6import panel as pn7from PIL import Image8from transformers import CLIPModel, CLIPProcessor9 10pn.extension(design="bootstrap", sizing_mode="stretch_width")11 12ICON_URLS = {13    "brand-github": "https://github.com/holoviz/panel",14    "brand-twitter": "https://twitter.com/Panel_Org",15    "brand-linkedin": "https://www.linkedin.com/company/panel-org",16    "message-circle": "https://discourse.holoviz.org/",17    "brand-discord": "https://discord.gg/AXRHnJU6sP",18}19 20 21async def random_url(_):22    pet = random.choice(["cat", "dog"])23    api_url = f"https://api.the{pet}api.com/v1/images/search"24    async with aiohttp.ClientSession() as session:25        async with session.get(api_url) as resp:26            return (await resp.json())[0]["url"]27 28 29@pn.cache30def load_processor_model(31    processor_name: str, model_name: str32) -> Tuple[CLIPProcessor, CLIPModel]:33    processor = CLIPProcessor.from_pretrained(processor_name)34    model = CLIPModel.from_pretrained(model_name)35    return processor, model36 37 38async def open_image_url(image_url: str) -> Image:39    async with aiohttp.ClientSession() as session:40        async with session.get(image_url) as resp:41            return Image.open(io.BytesIO(await resp.read()))42 43 44def get_similarity_scores(class_items: List[str], image: Image) -> List[float]:45    processor, model = load_processor_model(46        "openai/clip-vit-base-patch32", "openai/clip-vit-base-patch32"47    )48    inputs = processor(49        text=class_items,50        images=[image],51        return_tensors="pt",  # pytorch tensors52    )53    outputs = model(**inputs)54    logits_per_image = outputs.logits_per_image55    class_likelihoods = logits_per_image.softmax(dim=1).detach().numpy()56    return class_likelihoods[0]57 58 59async def process_inputs(class_names: List[str], image_url: str):60    """61    High level function that takes in the user inputs and returns the62    classification results as panel objects.63    """64    try:65        main.disabled = True66        if not image_url:67            yield "##### ⚠️ Provide an image URL"68            return69    70        yield "##### ⚙ Fetching image and running model..."71        try:72            pil_img = await open_image_url(image_url)73            img = pn.pane.Image(pil_img, height=400, align="center")74        except Exception as e:75            yield f"##### 😔 Something went wrong, please try a different URL!"76            return77    78        class_items = class_names.split(",")79        class_likelihoods = get_similarity_scores(class_items, pil_img)80    81        # build the results column82        results = pn.Column("##### 🎉 Here are the results!", img)83    84        for class_item, class_likelihood in zip(class_items, class_likelihoods):85            row_label = pn.widgets.StaticText(86                name=class_item.strip(), value=f"{class_likelihood:.2%}", align="center"87            )88            row_bar = pn.indicators.Progress(89                value=int(class_likelihood * 100),90                sizing_mode="stretch_width",91                bar_color="secondary",92                margin=(0, 10),93                design=pn.theme.Material,94            )95            results.append(pn.Column(row_label, row_bar))96        yield results97    finally:98        main.disabled = False99 100 101# create widgets102randomize_url = pn.widgets.Button(name="Randomize URL", align="end")103 104image_url = pn.widgets.TextInput(105    name="Image URL to classify",106    value=pn.bind(random_url, randomize_url),107)108class_names = pn.widgets.TextInput(109    name="Comma separated class names",110    placeholder="Enter possible class names, e.g. cat, dog",111    value="cat, dog, parrot",112)113 114input_widgets = pn.Column(115    "##### 😊 Click randomize or paste a URL to start classifying!",116    pn.Row(image_url, randomize_url),117    class_names,118)119 120# add interactivity121interactive_result = pn.panel(122    pn.bind(process_inputs, image_url=image_url, class_names=class_names),123    height=600,124)125 126# add footer127footer_row = pn.Row(pn.Spacer(), align="center")128for icon, url in ICON_URLS.items():129    href_button = pn.widgets.Button(icon=icon, width=35, height=35)130    href_button.js_on_click(code=f"window.open('{url}')")131    footer_row.append(href_button)132footer_row.append(pn.Spacer())133 134# create dashboard135main = pn.WidgetBox(136    input_widgets,137    interactive_result,138    footer_row,139)140 141title = "Panel Demo - Image Classification"142pn.template.BootstrapTemplate(143    title=title,144    main=main,145    main_max_width="min(50%, 698px)",146    header_background="#F08080",147).servable(title=title)