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)  # إطلاق التطبيق مع تمكين وضع التصحيح