Ashegh-Sad-Warrior commited on
Commit
b3ce94e
1 Parent(s): c664168

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -62
app.py CHANGED
@@ -3,7 +3,7 @@
3
 
4
  import cv2
5
  from ultralytics import YOLO
6
- from PIL import Image, ImageDraw
7
  import gradio as gr
8
  import pandas as pd
9
  import numpy as np
@@ -11,7 +11,7 @@ import tempfile
11
  import os
12
 
13
  # بارگذاری مدل آموزش‌دیده شما
14
- # اطمینان حاصل کنید که فقط یک بار مدل را بارگذاری می‌کنید و مسیر صحیح است
15
  model = YOLO('weights/best.pt') # یا '/content/best.pt' بر اساس مدل مورد نظر شما
16
 
17
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
@@ -33,7 +33,7 @@ class_names = {
33
  14: ('swimming pool', 'استخر شنا')
34
  }
35
 
36
- # رنگ‌ها برای هر کلاس
37
  colors = {
38
  0: (255, 0, 0), # قرمز
39
  1: (0, 255, 0), # سبز
@@ -55,17 +55,17 @@ colors = {
55
  # تابع برای تشخیص اشیاء در تصاویر
56
  def detect_and_draw_image(input_image):
57
  try:
58
- # تبدیل تصویر PIL به آرایه NumPy
59
  input_image_np = np.array(input_image)
60
 
61
  # اجرای مدل روی تصویر
62
  results = model.predict(source=input_image_np, conf=0.3)
63
 
64
  # دسترسی به نتایج OBB
65
- obb_results = results[0].boxes # یا results[0].obb بر اساس نسخه مدل شما
66
 
67
  # بررسی وجود جعبه‌های شناسایی شده
68
- if obb_results is None or len(obb_results) == 0:
69
  print("هیچ شیء شناسایی نشده است.")
70
  df = pd.DataFrame({
71
  'Label (English)': [],
@@ -74,37 +74,31 @@ def detect_and_draw_image(input_image):
74
  })
75
  return input_image, df
76
 
77
- # بارگذاری تصویر اصلی به صورت OpenCV برای رسم جعبه‌ها
78
  image_cv = cv2.cvtColor(input_image_np, cv2.COLOR_RGB2BGR)
79
 
80
  counts = {}
81
- for box in obb_results:
82
- # دریافت مختصات جعبه
83
- x_center, y_center, width, height, rotation = box.xywhn.tolist()[0]
84
- class_id = int(box.cls.tolist()[0])
85
- confidence = float(box.conf.tolist()[0])
86
-
87
- # تبدیل مختصات از نرمال شده به پیکسل
88
- img_height, img_width, _ = image_cv.shape
89
- x_center *= img_width
90
- y_center *= img_height
91
- width *= img_width
92
- height *= img_height
93
-
94
- # دریافت برچسب‌ها
95
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
96
- counts[label_en] = counts.get(label_en, 0) + 1
97
 
98
  # رسم جعبه چرخان با استفاده از OpenCV
99
  rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
100
- box_points = cv2.boxPoints(rect)
101
- box_points = np.int0(box_points)
102
  color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
103
- cv2.drawContours(image_cv, [box_points], 0, color, 2)
 
 
 
104
  cv2.putText(image_cv, f'{label_en}: {confidence:.2f}',
105
  (int(x_center), int(y_center)),
106
  cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2, cv2.LINE_AA)
107
 
 
 
 
108
  # تبدیل تصویر به RGB برای Gradio
109
  image_rgb = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)
110
  output_image = Image.fromarray(image_rgb)
@@ -142,47 +136,38 @@ def detect_and_draw_video(video_path):
142
 
143
  # تغییر اندازه فریم
144
  frame = cv2.resize(frame, (640, 480))
 
 
 
 
145
  # اجرای مدل روی فریم
146
- results = model.predict(source=frame, conf=0.3)
147
- obb_results = results[0].boxes # یا results[0].obb بر اساس نسخه مدل شما
148
-
149
- if obb_results is not None and len(obb_results) > 0:
150
- for box in obb_results:
151
- # دریافت مختصات جعبه
152
- x_center, y_center, width, height, rotation = box.xywhn.tolist()[0]
153
- class_id = int(box.cls.tolist()[0])
154
- confidence = float(box.conf.tolist()[0])
155
-
156
- # تبدیل مختصات از نرمال شده به پیکسل
157
- img_height, img_width, _ = frame.shape
158
- x_center *= img_width
159
- y_center *= img_height
160
- width *= img_width
161
- height *= img_height
162
-
163
- # دریافت برچسب‌ها
164
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
165
- current_object = (label_en, int(x_center - width / 2), int(y_center - height / 2),
166
- int(x_center + width / 2), int(y_center + height / 2))
167
 
168
- # بررسی وجود شیء در لیست seen_objects
169
- if not any(existing[0] == label_en and
170
- (existing[1] < current_object[3] and existing[3] > current_object[1] and
171
- existing[2] < current_object[4] and existing[4] > current_object[2])
172
- for existing in seen_objects):
173
- seen_objects.append(current_object)
174
- overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
175
 
176
  # رسم جعبه چرخان با استفاده از OpenCV
177
  rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
178
- box_points = cv2.boxPoints(rect)
179
- box_points = np.int0(box_points)
180
  color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
181
- cv2.drawContours(frame, [box_points], 0, color, 2)
 
 
 
182
  cv2.putText(frame, f"{label_en}: {confidence:.2f}",
183
  (int(x_center), int(y_center)),
184
  cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
185
 
 
 
 
186
  frames.append(frame)
187
 
188
  cap.release()
@@ -215,24 +200,31 @@ def detect_and_draw_video(video_path):
215
  'Object Count': []
216
  })
217
 
218
- # رابط کاربری تصویر
219
  image_interface = gr.Interface(
220
  fn=detect_and_draw_image,
221
  inputs=gr.Image(type="pil", label="بارگذاری تصویر"),
222
- outputs=[gr.Image(type="pil"), gr.Dataframe(label="تعداد اشیاء")],
223
  title="تشخیص اشیاء در تصاویر هوایی",
224
  description="یک تصویر هوایی بارگذاری کنید تا اشیاء شناسایی شده و تعداد آن‌ها را ببینید.",
225
- examples=['Examples/images/areial_car.jpg', 'Examples/images/arieal_car_1.jpg','Examples/images/t.jpg']
 
 
 
 
226
  )
227
 
228
- # رابط کاربری ویدئو
229
  video_interface = gr.Interface(
230
  fn=detect_and_draw_video,
231
  inputs=gr.Video(label="بارگذاری ویدئو"),
232
  outputs=[gr.Video(label="ویدئوی پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
233
  title="تشخیص اشیاء در ویدئوها",
234
  description="یک ویدئو بارگذاری کنید تا اشیاء شناسایی شده و تعداد آن‌ها را ببینید.",
235
- examples=['Examples/video/city.mp4', 'Examples/video/airplane.mp4']
 
 
 
236
  )
237
 
238
  # اجرای برنامه با استفاده از رابط کاربری تب‌دار
 
3
 
4
  import cv2
5
  from ultralytics import YOLO
6
+ from PIL import Image
7
  import gradio as gr
8
  import pandas as pd
9
  import numpy as np
 
11
  import os
12
 
13
  # بارگذاری مدل آموزش‌دیده شما
14
+ # اطمینان حاصل کنید که مسیر مدل صحیح است
15
  model = YOLO('weights/best.pt') # یا '/content/best.pt' بر اساس مدل مورد نظر شما
16
 
17
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
 
33
  14: ('swimming pool', 'استخر شنا')
34
  }
35
 
36
+ # رنگ‌ها برای هر کلاس (BGR برای OpenCV)
37
  colors = {
38
  0: (255, 0, 0), # قرمز
39
  1: (0, 255, 0), # سبز
 
55
  # تابع برای تشخیص اشیاء در تصاویر
56
  def detect_and_draw_image(input_image):
57
  try:
58
+ # تبدیل تصویر PIL به آرایه NumPy (RGB)
59
  input_image_np = np.array(input_image)
60
 
61
  # اجرای مدل روی تصویر
62
  results = model.predict(source=input_image_np, conf=0.3)
63
 
64
  # دسترسی به نتایج OBB
65
+ obb_results = results[0].obb
66
 
67
  # بررسی وجود جعبه‌های شناسایی شده
68
+ if obb_results is None or len(obb_results.data) == 0:
69
  print("هیچ شیء شناسایی نشده است.")
70
  df = pd.DataFrame({
71
  'Label (English)': [],
 
74
  })
75
  return input_image, df
76
 
77
+ # بارگذاری تصویر اصلی به صورت OpenCV برای رسم جعبه‌ها (BGR)
78
  image_cv = cv2.cvtColor(input_image_np, cv2.COLOR_RGB2BGR)
79
 
80
  counts = {}
81
+ for obb, conf, cls in zip(obb_results.data.cpu().numpy(), obb_results.conf.cpu().numpy(), obb_results.cls.cpu().numpy()):
82
+ x_center, y_center, width, height, rotation = obb[:5]
83
+ class_id = int(cls)
84
+ confidence = float(conf)
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
  # رسم جعبه چرخان با استفاده از OpenCV
87
  rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
88
+ box = cv2.boxPoints(rect)
89
+ box = np.int0(box)
90
  color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
91
+ cv2.drawContours(image_cv, [box], 0, color, 2)
92
+
93
+ # رسم برچسب
94
+ label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
95
  cv2.putText(image_cv, f'{label_en}: {confidence:.2f}',
96
  (int(x_center), int(y_center)),
97
  cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2, cv2.LINE_AA)
98
 
99
+ # شمارش اشیاء
100
+ counts[label_en] = counts.get(label_en, 0) + 1
101
+
102
  # تبدیل تصویر به RGB برای Gradio
103
  image_rgb = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)
104
  output_image = Image.fromarray(image_rgb)
 
136
 
137
  # تغییر اندازه فریم
138
  frame = cv2.resize(frame, (640, 480))
139
+
140
+ # تبدیل BGR به RGB برای مدل
141
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
142
+
143
  # اجرای مدل روی فریم
144
+ results = model.predict(source=frame_rgb, conf=0.3)
145
+
146
+ # دسترسی به نتایج OBB
147
+ obb_results = results[0].obb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
149
+ if obb_results is not None and len(obb_results.data) > 0:
150
+ for obb, conf, cls in zip(obb_results.data.cpu().numpy(), obb_results.conf.cpu().numpy(), obb_results.cls.cpu().numpy()):
151
+ x_center, y_center, width, height, rotation = obb[:5]
152
+ class_id = int(cls)
153
+ confidence = float(conf)
 
 
154
 
155
  # رسم جعبه چرخان با استفاده از OpenCV
156
  rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
157
+ box = cv2.boxPoints(rect)
158
+ box = np.int0(box)
159
  color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
160
+ cv2.drawContours(frame, [box], 0, color, 2)
161
+
162
+ # رسم برچسب
163
+ label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
164
  cv2.putText(frame, f"{label_en}: {confidence:.2f}",
165
  (int(x_center), int(y_center)),
166
  cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
167
 
168
+ # شمارش اشیاء
169
+ overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
170
+
171
  frames.append(frame)
172
 
173
  cap.release()
 
200
  'Object Count': []
201
  })
202
 
203
+ # رابط کاربری Gradio برای تصاویر
204
  image_interface = gr.Interface(
205
  fn=detect_and_draw_image,
206
  inputs=gr.Image(type="pil", label="بارگذاری تصویر"),
207
+ outputs=[gr.Image(type="pil", label="تصویر پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
208
  title="تشخیص اشیاء در تصاویر هوایی",
209
  description="یک تصویر هوایی بارگذاری کنید تا اشیاء شناسایی شده و تعداد آن‌ها را ببینید.",
210
+ examples=[
211
+ 'Examples/images/areial_car.jpg',
212
+ 'Examples/images/arieal_car_1.jpg',
213
+ 'Examples/images/t.jpg'
214
+ ]
215
  )
216
 
217
+ # رابط کاربری Gradio برای ویدئوها
218
  video_interface = gr.Interface(
219
  fn=detect_and_draw_video,
220
  inputs=gr.Video(label="بارگذاری ویدئو"),
221
  outputs=[gr.Video(label="ویدئوی پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
222
  title="تشخیص اشیاء در ویدئوها",
223
  description="یک ویدئو بارگذاری کنید تا اشیاء شناسایی شده و تعداد آن‌ها را ببینید.",
224
+ examples=[
225
+ 'Examples/video/city.mp4',
226
+ 'Examples/video/airplane.mp4'
227
+ ]
228
  )
229
 
230
  # اجرای برنامه با استفاده از رابط کاربری تب‌دار