KlareKiste commited on
Commit
9eac079
·
verified ·
1 Parent(s): 18b8c83

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +120 -83
app.py CHANGED
@@ -2,52 +2,52 @@ import os, time, json
2
  import numpy as np
3
  import gradio as gr
4
  import torch
5
- from PIL import Image, ImageDraw
6
  import cv2
7
  from transformers import AutoImageProcessor, RTDetrForObjectDetection
 
 
8
 
9
  DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
10
 
11
  # Globale Modelle
12
  rtdetr_r50_model = None
13
  rtdetr_r50_processor = None
14
- rtdetr_r101_model = None
15
- rtdetr_r101_processor = None
16
 
17
  def load_models():
18
- global rtdetr_r50_model, rtdetr_r50_processor, rtdetr_r101_model, rtdetr_r101_processor
19
 
20
- print("Lade RT-DETR R50 (COCO + Objects365)...")
21
  model_id_r50 = "PekingU/rtdetr_r50vd_coco_o365"
22
  try:
23
  rtdetr_r50_model = RTDetrForObjectDetection.from_pretrained(model_id_r50).to(DEVICE)
24
  rtdetr_r50_processor = AutoImageProcessor.from_pretrained(model_id_r50)
25
- print(f"R50 geladen - kennt {len(rtdetr_r50_model.config.id2label)} Klassen")
26
-
27
- # Debug: Zeige einige Labels
28
- labels = list(rtdetr_r50_model.config.id2label.values())[:20]
29
- print(f"Erste 20 Labels: {labels}")
30
-
31
- # Suche nach Badezimmer-relevanten Labels
32
- bad_labels = [l for l in rtdetr_r50_model.config.id2label.values()
33
- if any(word in l.lower() for word in ['toilet', 'sink', 'faucet', 'mirror', 'towel', 'bath'])]
34
- print(f"Badezimmer-relevante Labels gefunden: {bad_labels}")
35
-
36
  except Exception as e:
37
  return f"Fehler beim Laden von RT-DETR R50: {str(e)}"
38
 
39
- print("Lade RT-DETR R101 (COCO + Objects365)...")
40
- model_id_r101 = "PekingU/rtdetr_r101vd_coco_o365"
41
  try:
42
- rtdetr_r101_model = RTDetrForObjectDetection.from_pretrained(model_id_r101).to(DEVICE)
43
- rtdetr_r101_processor = AutoImageProcessor.from_pretrained(model_id_r101)
44
- print(f"R101 geladen - kennt {len(rtdetr_r101_model.config.id2label)} Klassen")
 
 
 
 
 
 
 
 
 
 
45
  except Exception as e:
46
- return f"Fehler beim Laden von RT-DETR R101: {str(e)}"
47
 
48
- return f"Beide Modelle geladen! R50 und R101 mit COCO+Objects365 Training"
49
 
50
- def detect_with_rtdetr(image: Image.Image, model, processor, model_name: str, confidence_threshold=0.25):
51
  start = time.time()
52
 
53
  inputs = processor(images=image, return_tensors="pt").to(DEVICE)
@@ -68,8 +68,7 @@ def detect_with_rtdetr(image: Image.Image, model, processor, model_name: str, co
68
 
69
  id2label = model.config.id2label if hasattr(model.config, 'id2label') else {}
70
 
71
- # Farbe je nach Modell
72
- box_color = "red" if "r50" in model_name.lower() else "blue"
73
 
74
  for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
75
  x1, y1, x2, y2 = [float(x) for x in box.tolist()]
@@ -89,67 +88,105 @@ def detect_with_rtdetr(image: Image.Image, model, processor, model_name: str, co
89
  dur = time.time() - start
90
  return annotated, detections, dur
91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  def compare_models(image: Image.Image, confidence_threshold: float):
93
  if image is None:
94
  return None, None, "Bitte lade ein Bild hoch."
95
 
96
- # R50 Detection (schneller, weniger genau)
97
- r50_img, r50_det, r50_t = detect_with_rtdetr(
98
- image, rtdetr_r50_model, rtdetr_r50_processor, "R50", confidence_threshold
99
  )
100
 
101
- # R101 Detection (langsamer, genauer)
102
- r101_img, r101_det, r101_t = detect_with_rtdetr(
103
- image, rtdetr_r101_model, rtdetr_r101_processor, "R101", confidence_threshold
104
  )
105
 
106
  # Labels extrahieren und zählen
107
- r50_objects = {}
108
- for d in r50_det:
109
  label = d["label"]
110
- if label not in r50_objects:
111
- r50_objects[label] = 0
112
- r50_objects[label] += 1
113
 
114
- r101_objects = {}
115
- for d in r101_det:
116
  label = d["label"]
117
- if label not in r101_objects:
118
- r101_objects[label] = 0
119
- r101_objects[label] += 1
120
 
121
  # Alle einzigartigen Labels
122
- all_labels = set(list(r50_objects.keys()) + list(r101_objects.keys()))
123
 
124
  # Nur in einem Modell gefunden
125
- nur_r50 = set(r50_objects.keys()) - set(r101_objects.keys())
126
- nur_r101 = set(r101_objects.keys()) - set(r50_objects.keys())
127
- beide = set(r50_objects.keys()) & set(r101_objects.keys())
128
 
129
  # Vergleichstabelle
130
- comparison_table = "| Objekt | R50 (schnell) | R101 (genau) | Differenz |\n"
131
- comparison_table += "|--------|---------------|--------------|----------|\n"
132
 
133
  for label in sorted(all_labels):
134
- r50_count = r50_objects.get(label, 0)
135
- r101_count = r101_objects.get(label, 0)
136
- diff = r50_count - r101_count
137
- diff_str = f"+{diff}" if diff > 0 else str(diff)
138
- comparison_table += f"| {label} | {r50_count} | {r101_count} | {diff_str} |\n"
 
 
 
139
 
140
  # Vollständige JSON Ausgabe
141
  full_json = json.dumps({
142
  "rtdetr_r50": {
143
- "total_objects": len(r50_det),
144
- "inference_time_ms": round(r50_t * 1000, 1),
145
- "unique_finds": list(nur_r50),
146
- "all_detections": r50_det
 
147
  },
148
- "rtdetr_r101": {
149
- "total_objects": len(r101_det),
150
- "inference_time_ms": round(r101_t * 1000, 1),
151
- "unique_finds": list(nur_r101),
152
- "all_detections": r101_det
 
153
  },
154
  "gemeinsam": {
155
  "beide_gefunden": list(beide),
@@ -157,24 +194,24 @@ def compare_models(image: Image.Image, confidence_threshold: float):
157
  }
158
  }, ensure_ascii=False, indent=2)
159
 
160
- # Markdown-String ohne problematische Backticks in f-string
161
- md = "## RT-DETR Modellvergleich: R50 vs R101 (beide COCO + Objects365)\n\n"
162
- md += "### Training-Basis\n"
163
- md += "Beide Modelle wurden auf **COCO (80 Klassen) + Objects365 (365 Klassen)** trainiert.\n"
164
- md += "Das bedeutet sie kennen theoretisch **400+ verschiedene Objekttypen**!\n\n"
165
  md += "### Zusammenfassung\n"
166
- md += f"- **RT-DETR R50:** {len(r50_det)} Objekte in {r50_t*1000:.1f}ms\n"
167
- md += f"- **RT-DETR R101:** {len(r101_det)} Objekte in {r101_t*1000:.1f}ms\n"
168
- md += f"- **Geschwindigkeitsfaktor:** R50 ist {r101_t/r50_t:.2f}x schneller\n\n"
169
  md += "### Exklusive Funde\n"
170
- md += f"- **Nur R50 gefunden:** {', '.join(nur_r50) if nur_r50 else 'Keine'}\n"
171
- md += f"- **Nur R101 gefunden:** {', '.join(nur_r101) if nur_r101 else 'Keine'}\n"
172
  md += f"- **Beide gefunden:** {len(beide)} gemeinsame Objekttypen\n\n"
173
  md += "### Detaillierter Vergleich\n"
174
  md += comparison_table + "\n"
175
- md += "### Modell-Unterschiede\n"
176
- md += "- **R50:** ResNet-50 Backbone, 50 Layer tief, schneller aber weniger genau\n"
177
- md += "- **R101:** ResNet-101 Backbone, 101 Layer tief, genauer aber langsamer\n\n"
178
  md += "### Alle Erkennungen (JSON)\n"
179
  md += "<details>\n"
180
  md += "<summary>Klick für vollständige Daten</summary>\n\n"
@@ -183,7 +220,7 @@ def compare_models(image: Image.Image, confidence_threshold: float):
183
  md += "\n```\n"
184
  md += "</details>\n"
185
 
186
- return r50_img, r101_img, md
187
 
188
  # Modelle beim Start laden
189
  print("Starte Modell-Ladevorgang...")
@@ -191,9 +228,9 @@ load_status = load_models()
191
  print(load_status)
192
 
193
  # Gradio Interface
194
- with gr.Blocks(title="RT-DETR Modellvergleich") as demo:
195
- gr.Markdown("# 🔍 RT-DETR Modellvergleich: R50 vs R101")
196
- gr.Markdown("Vergleiche die Performance von RT-DETR ResNet-50 und ResNet-101 Modellen (beide trainiert auf COCO + Objects365)")
197
 
198
  with gr.Row():
199
  with gr.Column():
@@ -208,8 +245,8 @@ with gr.Blocks(title="RT-DETR Modellvergleich") as demo:
208
  detect_btn = gr.Button("🚀 Modelle vergleichen", variant="primary")
209
 
210
  with gr.Row():
211
- r50_output = gr.Image(label="RT-DETR R50 (schnell)")
212
- r101_output = gr.Image(label="RT-DETR R101 (genau)")
213
 
214
  analysis_output = gr.Markdown(label="Vergleichsanalyse")
215
 
@@ -217,7 +254,7 @@ with gr.Blocks(title="RT-DETR Modellvergleich") as demo:
217
  detect_btn.click(
218
  fn=compare_models,
219
  inputs=[input_image, confidence_slider],
220
- outputs=[r50_output, r101_output, analysis_output]
221
  )
222
 
223
  # Beispiele
@@ -227,7 +264,7 @@ with gr.Blocks(title="RT-DETR Modellvergleich") as demo:
227
  ["example2.jpg", 0.3],
228
  ],
229
  inputs=[input_image, confidence_slider],
230
- outputs=[r50_output, r101_output, analysis_output],
231
  fn=compare_models,
232
  cache_examples=False
233
  )
 
2
  import numpy as np
3
  import gradio as gr
4
  import torch
5
+ from PIL import Image, ImageDraw, ImageFont
6
  import cv2
7
  from transformers import AutoImageProcessor, RTDetrForObjectDetection
8
+ from ultralytics import YOLO
9
+ from huggingface_hub import hf_hub_download
10
 
11
  DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
12
 
13
  # Globale Modelle
14
  rtdetr_r50_model = None
15
  rtdetr_r50_processor = None
16
+ yolo_o365_model = None
 
17
 
18
  def load_models():
19
+ global rtdetr_r50_model, rtdetr_r50_processor, yolo_o365_model
20
 
21
+ print("Lade RT-DETR R50 (COCO 80 Klassen)...")
22
  model_id_r50 = "PekingU/rtdetr_r50vd_coco_o365"
23
  try:
24
  rtdetr_r50_model = RTDetrForObjectDetection.from_pretrained(model_id_r50).to(DEVICE)
25
  rtdetr_r50_processor = AutoImageProcessor.from_pretrained(model_id_r50)
26
+ print(f"RT-DETR R50 geladen - kennt {len(rtdetr_r50_model.config.id2label)} Klassen")
 
 
 
 
 
 
 
 
 
 
27
  except Exception as e:
28
  return f"Fehler beim Laden von RT-DETR R50: {str(e)}"
29
 
30
+ print("Lade YOLO11n (Objects365 - 365 Klassen)...")
 
31
  try:
32
+ weights_path = hf_hub_download("NRtred/yolo11n_object365", "yolo11n_object365.pt")
33
+ yolo_o365_model = YOLO(weights_path)
34
+ print(f"YOLO11n geladen - kennt {len(yolo_o365_model.names)} Klassen")
35
+
36
+ # Debug: Zeige einige YOLO Labels
37
+ yolo_labels = list(yolo_o365_model.names.values())[:30]
38
+ print(f"Erste 30 YOLO Labels: {yolo_labels}")
39
+
40
+ # Suche nach Badezimmer-relevanten Labels in YOLO
41
+ bad_labels_yolo = [l for l in yolo_o365_model.names.values()
42
+ if any(word in l.lower() for word in ['toilet', 'sink', 'faucet', 'mirror', 'towel', 'bath', 'shower'])]
43
+ print(f"YOLO Badezimmer-Labels: {bad_labels_yolo}")
44
+
45
  except Exception as e:
46
+ return f"Fehler beim Laden von YOLO11n: {str(e)}"
47
 
48
+ return f"Beide Modelle geladen! RT-DETR R50 (80 COCO) und YOLO11n (365 Objects365)"
49
 
50
+ def detect_with_rtdetr(image: Image.Image, model, processor, confidence_threshold=0.25):
51
  start = time.time()
52
 
53
  inputs = processor(images=image, return_tensors="pt").to(DEVICE)
 
68
 
69
  id2label = model.config.id2label if hasattr(model.config, 'id2label') else {}
70
 
71
+ box_color = "red"
 
72
 
73
  for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
74
  x1, y1, x2, y2 = [float(x) for x in box.tolist()]
 
88
  dur = time.time() - start
89
  return annotated, detections, dur
90
 
91
+ def detect_with_yolo(image: Image.Image, model, confidence_threshold=0.25):
92
+ start = time.time()
93
+
94
+ # YOLO inference
95
+ results = model(image, conf=confidence_threshold, device=DEVICE.type)
96
+
97
+ detections = []
98
+ annotated = image.copy()
99
+ draw = ImageDraw.Draw(annotated)
100
+
101
+ box_color = "blue"
102
+
103
+ for r in results:
104
+ boxes = r.boxes
105
+ if boxes is not None:
106
+ for box in boxes:
107
+ x1, y1, x2, y2 = box.xyxy[0].tolist()
108
+ conf = float(box.conf[0])
109
+ cls = int(box.cls[0])
110
+ label = model.names[cls]
111
+
112
+ detections.append({
113
+ "label": label,
114
+ "confidence": round(conf, 3),
115
+ "bbox": [int(x1), int(y1), int(x2), int(y2)]
116
+ })
117
+
118
+ draw.rectangle([x1, y1, x2, y2], outline=box_color, width=3)
119
+ draw.text((x1, max(0, y1 - 14)), f"{label}: {conf:.2f}", fill=box_color)
120
+
121
+ dur = time.time() - start
122
+ return annotated, detections, dur
123
+
124
  def compare_models(image: Image.Image, confidence_threshold: float):
125
  if image is None:
126
  return None, None, "Bitte lade ein Bild hoch."
127
 
128
+ # RT-DETR R50 Detection (80 COCO Klassen)
129
+ rtdetr_img, rtdetr_det, rtdetr_t = detect_with_rtdetr(
130
+ image, rtdetr_r50_model, rtdetr_r50_processor, confidence_threshold
131
  )
132
 
133
+ # YOLO11n Detection (365 Objects365 Klassen)
134
+ yolo_img, yolo_det, yolo_t = detect_with_yolo(
135
+ image, yolo_o365_model, confidence_threshold
136
  )
137
 
138
  # Labels extrahieren und zählen
139
+ rtdetr_objects = {}
140
+ for d in rtdetr_det:
141
  label = d["label"]
142
+ if label not in rtdetr_objects:
143
+ rtdetr_objects[label] = 0
144
+ rtdetr_objects[label] += 1
145
 
146
+ yolo_objects = {}
147
+ for d in yolo_det:
148
  label = d["label"]
149
+ if label not in yolo_objects:
150
+ yolo_objects[label] = 0
151
+ yolo_objects[label] += 1
152
 
153
  # Alle einzigartigen Labels
154
+ all_labels = set(list(rtdetr_objects.keys()) + list(yolo_objects.keys()))
155
 
156
  # Nur in einem Modell gefunden
157
+ nur_rtdetr = set(rtdetr_objects.keys()) - set(yolo_objects.keys())
158
+ nur_yolo = set(yolo_objects.keys()) - set(rtdetr_objects.keys())
159
+ beide = set(rtdetr_objects.keys()) & set(yolo_objects.keys())
160
 
161
  # Vergleichstabelle
162
+ comparison_table = "| Objekt | RT-DETR (80) | YOLO (365) | Anmerkung |\n"
163
+ comparison_table += "|--------|--------------|------------|----------|\n"
164
 
165
  for label in sorted(all_labels):
166
+ rtdetr_count = rtdetr_objects.get(label, 0)
167
+ yolo_count = yolo_objects.get(label, 0)
168
+ note = ""
169
+ if label in nur_rtdetr:
170
+ note = "⚠️ Nur COCO"
171
+ elif label in nur_yolo:
172
+ note = "✨ O365 Extra"
173
+ comparison_table += f"| {label} | {rtdetr_count} | {yolo_count} | {note} |\n"
174
 
175
  # Vollständige JSON Ausgabe
176
  full_json = json.dumps({
177
  "rtdetr_r50": {
178
+ "total_objects": len(rtdetr_det),
179
+ "inference_time_ms": round(rtdetr_t * 1000, 1),
180
+ "unique_finds": list(nur_rtdetr),
181
+ "available_classes": 80,
182
+ "all_detections": rtdetr_det
183
  },
184
+ "yolo11n_o365": {
185
+ "total_objects": len(yolo_det),
186
+ "inference_time_ms": round(yolo_t * 1000, 1),
187
+ "unique_finds": list(nur_yolo),
188
+ "available_classes": 365,
189
+ "all_detections": yolo_det
190
  },
191
  "gemeinsam": {
192
  "beide_gefunden": list(beide),
 
194
  }
195
  }, ensure_ascii=False, indent=2)
196
 
197
+ # Markdown-String
198
+ md = "## Modellvergleich: RT-DETR R50 (COCO) vs YOLO11n (Objects365)\n\n"
199
+ md += "### Klassen-Unterschied\n"
200
+ md += "- **RT-DETR R50:** 80 COCO Klassen (Standard-Objekte)\n"
201
+ md += "- **YOLO11n:** 365 Objects365 Klassen (detaillierte Objekterkennung)\n\n"
202
  md += "### Zusammenfassung\n"
203
+ md += f"- **RT-DETR R50:** {len(rtdetr_det)} Objekte in {rtdetr_t*1000:.1f}ms\n"
204
+ md += f"- **YOLO11n O365:** {len(yolo_det)} Objekte in {yolo_t*1000:.1f}ms\n"
205
+ md += f"- **Geschwindigkeitsfaktor:** {'RT-DETR' if rtdetr_t < yolo_t else 'YOLO'} ist {max(rtdetr_t, yolo_t)/min(rtdetr_t, yolo_t):.2f}x schneller\n\n"
206
  md += "### Exklusive Funde\n"
207
+ md += f"- **Nur RT-DETR (COCO):** {', '.join(nur_rtdetr) if nur_rtdetr else 'Keine'}\n"
208
+ md += f"- **Nur YOLO (O365 Extra):** {', '.join(nur_yolo) if nur_yolo else 'Keine'}\n"
209
  md += f"- **Beide gefunden:** {len(beide)} gemeinsame Objekttypen\n\n"
210
  md += "### Detaillierter Vergleich\n"
211
  md += comparison_table + "\n"
212
+ md += "### Modell-Eigenschaften\n"
213
+ md += "- **RT-DETR:** Transformer-basiert, End-to-End Detection, COCO-fokussiert\n"
214
+ md += "- **YOLO11n:** CNN-basiert, ultraschnell, 365 detaillierte Objektklassen\n\n"
215
  md += "### Alle Erkennungen (JSON)\n"
216
  md += "<details>\n"
217
  md += "<summary>Klick für vollständige Daten</summary>\n\n"
 
220
  md += "\n```\n"
221
  md += "</details>\n"
222
 
223
+ return rtdetr_img, yolo_img, md
224
 
225
  # Modelle beim Start laden
226
  print("Starte Modell-Ladevorgang...")
 
228
  print(load_status)
229
 
230
  # Gradio Interface
231
+ with gr.Blocks(title="RT-DETR vs YOLO Vergleich") as demo:
232
+ gr.Markdown("# 🔍 Objekterkennung: RT-DETR (80 COCO) vs YOLO11n (365 Objects365)")
233
+ gr.Markdown("Vergleiche RT-DETR mit Standard COCO gegen YOLO mit erweitertem Objects365 Datensatz")
234
 
235
  with gr.Row():
236
  with gr.Column():
 
245
  detect_btn = gr.Button("🚀 Modelle vergleichen", variant="primary")
246
 
247
  with gr.Row():
248
+ rtdetr_output = gr.Image(label="RT-DETR R50 (80 COCO Klassen)")
249
+ yolo_output = gr.Image(label="YOLO11n (365 Objects365 Klassen)")
250
 
251
  analysis_output = gr.Markdown(label="Vergleichsanalyse")
252
 
 
254
  detect_btn.click(
255
  fn=compare_models,
256
  inputs=[input_image, confidence_slider],
257
+ outputs=[rtdetr_output, yolo_output, analysis_output]
258
  )
259
 
260
  # Beispiele
 
264
  ["example2.jpg", 0.3],
265
  ],
266
  inputs=[input_image, confidence_slider],
267
+ outputs=[rtdetr_output, yolo_output, analysis_output],
268
  fn=compare_models,
269
  cache_examples=False
270
  )