| import os |
|
|
| import gradio as gr |
| from imgutils.detect import detect_person, detect_halfbody, detect_heads, detection_visualize |
|
|
|
|
| def _split_image(image, head_scale: float): |
| retval = [] |
| all_detects = [] |
| for i, (px, _, score) in enumerate(detect_person(image), start=1): |
| person_image = image.crop(px) |
| person_label = f'Person #{i} ({score * 100.0:.1f}%)' |
| retval.append((person_image, person_label)) |
| all_detects.append((px, 'person', score)) |
| px0, py0, _, _ = px |
|
|
| half_detects = detect_halfbody(person_image) |
| if half_detects: |
| halfbody_image = person_image.crop(half_detects[0][0]) |
| halfbody_label = f'Person #{i} - Half Body' |
| retval.append((halfbody_image, halfbody_label)) |
| bx0, by0, bx1, by1 = half_detects[0][0] |
| all_detects.append(((bx0 + px0, by0 + py0, bx1 + px0, by1 + py0), 'halfbody', half_detects[0][2])) |
|
|
| head_detects = detect_heads(person_image) |
| if head_detects: |
| (hx0, hy0, hx1, hy1), _, head_score = head_detects[0] |
| cx, cy = (hx0 + hx1) / 2, (hy0 + hy1) / 2 |
| width, height = hx1 - hx0, hy1 - hy0 |
| width = height = max(width, height) * head_scale |
| x0, y0 = int(max(cx - width / 2, 0)), int(max(cy - height / 2, 0)) |
| x1, y1 = int(min(cx + width / 2, person_image.width)), int(min(cy + height / 2, person_image.height)) |
| head_image = person_image.crop((x0, y0, x1, y1)) |
| head_label = f'Person #{i} - Head' |
| retval.append((head_image, head_label)) |
| all_detects.append(((x0 + px0, y0 + py0, x1 + px0, y1 + py0), 'head', head_score)) |
|
|
| return detection_visualize(image, all_detects), retval |
|
|
|
|
| if __name__ == '__main__': |
| with gr.Blocks() as demo: |
| with gr.Row(): |
| with gr.Column(): |
| gr_input = gr.Image(type='pil', label='Original Image') |
| gr_head_scale = gr.Slider(0.8, 2.5, 1.5, label='Head Scale') |
| gr_button = gr.Button(value='Crop', variant='primary') |
|
|
| with gr.Column(): |
| with gr.Tabs(): |
| with gr.Tab('Detected'): |
| gr_detected = gr.Image(type='pil', label='Detection') |
| with gr.Tab('Cropped'): |
| gr_gallery = gr.Gallery(label='Cropped Images') |
|
|
| gr_button.click( |
| _split_image, |
| inputs=[gr_input, gr_head_scale], |
| outputs=[gr_detected, gr_gallery], |
| ) |
|
|
| demo.queue(os.cpu_count()).launch() |
|
|