RakanAlsheraiwi commited on
Commit
54e2701
1 Parent(s): a0b4f1b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -86
app.py CHANGED
@@ -1,118 +1,111 @@
1
- import cv2
2
- import torch
3
- from PIL import Image, ImageDraw
4
- import gradio as gr
5
- import numpy as np
6
- import pandas as pd
7
 
8
- # Load the YOLOv5 model
9
- model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # Load the small YOLOv5 model
10
 
11
- # Define a function to detect objects and draw bounding boxes for images
 
 
 
12
  def detect_and_draw_image(input_image):
13
- results = model(input_image)
14
- detections = results.xyxy[0].numpy() # Get detections
15
-
16
- draw = ImageDraw.Draw(input_image)
17
-
18
- counts = {}
19
- for detection in detections:
20
- xmin, ymin, xmax, ymax, conf, class_id = detection
21
-
22
- # Update counts for each label
23
- label = model.names[int(class_id)]
24
- counts[label] = counts.get(label, 0) + 1
25
-
26
- # Draw the bounding box
27
- draw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2)
28
- # Draw the label and score
29
- draw.text((xmin, ymin), f"{label}: {conf:.2f}", fill="white")
30
-
31
- # Create DataFrame
32
  df = pd.DataFrame({
33
- 'label': list(counts.keys()),
34
- 'counts': list(counts.values())
 
35
  })
36
 
37
- return input_image, df # Return modified image and DataFrame
38
 
39
- # Define a function to detect objects and draw bounding boxes for videos
40
  def detect_and_draw_video(video_path):
41
- cap = cv2.VideoCapture(video_path)
42
- frames = []
43
- frame_shape = None
44
- overall_counts = {}
45
-
46
- while cap.isOpened():
47
- ret, frame = cap.read()
48
- if not ret:
49
- break
50
 
51
- # Resize frame for faster processing
52
- frame = cv2.resize(frame, (640, 480)) # Resize to 640x480
 
 
53
 
54
- # Perform detection
55
- results = model(frame)
56
- detections = results.xyxy[0].numpy() # Get detections
57
 
58
- for detection in detections:
59
  xmin, ymin, xmax, ymax, conf, class_id = detection
60
-
61
- # Update counts for each label
62
- label = model.names[int(class_id)]
63
- overall_counts[label] = overall_counts.get(label, 0) + 1
64
 
65
- # Draw the bounding box
66
  cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 0, 0), 2)
67
- # Draw the label and score
68
- cv2.putText(frame, f"{label}: {conf:.2f}", (int(xmin), int(ymin) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
69
 
70
- frames.append(frame)
71
 
72
- # Store the shape of the first valid frame
73
- if frame_shape is None:
74
- frame_shape = frame.shape[1], frame.shape[0]
75
 
76
- cap.release()
77
-
78
- if frame_shape is None: # Check if any frames were processed
79
- return None, None # Handle no frames case gracefully
80
 
81
- # Create a temporary output video file
82
- output_path = 'output.mp4'
83
- out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, frame_shape)
84
-
85
- for frame in frames:
86
  out.write(frame)
87
- out.release()
 
 
 
88
 
89
- # Create DataFrame for video results
90
  df = pd.DataFrame({
91
- 'label': list(overall_counts.keys()),
92
- 'counts': list(overall_counts.values())
 
93
  })
94
 
95
- return output_path, df # Return path to the output video and DataFrame
96
 
97
- # Create separate interfaces for images and videos
98
  image_interface = gr.Interface(
99
- fn=detect_and_draw_image,
100
- inputs=gr.Image(type="pil", label="Upload Image"),
101
- outputs=[gr.Image(type="pil"), gr.Dataframe(label="Object Counts")],
102
- title="Object Detection for Images",
103
- description="Upload an image to see the objects detected by YOLOv5 with bounding boxes and their counts."
104
  )
105
 
106
  video_interface = gr.Interface(
107
- fn=detect_and_draw_video,
108
- inputs=gr.Video(label="Upload Video"),
109
- outputs=[gr.Video(label="Processed Video"), gr.Dataframe(label="Object Counts")],
110
- title="Object Detection for Videos",
111
- description="Upload a video to see the objects detected by YOLOv5 with bounding boxes and their counts."
112
  )
113
 
114
- # Combine interfaces into a single app
115
  app = gr.TabbedInterface([image_interface, video_interface], ["Image Detection", "Video Detection"])
116
 
117
- # Launch the app
118
- app.launch(debug=True)
 
1
+ import cv2 # مكتبة للتعامل مع الفيديو والصور
2
+ import torch # مكتبة للتعلم العميق
3
+ from PIL import Image, ImageDraw # مكتبة لتحرير الصور
4
+ import gradio as gr # مكتبة لإنشاء واجهات تفاعلية
5
+ import pandas as pd # مكتبة للتعامل مع البيانات
6
+ from transformers import pipeline # مكتبة للترجمة
7
 
8
+ # تحميل نموذج YOLOv5 من مكتبة ultralytics
9
+ model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
10
 
11
+ # تحميل نموذج الترجمة من الإنجليزية إلى العربية
12
+ translator = pipeline("translation_en_to_ar", model="Helsinki-NLP/opus-mt-en-ar")
13
+
14
+ # دالة لاكتشاف الكائنات ورسم الإطارات في الصور
15
  def detect_and_draw_image(input_image):
16
+ results = model(input_image) # تنفيذ الكشف عن الكائنات
17
+ detections = results.xyxy[0].numpy() # الحصول على النتائج كـ مصفوفة NumPy
18
+
19
+ draw = ImageDraw.Draw(input_image) # إنشاء كائن للرسم على الصورة
20
+
21
+ counts = {} # قاموس لتخزين عدد الكائنات
22
+ for detection in detections: # معالجة كل كشف
23
+ xmin, ymin, xmax, ymax, conf, class_id = detection # استخراج معلومات الكشف
24
+ label = model.names[int(class_id)] # الحصول على اسم الكائن
25
+ counts[label] = counts.get(label, 0) + 1 # تحديث عدد الكائنات
26
+
27
+ draw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2) # رسم الإطار
28
+ draw.text((xmin, ymin), f"{label}: {conf:.2f}", fill="white") # كتابة التسمية والنسبة
29
+
30
+ # ترجمة التسميات إلى العربية
31
+ translated_labels = translator(list(counts.keys()))
32
+
33
+ # إنشاء DataFrame لتخزين النتائج
 
34
  df = pd.DataFrame({
35
+ 'Label (English)': list(counts.keys()),
36
+ 'Label (Arabic)': [t['translation_text'] for t in translated_labels],
37
+ 'Object Count': list(counts.values())
38
  })
39
 
40
+ return input_image, df # إرجاع الصورة المعدلة وDataFrame
41
 
42
+ # دالة لاكتشاف الكائنات ورسم الإطارات في الفيديو
43
  def detect_and_draw_video(video_path):
44
+ cap = cv2.VideoCapture(video_path) # فتح الفيديو
45
+ frames = [] # قائمة لتخزين الإطارات
46
+ overall_counts = {} # قاموس لتخزين عدد الكائنات الإجمالية
 
 
 
 
 
 
47
 
48
+ while cap.isOpened(): # معالجة كل إطار حتى نهاية الفيديو
49
+ ret, frame = cap.read() # قراءة الإطار
50
+ if not ret: # إذا لم يتم قراءة الإطار، الخروج من الحلقة
51
+ break
52
 
53
+ frame = cv2.resize(frame, (640, 480)) # تغيير حجم الإطار لتسهيل المعالجة
54
+ results = model(frame) # تنفيذ الكشف عن الكائنات
55
+ detections = results.xyxy[0].numpy() # الحصول على النتائج
56
 
57
+ for detection in detections: # معالجة كل كشف
58
  xmin, ymin, xmax, ymax, conf, class_id = detection
59
+ label = model.names[int(class_id)] # الحصول على اسم الكائن
60
+ overall_counts[label] = overall_counts.get(label, 0) + 1 # تحديث عدد الكائنات
 
 
61
 
62
+ # رسم الإطار والنص على الفيديو
63
  cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 0, 0), 2)
64
+ cv2.putText(frame, f"{label}: {conf:.2f}", (int(xmin), int(ymin) - 10),
65
+ cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
66
 
67
+ frames.append(frame) # إضافة الإطار إلى القائمة
68
 
69
+ cap.release() # إغلاق الفيديو
 
 
70
 
71
+ output_path = 'output.mp4' # مسار الفيديو الناتج
72
+ out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480)) # إنشاء كائن لكتابة الفيديو
 
 
73
 
74
+ for frame in frames: # كتابة الإطارات إلى ملف الفيديو
 
 
 
 
75
  out.write(frame)
76
+ out.release() # إغلاق ملف الفيديو
77
+
78
+ # ترجمة التسميات إلى العربية
79
+ translated_labels = translator(list(overall_counts.keys()))
80
 
81
+ # إنشاء DataFrame لتخزين النتائج
82
  df = pd.DataFrame({
83
+ 'Label (English)': list(overall_counts.keys()),
84
+ 'Label (Arabic)': [t['translation_text'] for t in translated_labels],
85
+ 'Object Count': list(overall_counts.values())
86
  })
87
 
88
+ return output_path, df # إرجاع مسار الفيديو وDataFrame
89
 
90
+ # إنشاء واجهات لتطبيق Gradio
91
  image_interface = gr.Interface(
92
+ fn=detect_and_draw_image, # الدالة الخاصة بمعالجة الصور
93
+ inputs=gr.Image(type="pil", label="Upload Image"), # إدخال صورة
94
+ outputs=[gr.Image(type="pil"), gr.Dataframe(label="Object Counts")], # إخراج الصورة وDataFrame
95
+ title="Object Detection for Images", # عنوان الواجهة
96
+ description="Upload an image to see the objects detected by YOLOv5 with bounding boxes and their counts." # وصف الواجهة
97
  )
98
 
99
  video_interface = gr.Interface(
100
+ fn=detect_and_draw_video, # الدالة الخاصة بمعالجة الفيديو
101
+ inputs=gr.Video(label="Upload Video"), # إدخال فيديو
102
+ outputs=[gr.Video(label="Processed Video"), gr.Dataframe(label="Object Counts")], # إخراج الفيديو وDataFrame
103
+ title="Object Detection for Videos", # عنوان الواجهة
104
+ description="Upload a video to see the objects detected by YOLOv5 with bounding boxes and their counts." # وصف الواجهة
105
  )
106
 
107
+ # دمج الواجهات في تطبيق واحد
108
  app = gr.TabbedInterface([image_interface, video_interface], ["Image Detection", "Video Detection"])
109
 
110
+ # تشغيل التطبيق
111
+ app.launch(debug=True) # إطلاق التطبيق مع تمكين وضع التصحيح