File size: 9,643 Bytes
0cea595 c2ce217 b3ce94e addcb32 0cea595 c2ce217 0cea595 b3ce94e c664168 c2ce217 b3ce94e 588649f 0cea595 588649f c2ce217 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 c2ce217 4925567 0cea595 4925567 c1832e6 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 b3ce94e 4925567 c1832e6 b3ce94e c2ce217 b3ce94e c2ce217 b3ce94e 11150d6 b3ce94e c1832e6 b3ce94e c1832e6 079b30d |
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
# !pip install ultralytics
# !pip install gradio
import cv2
from ultralytics import YOLO
from PIL import Image
import gradio as gr
import pandas as pd
import numpy as np
import tempfile
import os
# بارگذاری مدل آموزشدیده شما
# اطمینان حاصل کنید که مسیر مدل صحیح است
model = YOLO('weights/best.pt') # یا '/content/best.pt' بر اساس مدل مورد نظر شما
# تعریف نام کلاسها به انگلیسی و فارسی
class_names = {
0: ('plane', 'هواپیما'),
1: ('ship', 'کشتی'),
2: ('storage tank', 'مخزن ذخیره'),
3: ('baseball diamond', 'زمین بیسبال'),
4: ('tennis court', 'زمین تنیس'),
5: ('basketball court', 'زمین بسکتبال'),
6: ('ground track field', 'زمین دو و میدانی'),
7: ('harbor', 'بندرگاه'),
8: ('bridge', 'پل'),
9: ('large vehicle', 'خودرو بزرگ'),
10: ('small vehicle', 'خودرو کوچک'),
11: ('helicopter', 'هلیکوپتر'),
12: ('roundabout', 'میدان'),
13: ('soccer ball field', 'زمین فوتبال'),
14: ('swimming pool', 'استخر شنا')
}
# رنگها برای هر کلاس (BGR برای OpenCV)
colors = {
0: (255, 0, 0), # قرمز
1: (0, 255, 0), # سبز
2: (0, 0, 255), # آبی
3: (255, 255, 0), # زرد
4: (255, 0, 255), # مجنتا
5: (0, 255, 255), # فیروزهای
6: (128, 0, 128), # بنفش
7: (255, 165, 0), # نارنجی
8: (0, 128, 0), # سبز تیره
9: (128, 128, 0), # زیتونی
10: (128, 0, 0), # سرخ کلید
11: (0, 128, 128), # سبز نفتی
12: (0, 0, 128), # نیوی
13: (75, 0, 130), # ایندیگو
14: (199, 21, 133) # رز متوسط
}
# تابع برای تشخیص اشیاء در تصاویر
def detect_and_draw_image(input_image):
try:
# تبدیل تصویر PIL به آرایه NumPy (RGB)
input_image_np = np.array(input_image)
# اجرای مدل روی تصویر
results = model.predict(source=input_image_np, conf=0.3)
# دسترسی به نتایج OBB
obb_results = results[0].obb
# بررسی وجود جعبههای شناسایی شده
if obb_results is None or len(obb_results.data) == 0:
print("هیچ شیء شناسایی نشده است.")
df = pd.DataFrame({
'Label (English)': [],
'Label (Persian)': [],
'Object Count': []
})
return input_image, df
# بارگذاری تصویر اصلی به صورت OpenCV برای رسم جعبهها (BGR)
image_cv = cv2.cvtColor(input_image_np, cv2.COLOR_RGB2BGR)
counts = {}
for obb, conf, cls in zip(obb_results.data.cpu().numpy(), obb_results.conf.cpu().numpy(), obb_results.cls.cpu().numpy()):
x_center, y_center, width, height, rotation = obb[:5]
class_id = int(cls)
confidence = float(conf)
# رسم جعبه چرخان با استفاده از OpenCV
rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
box = cv2.boxPoints(rect)
box = np.int0(box)
color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
cv2.drawContours(image_cv, [box], 0, color, 2)
# رسم برچسب
label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
cv2.putText(image_cv, f'{label_en}: {confidence:.2f}',
(int(x_center), int(y_center)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2, cv2.LINE_AA)
# شمارش اشیاء
counts[label_en] = counts.get(label_en, 0) + 1
# تبدیل تصویر به RGB برای Gradio
image_rgb = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB)
output_image = Image.fromarray(image_rgb)
# ایجاد DataFrame برای نمایش نتایج
df = pd.DataFrame({
'Label (English)': list(counts.keys()),
'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
'Object Count': list(counts.values())
})
return output_image, df
except Exception as e:
print(f"Error in detect_and_draw_image: {e}")
df = pd.DataFrame({
'Label (English)': [],
'Label (Persian)': [],
'Object Count': []
})
return input_image, df
# تابع برای تشخیص اشیاء در ویدئوها
def detect_and_draw_video(video_path):
try:
cap = cv2.VideoCapture(video_path)
frames = []
overall_counts = {}
seen_objects = [] # لیست برای دنبال کردن اشیاء شناسایی شده
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# تغییر اندازه فریم
frame = cv2.resize(frame, (640, 480))
# تبدیل BGR به RGB برای مدل
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# اجرای مدل روی فریم
results = model.predict(source=frame_rgb, conf=0.3)
# دسترسی به نتایج OBB
obb_results = results[0].obb
if obb_results is not None and len(obb_results.data) > 0:
for obb, conf, cls in zip(obb_results.data.cpu().numpy(), obb_results.conf.cpu().numpy(), obb_results.cls.cpu().numpy()):
x_center, y_center, width, height, rotation = obb[:5]
class_id = int(cls)
confidence = float(conf)
# رسم جعبه چرخان با استفاده از OpenCV
rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
box = cv2.boxPoints(rect)
box = np.int0(box)
color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
cv2.drawContours(frame, [box], 0, color, 2)
# رسم برچسب
label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
cv2.putText(frame, f"{label_en}: {confidence:.2f}",
(int(x_center), int(y_center)),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
# شمارش اشیاء
overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
frames.append(frame)
cap.release()
# ذخیره ویدئو پردازششده در یک فایل موقت
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as tmpfile:
output_path = tmpfile.name
out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480))
for frame in frames:
out.write(frame)
out.release()
# ایجاد DataFrame برای ذخیره نتایج
df = pd.DataFrame({
'Label (English)': list(overall_counts.keys()),
'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in overall_counts.keys()],
'Object Count': list(overall_counts.values())
})
return output_path, df
except Exception as e:
print(f"Error in detect_and_draw_video: {e}")
# در صورت بروز خطا، بازگرداندن ویدئوی اصلی بدون تغییر و یک DataFrame خالی
return video_path, pd.DataFrame({
'Label (English)': [],
'Label (Persian)': [],
'Object Count': []
})
# رابط کاربری Gradio برای تصاویر
image_interface = gr.Interface(
fn=detect_and_draw_image,
inputs=gr.Image(type="pil", label="بارگذاری تصویر"),
outputs=[gr.Image(type="pil", label="تصویر پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
title="تشخیص اشیاء در تصاویر هوایی",
description="یک تصویر هوایی بارگذاری کنید تا اشیاء شناسایی شده و تعداد آنها را ببینید.",
examples=[
'Examples/images/areial_car.jpg',
'Examples/images/arieal_car_1.jpg',
'Examples/images/t.jpg'
]
)
# رابط کاربری Gradio برای ویدئوها
video_interface = gr.Interface(
fn=detect_and_draw_video,
inputs=gr.Video(label="بارگذاری ویدئو"),
outputs=[gr.Video(label="ویدئوی پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
title="تشخیص اشیاء در ویدئوها",
description="یک ویدئو بارگذاری کنید تا اشیاء شناسایی شده و تعداد آنها را ببینید.",
examples=[
'Examples/video/city.mp4',
'Examples/video/airplane.mp4'
]
)
# اجرای برنامه با استفاده از رابط کاربری تبدار
app = gr.TabbedInterface([image_interface, video_interface], ["تشخیص تصویر", "تشخیص ویدئو"])
app.launch(debug=True, share=True)
|