hysts's picture
hysts HF staff
Update
dc8c83e
#!/usr/bin/env python
from __future__ import annotations
import functools
import os
import pathlib
import tarfile
import urllib.request
import cv2
import gradio as gr
import huggingface_hub
import numpy as np
DESCRIPTION = "# [nagadomi/lbpcascade_animeface](https://github.com/nagadomi/lbpcascade_animeface)"
def load_sample_image_paths() -> list[pathlib.Path]:
image_dir = pathlib.Path("images")
if not image_dir.exists():
dataset_repo = "hysts/sample-images-TADNE"
path = huggingface_hub.hf_hub_download(dataset_repo, "images.tar.gz", repo_type="dataset")
with tarfile.open(path) as f:
f.extractall()
return sorted(image_dir.glob("*"))
def load_model() -> cv2.CascadeClassifier:
url = "https://raw.githubusercontent.com/nagadomi/lbpcascade_animeface/master/lbpcascade_animeface.xml"
path = pathlib.Path("lbpcascade_animeface.xml")
if not path.exists():
urllib.request.urlretrieve(url, path.as_posix())
return cv2.CascadeClassifier(path.as_posix())
def detect(image_path: str, detector: cv2.CascadeClassifier) -> np.ndarray:
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
preds = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(24, 24))
res = image.copy()
for x, y, w, h in preds:
cv2.rectangle(res, (x, y), (x + w, y + h), (0, 255, 0), 2)
return res[:, :, ::-1]
image_paths = load_sample_image_paths()
examples = [[path.as_posix()] for path in image_paths]
detector = load_model()
fn = functools.partial(detect, detector=detector)
with gr.Blocks(css="style.css") as demo:
gr.Markdown(DESCRIPTION)
with gr.Row():
with gr.Column():
image = gr.Image(label="Input", type="filepath")
run_button = gr.Button()
with gr.Column():
result = gr.Image(label="Result")
gr.Examples(
examples=examples,
inputs=image,
outputs=result,
fn=fn,
cache_examples=os.getenv("CACHE_EXAMPLES") == "1",
)
run_button.click(
fn=fn,
inputs=image,
outputs=result,
api_name="predict",
)
if __name__ == "__main__":
demo.queue(max_size=15).launch()