Ashegh-Sad-Warrior commited on
Commit
4925567
1 Parent(s): 0cea595

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -102
app.py CHANGED
@@ -11,7 +11,8 @@ import tempfile
11
  import os
12
 
13
  # بارگذاری مدل آموزش‌دیده شما
14
- model = YOLO('/content/yolo11n-obb.pt') # اطمینان حاصل کنید که مسیر مدل صحیح است
 
15
 
16
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
17
  class_names = {
@@ -53,15 +54,72 @@ colors = {
53
 
54
  # تابع برای تشخیص اشیاء در تصاویر
55
  def detect_and_draw_image(input_image):
56
- # تبدیل تصویر PIL به آرایه NumPy
57
- input_image_np = np.array(input_image)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
- # اجرای مدل روی تصویر
60
- results = model(input_image_np)
61
 
62
- # بررسی کردن اینکه آیا اشیاء شناسایی شده اند یا خیر
63
- if not results or not results[0].boxes:
64
- # اگر هیچ شیء شناسایی نشده باشد
65
  df = pd.DataFrame({
66
  'Label (English)': [],
67
  'Label (Persian)': [],
@@ -69,102 +127,93 @@ def detect_and_draw_image(input_image):
69
  })
70
  return input_image, df
71
 
72
- detections = results[0].boxes # دسترسی به نتایج در YOLOv8
73
-
74
- # تبدیل تصویر به RGB برای رسم
75
- image_draw = input_image.convert("RGB")
76
- draw = ImageDraw.Draw(image_draw)
77
- counts = {}
78
- for box in detections:
79
- # دریافت مختصات جعبه
80
- xmin, ymin, xmax, ymax = box.xyxy.tolist()
81
- conf = box.conf.tolist()[0]
82
- class_id = int(box.cls.tolist()[0])
83
-
84
- # دریافت برچسب‌ها
85
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
86
- counts[label_en] = counts.get(label_en, 0) + 1
87
-
88
- # رسم مستطیل
89
- draw.rectangle([(xmin, ymin), (xmax, ymax)], outline=colors.get(class_id, (255,0,0)), width=2)
90
- # رسم برچسب
91
- draw.text((xmin, ymin), f"{label_en}: {conf:.2f}", fill="white")
92
-
93
- # ایجاد DataFrame
94
- df = pd.DataFrame({
95
- 'Label (English)': list(counts.keys()),
96
- 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
97
- 'Object Count': list(counts.values())
98
- })
99
-
100
- return image_draw, df
101
-
102
  # تابع برای تشخیص اشیاء در ویدئوها
103
  def detect_and_draw_video(video_path):
104
- cap = cv2.VideoCapture(video_path)
105
- frames = []
106
- overall_counts = {}
107
- seen_objects = [] # لیست برای دنبال کردن اشیاء شناسایی شده
108
-
109
- while cap.isOpened():
110
- ret, frame = cap.read()
111
- if not ret:
112
- break
113
-
114
- # تغییر اندازه فریم
115
- frame = cv2.resize(frame, (640, 480))
116
- # تبدیل رنگ از BGR به RGB
117
- frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
118
-
119
- # اجرای مدل روی فریم
120
- results = model(frame_rgb)
121
-
122
- if results and results[0].boxes:
123
- detections = results[0].boxes
124
- for box in detections:
125
- # دریافت مختصات جعبه
126
- xmin, ymin, xmax, ymax = box.xyxy.tolist()
127
- conf = box.conf.tolist()[0]
128
- class_id = int(box.cls.tolist()[0])
129
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
130
- current_object = (label_en, int(xmin), int(ymin), int(xmax), int(ymax))
131
-
132
- # بررسی وجود شیء در لیست seen_objects
133
- if not any(existing[0] == label_en and
134
- (existing[1] < current_object[3] and existing[3] > current_object[1] and
135
- existing[2] < current_object[4] and existing[4] > current_object[2]) for existing in seen_objects):
136
- seen_objects.append(current_object)
137
- overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
138
-
139
- # رسم مستطیل
140
- color = colors.get(class_id, (255, 0, 0))
141
- cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), color, 2)
142
- # رسم برچسب
143
- cv2.putText(frame, f"{label_en}: {conf:.2f}", (int(xmin), int(ymin) - 10),
144
- cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
145
-
146
- frames.append(frame)
147
-
148
- cap.release()
149
-
150
- # ذخیره ویدئو پردازش‌شده در یک فایل موقت
151
- with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as tmpfile:
152
- output_path = tmpfile.name
153
-
154
- out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480))
155
-
156
- for frame in frames:
157
- out.write(frame)
158
- out.release()
159
-
160
- # ایجاد DataFrame برای ذخیره نتایج
161
- df = pd.DataFrame({
162
- 'Label (English)': list(overall_counts.keys()),
163
- 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in overall_counts.keys()],
164
- 'Object Count': list(overall_counts.values())
165
- })
166
-
167
- return output_path, df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
 
169
  # رابط کاربری تصویر
170
  image_interface = gr.Interface(
 
11
  import os
12
 
13
  # بارگذاری مدل آموزش‌دیده شما
14
+ # اطمینان حاصل کنید که فقط یک بار مدل را بارگذاری می‌کنید و مسیر صحیح است
15
+ model = YOLO('/content/yolo11n-obb.pt') # یا '/content/best.pt' بر اساس مدل مورد نظر شما
16
 
17
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
18
  class_names = {
 
54
 
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)': [],
72
+ 'Label (Persian)': [],
73
+ 'Object Count': []
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)
111
+
112
+ # ایجاد DataFrame برای نمایش نتایج
113
+ df = pd.DataFrame({
114
+ 'Label (English)': list(counts.keys()),
115
+ 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
116
+ 'Object Count': list(counts.values())
117
+ })
118
 
119
+ return output_image, df
 
120
 
121
+ except Exception as e:
122
+ print(f"Error in detect_and_draw_image: {e}")
 
123
  df = pd.DataFrame({
124
  'Label (English)': [],
125
  'Label (Persian)': [],
 
127
  })
128
  return input_image, df
129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  # تابع برای تشخیص اشیاء در ویدئوها
131
  def detect_and_draw_video(video_path):
132
+ try:
133
+ cap = cv2.VideoCapture(video_path)
134
+ frames = []
135
+ overall_counts = {}
136
+ seen_objects = [] # لیست برای دنبال کردن اشیاء شناسایی شده
137
+
138
+ while cap.isOpened():
139
+ ret, frame = cap.read()
140
+ if not ret:
141
+ break
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()
189
+
190
+ # ذخیره ویدئو پردازش‌شده در یک فایل موقت
191
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as tmpfile:
192
+ output_path = tmpfile.name
193
+
194
+ out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480))
195
+
196
+ for frame in frames:
197
+ out.write(frame)
198
+ out.release()
199
+
200
+ # ایجاد DataFrame برای ذخیره نتایج
201
+ df = pd.DataFrame({
202
+ 'Label (English)': list(overall_counts.keys()),
203
+ 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in overall_counts.keys()],
204
+ 'Object Count': list(overall_counts.values())
205
+ })
206
+
207
+ return output_path, df
208
+
209
+ except Exception as e:
210
+ print(f"Error in detect_and_draw_video: {e}")
211
+ # در صورت بروز خطا، بازگرداندن ویدئوی اصلی بدون تغییر و یک DataFrame خالی
212
+ return video_path, pd.DataFrame({
213
+ 'Label (English)': [],
214
+ 'Label (Persian)': [],
215
+ 'Object Count': []
216
+ })
217
 
218
  # رابط کاربری تصویر
219
  image_interface = gr.Interface(