Spaces:
Sleeping
Sleeping
| 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) | |