File size: 2,175 Bytes
061dadc
 
c034823
516d9b1
 
061dadc
 
 
 
 
c034823
061dadc
 
c034823
2c61af9
 
 
 
 
c034823
061dadc
2c61af9
 
 
6801b2a
 
 
2c61af9
 
 
 
061dadc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2c61af9
061dadc
c034823
061dadc
2c61af9
061dadc
2c61af9
061dadc
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from PIL import Image
import numpy as np
import io
import gradio as gr

def encode_pil_to_bytes(pil_image: Image.Image, format: str, **params) -> bytes:
    with io.BytesIO() as output_bytes:
        pil_image.save(output_bytes, format=format, **params)
        output_bytes.seek(0)  # Rewind the BytesIO object to the beginning
        return output_bytes.read()

def save_pil_to_cache(pil_image: Image.Image, format: str) -> bytes:
    return encode_pil_to_bytes(pil_image, format)

def extract_persons(image: np.ndarray, bboxes: np.ndarray) -> list[Image.Image]:
    person_images = []
    for bbox in bboxes:
        x1, y1, x2, y2 = bbox
        person_image = image[y1:y2, x1:x2]  # Crop the detected person
        person_pil_image = Image.fromarray(person_image).convert('RGB')  # Convert to RGB
        person_images.append(person_pil_image)
    return person_images

def detect(image: np.ndarray) -> tuple[Image.Image, list[Image.Image]]:
    if image is None:
        return None, []

    image = image[:, :, ::-1]  # RGB -> BGR
    bboxes, vbboxes = detect_person(image, detector)
    res = visualize(image, bboxes, vbboxes)
    person_images = extract_persons(res, bboxes)
    processed_image = Image.fromarray(res[:, :, ::-1], 'RGB')  # BGR -> RGB
    return processed_image, person_images

def process_image(image: Image.Image) -> tuple[Image.Image, list[Image.Image]]:
    try:
        np_image = np.array(image)
        processed_image, person_images = detect(np_image)
        return processed_image, person_images
    except Exception as e:
        print(f"An error occurred: {e}")
        return None, []

def build_gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## Person Detection App")

        with gr.Row():
            input_image = gr.Image(type="pil", label="Upload an Image")
            output_image = gr.Image(type="pil", label="Processed Image")
            gallery = gr.Gallery(label="Detected Persons")

        input_image.change(fn=process_image, inputs=input_image, outputs=[output_image, gallery])

    return demo

# Example usage
if __name__ == "__main__":
    demo = build_gradio_interface()
    demo.launch()