Shatha2030's picture
Update app.py
9a4530a verified
import gradio as gr
from ultralytics import YOLO
import cv2
import numpy as np
import tempfile
from PIL import Image
from collections import Counter
# تحميل نموذج YOLOv8
model = YOLO('yolov8n.pt')
def process_image(image):
""" معالجة الصور للكشف عن الكائنات """
results = model(image)
boxes = results[0].boxes
detection_info = [f"{results[0].names[int(box.cls[0])]}: {float(box.conf[0]):.2%}" for box in boxes]
return Image.fromarray(results[0].plot()), "\n".join(detection_info)
def process_video(video_path):
""" معالجة الفيديو للكشف عن الكائنات """
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mp4')
output_path = temp_file.name
cap = cv2.VideoCapture(video_path)
width, height = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps, total_frames = int(cap.get(cv2.CAP_PROP_FPS)), int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
detection_summary = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame)
if int(cap.get(cv2.CAP_PROP_POS_FRAMES)) % int(fps) == 0:
detection_summary.extend([results[0].names[int(box.cls[0])] for box in results[0].boxes])
out.write(results[0].plot())
cap.release()
out.release()
summary = "\n".join([f"{obj}: {count} occurrences" for obj, count in Counter(detection_summary).most_common()]) if detection_summary else "No objects detected"
return output_path, summary
def detect_objects(media):
""" دالة موحدة للتعامل مع الصور والفيديو """
if media is None:
return None, None, "Please upload an image or video.", gr.update(visible=True), gr.update(visible=False)
try:
if isinstance(media, str) and media.lower().endswith(('.mp4', '.avi', '.mov')):
output_video, detection_summary = process_video(media)
return None, output_video, detection_summary, "✅ Video processing complete!", gr.update(visible=False), gr.update(visible=True)
else:
image = cv2.imread(media) if isinstance(media, str) else media
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
processed_image, detection_info = process_image(image)
return processed_image, None, detection_info, "✅ Image processing complete!", gr.update(visible=True), gr.update(visible=False)
except Exception as e:
return None, None, f"❌ Error: {str(e)}", gr.update(visible=False), gr.update(visible=False)
# تصميم الواجهة باستخدام Gradio
with gr.Blocks() as demo:
gr.Markdown("# 🔍 Object Detection")
input_media = gr.File(label="Upload Image/Video (jpg, png, mp4, avi)", file_types=["image", "video"])
status_text = gr.Textbox(label="Status", value="Waiting for upload...", interactive=False)
detection_info = gr.Textbox(label="Detection Results", interactive=False)
with gr.Row():
with gr.Column(visible=False) as image_column:
output_image = gr.Image(label="Detected Objects")
with gr.Column(visible=False) as video_column:
output_video = gr.Video(label="Processed Video")
input_media.upload(detect_objects, inputs=[input_media], outputs=[output_image, output_video, detection_info, status_text, image_column, video_column])
# تشغيل التطبيق
if __name__ == "__main__":
demo.launch(share=True)