File size: 3,857 Bytes
c2ce217 addcb32 c2ce217 32f2aee c2ce217 addcb32 c2ce217 addcb32 c2ce217 d507b48 c2ce217 32f2aee addcb32 32f2aee addcb32 32f2aee addcb32 32f2aee addcb32 32f2aee addcb32 32f2aee c2ce217 d507b48 11150d6 addcb32 |
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 |
import cv2
import matplotlib.pyplot as plt
import numpy as np
from ultralytics import YOLO
from PIL import Image, ImageDraw, ImageFont
import pandas as pd
import gradio as gr
# بارگذاری مدل
model = YOLO('yolo11n-obb.pt') # مدل از پیش آموزش داده شده OBB را بارگذاری کنید
# تعریف نام کلاسها به انگلیسی و فارسی
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', 'استخر شنا')
}
# تابع برای تشخیص اشیاء در تصاویر
def detect_and_draw_image(input_image):
# تبدیل تصویر PIL به آرایه NumPy
input_image_np = np.array(input_image)
# اجرای مدل روی تصویر با سطح اطمینان پایینتر برای اطمینان از شناسایی بیشتر اشیاء
results = model.predict(source=input_image_np, conf=0.3)
obb_results = results[0].obb
# تبدیل تصویر به PIL برای رسم
draw = ImageDraw.Draw(input_image)
# بارگذاری یک فونت برای نوشتن متن
try:
font = ImageFont.truetype("arial.ttf", size=15)
except IOError:
font = ImageFont.load_default()
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)
# دریافت برچسبهای انگلیسی و فارسی
label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
counts[label_en] = counts.get(label_en, 0) + 1
# رسم جعبه چرخان با استفاده از OpenCV
rect = ((x_center, y_center), (width, height), rotation * 180.0 / np.pi) # تبدیل رادیان به درجه
box = cv2.boxPoints(rect)
box = np.int0(box)
draw.polygon([tuple(point) for point in box], outline="red")
# نوشتن برچسب و اطمینان
draw.text((x_center, y_center - 10), f"{label_en}: {confidence:.2f}", fill="red", font=font)
# ایجاد 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 input_image, df
# رابط کاربری تصویر
image_interface = gr.Interface(
fn=detect_and_draw_image,
inputs=gr.Image(type="pil", label="بارگذاری تصویر"),
outputs=[gr.Image(type="pil"), gr.Dataframe(label="تعداد اشیاء")],
title="تشخیص اشیاء در تصاویر هوایی",
description="یک تصویر هوایی بارگذاری کنید تا اشیاء شناسایی شده و تعداد آنها را ببینید.",
examples=['Examples/images/areial_car.jpg', 'Examples/images/arieal_car_1.jpg','Examples/images/t.jpg']
)
# اجرای برنامه با استفاده از رابط کاربری
image_interface.launch(debug=True, share=True)
|