|
|
import gradio as gr |
|
|
from ultralytics import YOLO |
|
|
import cv2 |
|
|
import numpy as np |
|
|
from PIL import Image |
|
|
|
|
|
|
|
|
wound_descriptions = { |
|
|
"wound_hesitation": "บาดแผลลังเล (Hesitation wound): มักพบในผู้พยายามทำร้ายตนเอง...", |
|
|
"wound_laceration": "บาดแผลฉีกขาดขอบไม่เรียบ (Laceration): เกิดจากวัตถุแข็ง...", |
|
|
"wound_open_fracture": "บาดแผลกระดูกหักแบบเปิด (open fracture): เกิดจากกระดูกหักทิ่ม...", |
|
|
"wound_burn": "บาดแผลไหม้ (burn): บาดแผลที่เกิดจากการไหม้...", |
|
|
"wound_hanging": "บาดแผลกดรัดบริเวณลำคอ แขวนคอ (hanging)...", |
|
|
"wound_strangulation": "บาดแผลกดรัดบริเวณลำคอ รัดคอ (strangulation)...", |
|
|
"gsw_entrance": "บาดแผลทางเข้ากระสุนปืน...", |
|
|
"gsw_exit": "บาดแผลทางออกกระสุนปืน..." |
|
|
} |
|
|
|
|
|
|
|
|
model = YOLO("models/best.pt") |
|
|
|
|
|
|
|
|
def detect_wounds(image, conf_thresh=0.25): |
|
|
img_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) |
|
|
|
|
|
|
|
|
results = model(img_cv, conf=conf_thresh) |
|
|
annotated_bgr = results[0].plot() |
|
|
annotated_rgb = cv2.cvtColor(annotated_bgr, cv2.COLOR_BGR2RGB) |
|
|
|
|
|
|
|
|
detected_classes = set() |
|
|
for r in results[0].boxes.cls.cpu().numpy(): |
|
|
cls_name = results[0].names[int(r)] |
|
|
detected_classes.add(cls_name) |
|
|
|
|
|
|
|
|
desc_texts = [] |
|
|
for cls in detected_classes: |
|
|
if cls in wound_descriptions: |
|
|
desc_texts.append(f"**{cls}**: {wound_descriptions[cls]}") |
|
|
else: |
|
|
desc_texts.append(f"**{cls}**: (No description available)") |
|
|
|
|
|
return Image.fromarray(annotated_rgb), "\n\n".join(desc_texts) |
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks() as demo: |
|
|
gr.Markdown("# 🤕 Forensic Wound Detection 🔎") |
|
|
gr.Markdown("Upload an image or use your webcam for live wound detection.") |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
image_input = gr.Image(type="pil", label="Upload Image", sources=["upload", "webcam"]) |
|
|
conf_slider = gr.Slider(0, 1, value=0.25, step=0.05, label="Confidence Threshold") |
|
|
run_button = gr.Button("Run Detection") |
|
|
with gr.Column(): |
|
|
output_image = gr.Image(type="pil", label="Detection Result") |
|
|
output_text = gr.Markdown("") |
|
|
|
|
|
run_button.click( |
|
|
fn=detect_wounds, |
|
|
inputs=[image_input, conf_slider], |
|
|
outputs=[output_image, output_text] |
|
|
) |
|
|
|
|
|
gr.Markdown("---") |
|
|
gr.Markdown("Forensic education Version 1.0.0 | © 2025 BH") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|