Spaces:
Runtime error
Runtime error
File size: 6,040 Bytes
54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 eee0e91 54e2701 |
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import cv2 # مكتبة للتعامل مع الفيديو والصور
import torch # مكتبة للتعلم العميق
from PIL import Image, ImageDraw # مكتبة لتحرير الصور
import gradio as gr # مكتبة لإنشاء واجهات تفاعلية
import pandas as pd # مكتبة للتعامل مع البيانات
from transformers import pipeline # مكتبة للترجمة
# تحميل نموذج YOLOv5 من مكتبة ultralytics
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# تحميل نموذج الترجمة من الإنجليزية إلى العربية
translator = pipeline("translation_en_to_ar", model="Helsinki-NLP/opus-mt-en-ar")
# دالة لاكتشاف الكائنات ورسم الإطارات في الصور
def detect_and_draw_image(input_image):
results = model(input_image) # تنفيذ الكشف عن الكائنات
detections = results.xyxy[0].numpy() # الحصول على النتائج كـ مصفوفة NumPy
draw = ImageDraw.Draw(input_image) # إنشاء كائن للرسم على الصورة
counts = {} # قاموس لتخزين عدد الكائنات
for detection in detections: # معالجة كل كشف
xmin, ymin, xmax, ymax, conf, class_id = detection # استخراج معلومات الكشف
label = model.names[int(class_id)] # الحصول على اسم الكائن
counts[label] = counts.get(label, 0) + 1 # تحديث عدد الكائنات
draw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2) # رسم الإطار
draw.text((xmin, ymin), f"{label}: {conf:.2f}", fill="white") # كتابة التسمية والنسبة
# ترجمة التسميات إلى العربية
translated_labels = translator(list(counts.keys()))
# إنشاء DataFrame لتخزين النتائج
df = pd.DataFrame({
'Label (English)': list(counts.keys()),
'Label (Arabic)': [t['translation_text'] for t in translated_labels],
'Object Count': list(counts.values())
})
return input_image, df # إرجاع الصورة المعدلة وDataFrame
# دالة لاكتشاف الكائنات ورسم الإطارات في الفيديو
def detect_and_draw_video(video_path):
cap = cv2.VideoCapture(video_path) # فتح الفيديو
frames = [] # قائمة لتخزين الإطارات
overall_counts = {} # قاموس لتخزين عدد الكائنات الإجمالية
while cap.isOpened(): # معالجة كل إطار حتى نهاية الفيديو
ret, frame = cap.read() # قراءة الإطار
if not ret: # إذا لم يتم قراءة الإطار، الخروج من الحلقة
break
frame = cv2.resize(frame, (640, 480)) # تغيير حجم الإطار لتسهيل المعالجة
results = model(frame) # تنفيذ الكشف عن الكائنات
detections = results.xyxy[0].numpy() # الحصول على النتائج
for detection in detections: # معالجة كل كشف
xmin, ymin, xmax, ymax, conf, class_id = detection
label = model.names[int(class_id)] # الحصول على اسم الكائن
overall_counts[label] = overall_counts.get(label, 0) + 1 # تحديث عدد الكائنات
# رسم الإطار والنص على الفيديو
cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 0, 0), 2)
cv2.putText(frame, f"{label}: {conf:.2f}", (int(xmin), int(ymin) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
frames.append(frame) # إضافة الإطار إلى القائمة
cap.release() # إغلاق الفيديو
output_path = 'output.mp4' # مسار الفيديو الناتج
out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480)) # إنشاء كائن لكتابة الفيديو
for frame in frames: # كتابة الإطارات إلى ملف الفيديو
out.write(frame)
out.release() # إغلاق ملف الفيديو
# ترجمة التسميات إلى العربية
translated_labels = translator(list(overall_counts.keys()))
# إنشاء DataFrame لتخزين النتائج
df = pd.DataFrame({
'Label (English)': list(overall_counts.keys()),
'Label (Arabic)': [t['translation_text'] for t in translated_labels],
'Object Count': list(overall_counts.values())
})
return output_path, df # إرجاع مسار الفيديو وDataFrame
# إنشاء واجهات لتطبيق Gradio
image_interface = gr.Interface(
fn=detect_and_draw_image, # الدالة الخاصة بمعالجة الصور
inputs=gr.Image(type="pil", label="Upload Image"), # إدخال صورة
outputs=[gr.Image(type="pil"), gr.Dataframe(label="Object Counts")], # إخراج الصورة وDataFrame
title="Object Detection for Images", # عنوان الواجهة
description="Upload an image to see the objects detected by YOLOv5 with bounding boxes and their counts." # وصف الواجهة
)
video_interface = gr.Interface(
fn=detect_and_draw_video, # الدالة الخاصة بمعالجة الفيديو
inputs=gr.Video(label="Upload Video"), # إدخال فيديو
outputs=[gr.Video(label="Processed Video"), gr.Dataframe(label="Object Counts")], # إخراج الفيديو وDataFrame
title="Object Detection for Videos", # عنوان الواجهة
description="Upload a video to see the objects detected by YOLOv5 with bounding boxes and their counts." # وصف الواجهة
)
# دمج الواجهات في تطبيق واحد
app = gr.TabbedInterface([image_interface, video_interface], ["Image Detection", "Video Detection"])
# تشغيل التطبيق
app.launch(debug=True) # إطلاق التطبيق مع تمكين وضع التصحيح
|