Ashegh-Sad-Warrior commited on
Commit
32f2aee
1 Parent(s): 3874dba

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +120 -29
app.py CHANGED
@@ -1,6 +1,6 @@
1
  import cv2
2
  from ultralytics import YOLO
3
- from PIL import Image
4
  import gradio as gr
5
  import pandas as pd
6
  import numpy as np
@@ -32,40 +32,121 @@ def detect_and_draw_image(input_image):
32
  # تبدیل تصویر PIL به آرایه NumPy
33
  input_image_np = np.array(input_image)
34
 
35
- # اجرای مدل روی تصویر با تنظیمات اطمینان و iou پایین‌تر
36
- results = model.predict(source=input_image_np, conf=0.1, iou=0.4)
37
-
38
- # بررسی وجود اشیاء شناسایی شده
39
- if results and results[0].boxes is not None:
40
- # دریافت تصویر با نتایج رسم‌شده
41
- annotated_image = results[0].plot()
42
-
43
- # تبدیل تصویر به فرمت PIL برای نمایش در Gradio
44
- annotated_image_pil = Image.fromarray(annotated_image)
45
-
46
- # شمارش اشیاء شناسایی‌شده
47
- counts = {}
48
- for box in results[0].boxes:
49
- class_id = int(box.cls[0])
50
- label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
51
- counts[label_en] = counts.get(label_en, 0) + 1
52
-
53
- # ساخت DataFrame با نام‌ها و تعداد اشیاء
54
  df = pd.DataFrame({
55
- 'Label (English)': list(counts.keys()),
56
- 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
57
- 'Object Count': list(counts.values())
58
  })
59
- else:
60
- # اگر هیچ شیء شناسایی نشده باشد، بازگرداندن تصویر اصلی و DataFrame خالی
61
- annotated_image_pil = input_image
 
 
 
62
  df = pd.DataFrame({
63
  'Label (English)': [],
64
  'Label (Persian)': [],
65
  'Object Count': []
66
  })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
- return annotated_image_pil, df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
  # رابط کاربری تصویر
71
  image_interface = gr.Interface(
@@ -77,6 +158,16 @@ image_interface = gr.Interface(
77
  examples=['Examples/images/areial_car.jpg', 'Examples/images/arieal_car_1.jpg','Examples/images/t.jpg']
78
  )
79
 
80
- # اجرای برنامه
81
- app = gr.Interface(fn=detect_and_draw_image, inputs=gr.Image(type="pil"), outputs=[gr.Image(type="pil"), gr.Dataframe()])
 
 
 
 
 
 
 
 
 
 
82
  app.launch(debug=True, share=True)
 
1
  import cv2
2
  from ultralytics import YOLO
3
+ from PIL import Image, ImageDraw, ImageFont
4
  import gradio as gr
5
  import pandas as pd
6
  import numpy as np
 
32
  # تبدیل تصویر PIL به آرایه NumPy
33
  input_image_np = np.array(input_image)
34
 
35
+ # اجرای مدل روی تصویر با سطح اطمینان پایین‌تر برای اطمینان از شناسایی بیشتر اشیاء
36
+ results = model(input_image_np, conf=0.25)
37
+
38
+ # بررسی تعداد نتایج
39
+ if not results:
40
+ print("مدل هیچ نتیجه‌ای برنگرداند.")
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  df = pd.DataFrame({
42
+ 'Label (English)': [],
43
+ 'Label (Persian)': [],
44
+ 'Object Count': []
45
  })
46
+ return input_image, df
47
+
48
+ # بررسی وجود جعبه‌های شناسایی شده
49
+ detections = results[0].boxes
50
+ if detections is None or len(detections) == 0:
51
+ print("هیچ شیء شناسایی نشده است.")
52
  df = pd.DataFrame({
53
  'Label (English)': [],
54
  'Label (Persian)': [],
55
  'Object Count': []
56
  })
57
+ return input_image, df
58
+
59
+ print(f"تعداد اشیاء شناسایی‌شده: {len(detections)}")
60
+
61
+ # تبدیل تصویر به PIL برای رسم
62
+ draw = ImageDraw.Draw(input_image)
63
+ # بارگذاری یک فونت برای نوشتن متن
64
+ try:
65
+ font = ImageFont.truetype("arial.ttf", size=15)
66
+ except IOError:
67
+ font = ImageFont.load_default()
68
+
69
+ counts = {}
70
+ for box in detections:
71
+ # دسترسی به مختصات جعبه و اطمینان
72
+ xmin, ymin, xmax, ymax = box.xyxy[0].tolist()
73
+ conf = box.conf[0].item()
74
+ class_id = int(box.cls[0].item())
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
+ # رسم مستطیل
81
+ draw.rectangle([(xmin, ymin), (xmax, ymax)], outline="red", width=2)
82
+ # نوشتن برچسب و اطمینان
83
+ draw.text((xmin, ymin - 10), f"{label_en}: {conf:.2f}", fill="red", font=font)
84
+
85
+ # ایجاد DataFrame برای نمایش نتایج
86
+ df = pd.DataFrame({
87
+ 'Label (English)': list(counts.keys()),
88
+ 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in counts.keys()],
89
+ 'Object Count': list(counts.values())
90
+ })
91
+
92
+ return input_image, df
93
+
94
+ # تابع برای تشخیص اشیاء در ویدئوها
95
+ def detect_and_draw_video(video_path):
96
+ cap = cv2.VideoCapture(video_path)
97
+ frames = []
98
+ overall_counts = {}
99
+ seen_objects = [] # لیست برای دنبال کردن اشیاء شناسایی شده
100
 
101
+ while cap.isOpened():
102
+ ret, frame = cap.read()
103
+ if not ret:
104
+ break
105
+
106
+ frame = cv2.resize(frame, (640, 480))
107
+ results = model(frame, conf=0.25)
108
+
109
+ detections = results[0].boxes
110
+
111
+ if detections is not None and len(detections) > 0:
112
+ for box in detections:
113
+ xmin, ymin, xmax, ymax = box.xyxy[0].tolist()
114
+ conf = box.conf[0].item()
115
+ class_id = int(box.cls[0].item())
116
+ label_en, label_fa = class_names.get(class_id, ('unknown', 'ناشناخته'))
117
+ current_object = (label_en, int(xmin), int(ymin), int(xmax), int(ymax))
118
+
119
+ # بررسی وجود شیء در لیست seen_objects
120
+ if not any(existing[0] == label_en and
121
+ (existing[1] < xmax and existing[3] > xmin and
122
+ existing[2] < ymax and existing[4] > ymin) for existing in seen_objects):
123
+ seen_objects.append(current_object)
124
+ overall_counts[label_en] = overall_counts.get(label_en, 0) + 1
125
+
126
+ # رسم مستطیل و نام شیء بر روی فریم
127
+ cv2.rectangle(frame, (int(xmin), int(ymin)), (int(xmax), int(ymax)), (255, 0, 0), 2)
128
+ cv2.putText(frame, f"{label_en}: {conf:.2f}", (int(xmin), int(ymin) - 10),
129
+ cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
130
+
131
+ frames.append(frame)
132
+
133
+ cap.release()
134
+
135
+ output_path = 'output.mp4'
136
+ out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), 20.0, (640, 480))
137
+
138
+ for frame in frames:
139
+ out.write(frame)
140
+ out.release()
141
+
142
+ # ایجاد DataFrame برای ذخیره نتایج
143
+ df = pd.DataFrame({
144
+ 'Label (English)': list(overall_counts.keys()),
145
+ 'Label (Persian)': [class_names.get(k, ('unknown', 'ناشناخته'))[1] for k in overall_counts.keys()],
146
+ 'Object Count': list(overall_counts.values())
147
+ })
148
+
149
+ return output_path, df
150
 
151
  # رابط کاربری تصویر
152
  image_interface = gr.Interface(
 
158
  examples=['Examples/images/areial_car.jpg', 'Examples/images/arieal_car_1.jpg','Examples/images/t.jpg']
159
  )
160
 
161
+ # رابط کاربری ویدئو
162
+ video_interface = gr.Interface(
163
+ fn=detect_and_draw_video,
164
+ inputs=gr.Video(label="بارگذاری ویدئو"),
165
+ outputs=[gr.Video(label="ویدئوی پردازش شده"), gr.Dataframe(label="تعداد اشیاء")],
166
+ title="تشخیص اشیاء در ویدئوها",
167
+ description="یک ویدئو بارگذاری کنید تا اشیاء شناسایی شده و تعداد آن‌ها را ببینید.",
168
+ examples=['Examples/video/city.mp4', 'Examples/video/airplane.mp4']
169
+ )
170
+
171
+ # اجرای برنامه با استفاده از رابط کاربری تب‌دار
172
+ app = gr.TabbedInterface([image_interface, video_interface], ["تشخیص تصویر", "تشخیص ویدئو"])
173
  app.launch(debug=True, share=True)