Ashegh-Sad-Warrior
commited on
Commit
•
b3ce94e
1
Parent(s):
c664168
Update app.py
Browse files
app.py
CHANGED
@@ -3,7 +3,7 @@
|
|
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,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].
|
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
|
82 |
-
|
83 |
-
|
84 |
-
|
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 |
-
|
101 |
-
|
102 |
color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
|
103 |
-
cv2.drawContours(image_cv, [
|
|
|
|
|
|
|
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=
|
147 |
-
|
148 |
-
|
149 |
-
|
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 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
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 |
-
|
179 |
-
|
180 |
color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
|
181 |
-
cv2.drawContours(frame, [
|
|
|
|
|
|
|
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=[
|
|
|
|
|
|
|
|
|
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=[
|
|
|
|
|
|
|
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 |
# اجرای برنامه با استفاده از رابط کاربری تبدار
|