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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +82 -61
app.py CHANGED
@@ -1,13 +1,17 @@
 
 
 
1
  import cv2
2
- import matplotlib.pyplot as plt
3
- import numpy as np
4
  from ultralytics import YOLO
5
- from PIL import Image, ImageDraw, ImageFont
6
- import pandas as pd
7
  import gradio as gr
 
 
 
 
8
 
9
- # بارگذاری مدل
10
- model = YOLO('yolo11n-obb.pt') # مدل از پیش آموزش داده شده OBB را بارگذاری کنید
11
 
12
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
13
  class_names = {
@@ -30,21 +34,21 @@ class_names = {
30
 
31
  # رنگ‌ها برای هر کلاس
32
  colors = {
33
- 0: (255, 0, 0), # Red
34
- 1: (0, 255, 0), # Green
35
- 2: (0, 0, 255), # Blue
36
- 3: (255, 255, 0), # Yellow
37
- 4: (255, 0, 255), # Magenta
38
- 5: (0, 255, 255), # Cyan
39
- 6: (128, 0, 128), # Purple
40
- 7: (255, 165, 0), # Orange
41
- 8: (0, 128, 0), # Dark Green
42
- 9: (128, 128, 0), # Olive
43
- 10: (128, 0, 0), # Maroon
44
- 11: (0, 128, 128), # Teal
45
- 12: (0, 0, 128), # Navy
46
- 13: (75, 0, 130), # Indigo
47
- 14: (199, 21, 133) # MediumVioletRed
48
  }
49
 
50
  # تابع برای تشخیص اشیاء در تصاویر
@@ -52,10 +56,12 @@ def detect_and_draw_image(input_image):
52
  # تبدیل تصویر PIL به آرایه NumPy
53
  input_image_np = np.array(input_image)
54
 
55
- # اجرای مدل روی تصویر با سطح اطمینان پایین‌تر برای اطمینان از شناسایی بیشتر اشیاء
56
- results = model.predict(source=input_image_np, conf=0.3)
57
- if not results or not hasattr(results[0], 'boxes') or results[0].boxes is None:
58
- print("هیچ شیء شناسایی نشده است.")
 
 
59
  df = pd.DataFrame({
60
  'Label (English)': [],
61
  'Label (Persian)': [],
@@ -63,73 +69,88 @@ def detect_and_draw_image(input_image):
63
  })
64
  return input_image, df
65
 
66
- # بارگذاری تصویر اصلی به صورت OpenCV برای رسم جعبه‌ها
67
- image_np = np.array(input_image.convert('RGB'))[:, :, ::-1] # تبدیل PIL به OpenCV
68
 
 
 
 
69
  counts = {}
70
- for box in results[0].boxes:
71
- # دسترسی به مختصات جعبه و اطمینان
72
- xmin, ymin, xmax, ymax, conf, class_id = box.cpu().numpy()
73
- class_id = int(class_id)
74
- confidence = float(conf)
75
 
76
- # دریافت برچسب‌های انگلیسی و فارسی
77
  label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
78
  counts[label_en] = counts.get(label_en, 0) + 1
79
 
80
- # رسم مستطیل با استفاده از OpenCV
81
- color = colors.get(class_id, (0, 255, 0)) # استفاده از رنگ مشخص برای هر کلاس
82
- cv2.rectangle(image_np, (int(xmin), int(ymin)), (int(xmax), int(ymax)), color, 2)
83
- cv2.putText(image_np, f'{label_en}: {confidence:.2f}', (int(xmin), int(ymin) - 10),
84
- cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1, cv2.LINE_AA)
85
 
86
- # تبدیل تصویر به RGB برای Gradio
87
- image_rgb = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
88
- output_image = Image.fromarray(image_rgb)
89
-
90
- # ایجاد DataFrame برای نمایش نتایج
91
  df = pd.DataFrame({
92
  'Label (English)': list(counts.keys()),
93
  'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
94
  'Object Count': list(counts.values())
95
  })
96
 
97
- return output_image, df
98
 
99
  # تابع برای تشخیص اشیاء در ویدئوها
100
  def detect_and_draw_video(video_path):
101
  cap = cv2.VideoCapture(video_path)
102
  frames = []
103
  overall_counts = {}
 
104
 
105
  while cap.isOpened():
106
  ret, frame = cap.read()
107
  if not ret:
108
  break
109
 
 
110
  frame = cv2.resize(frame, (640, 480))
111
- results = model.predict(source=frame, conf=0.3)
112
- if not results or not hasattr(results[0], 'boxes') or results[0].boxes is None:
113
- continue
114
-
115
- for box in results[0].boxes:
116
- xmin, ymin, xmax, ymax, conf, class_id = box.cpu().numpy()
117
- class_id = int(class_id)
118
- confidence = float(conf)
119
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
120
- overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
121
-
122
- # رسم مستطیل و نام شیء بر روی فریم
123
- color = colors.get(class_id, (0, 255, 0))
124
- cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), color, 2)
125
- cv2.putText(frame, f'{label_en}: {confidence:.2f}', (int(xmin), int(ymin) - 10),
126
- cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
 
 
 
 
 
 
 
 
 
 
 
 
 
127
 
128
  frames.append(frame)
129
 
130
  cap.release()
131
 
132
- output_path = 'output.mp4'
 
 
 
133
  out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480))
134
 
135
  for frame in frames:
 
1
+ # !pip install ultralytics
2
+ # !pip install gradio
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
10
+ import tempfile
11
+ import os
12
 
13
+ # بارگذاری مدل آموزش‌دیده شما
14
+ model = YOLO('/content/yolo11n-obb.pt') # اطمینان حاصل کنید که مسیر مدل صحیح است
15
 
16
  # تعریف نام کلاس‌ها به انگلیسی و فارسی
17
  class_names = {
 
34
 
35
  # رنگ‌ها برای هر کلاس
36
  colors = {
37
+ 0: (255, 0, 0), # قرمز
38
+ 1: (0, 255, 0), # سبز
39
+ 2: (0, 0, 255), # آبی
40
+ 3: (255, 255, 0), # زرد
41
+ 4: (255, 0, 255), # مجنتا
42
+ 5: (0, 255, 255), # فیروزه‌ای
43
+ 6: (128, 0, 128), # بنفش
44
+ 7: (255, 165, 0), # نارنجی
45
+ 8: (0, 128, 0), # سبز تیره
46
+ 9: (128, 128, 0), # زیتونی
47
+ 10: (128, 0, 0), # سرخ کلید
48
+ 11: (0, 128, 128), # سبز نفتی
49
+ 12: (0, 0, 128), # نیوی
50
+ 13: (75, 0, 130), # ایندیگو
51
+ 14: (199, 21, 133) # رز متوسط
52
  }
53
 
54
  # تابع برای تشخیص اشیاء در تصاویر
 
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
  })
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: