teslatony commited on
Commit
86bffab
·
verified ·
1 Parent(s): 575692d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -32
app.py CHANGED
@@ -1,16 +1,31 @@
1
- import gradio as gr
2
- from PIL import Image
 
 
 
3
  import numpy as np
4
- from ultralytics import YOLO
 
 
 
 
 
 
 
5
 
 
6
  _MODEL = {"obj": None}
7
 
8
- def load_model(model_name="yolov8n.pt"):
 
 
 
9
  if _MODEL["obj"] is None:
10
  _MODEL["obj"] = YOLO(model_name)
11
  return _MODEL["obj"]
12
 
13
- def annotate_frame(frame, conf=0.25):
 
14
  if frame is None:
15
  return None
16
  model = load_model()
@@ -18,33 +33,45 @@ def annotate_frame(frame, conf=0.25):
18
  annotated = results[0].plot()
19
  return np.array(annotated)
20
 
21
- def detect_live(frame, conf):
22
- if frame is None:
 
23
  return None
24
- annotated = annotate_frame(frame, conf)
25
  return Image.fromarray(annotated)
26
 
27
- with gr.Blocks() as demo:
28
- gr.Markdown("# 🎥 Реальное время: детекция объектов (YOLOv8)")
29
- with gr.Row():
30
- with gr.Column(scale=2):
31
- # Захват с камеры через tool="camera"
32
- webcam = gr.Video(label="Веб-камера", tool="camera", interactive=True)
33
- conf = gr.Slider(0, 1, 0.25, 0.01, label="Confidence")
34
- model_path = gr.Textbox(value="yolov8n.pt", visible=False)
35
- with gr.Column(scale=1):
36
- output = gr.Image(label="Результат детекции")
37
- start_btn = gr.Button("Load model")
38
- status = gr.Textbox(value="Модель не загружена", interactive=False)
39
-
40
- def load_event(spec):
41
- try:
42
- load_model(spec)
43
- return f"Модель загружена: {spec}"
44
- except Exception as e:
45
- return f"Ошибка: {e}"
46
-
47
- start_btn.click(load_event, inputs=[model_path], outputs=[status])
48
- webcam.change(detect_live, inputs=[webcam, conf], outputs=[output])
49
-
50
- demo.launch()
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Реальное время: распознавание объектов с веб-камеры через Gradio и YOLOv8.
3
+ Работает с Gradio 3.49.3
4
+ """
5
+
6
  import numpy as np
7
+ from PIL import Image
8
+ import gradio as gr
9
+
10
+ try:
11
+ from ultralytics import YOLO
12
+ except Exception as e:
13
+ YOLO = None
14
+ print("Ultralytics import failed:", e)
15
 
16
+ # Кэширование модели
17
  _MODEL = {"obj": None}
18
 
19
+ def load_model(model_name: str = "yolov8n.pt"):
20
+ """Загружает YOLO-модель"""
21
+ if YOLO is None:
22
+ raise RuntimeError("Пакет ultralytics не найден. Проверь requirements.txt.")
23
  if _MODEL["obj"] is None:
24
  _MODEL["obj"] = YOLO(model_name)
25
  return _MODEL["obj"]
26
 
27
+ def annotate_frame(frame: np.ndarray, conf: float = 0.25):
28
+ """Выполняет детекцию и возвращает кадр с аннотациями"""
29
  if frame is None:
30
  return None
31
  model = load_model()
 
33
  annotated = results[0].plot()
34
  return np.array(annotated)
35
 
36
+ def detect_live(image, conf):
37
+ """Обработчик Gradio для стриминга с веб-камеры"""
38
+ if image is None:
39
  return None
40
+ annotated = annotate_frame(image, conf)
41
  return Image.fromarray(annotated)
42
 
43
+ def main():
44
+ title = "🎥 Реальное время: распознавание объектов (YOLOv8)"
45
+ description = "Потоковое детектирование объектов с веб-камеры. Используется модель `yolov8n.pt`."
46
+
47
+ with gr.Blocks() as demo:
48
+ gr.Markdown(f"# {title}\n\n{description}")
49
+
50
+ with gr.Row():
51
+ with gr.Column(scale=2):
52
+ # Для Gradio 3.49.3 — рабочий способ захвата веб-камеры
53
+ webcam = gr.Image(source="webcam", streaming=True, label="Веб-камера")
54
+ conf = gr.Slider(0.0, 1.0, value=0.25, step=0.01, label="Порог достоверности")
55
+ model_path = gr.Textbox(value="yolov8n.pt", label="Модель", visible=False)
56
+
57
+ with gr.Column(scale=1):
58
+ output = gr.Image(label="Результат детекции", interactive=False)
59
+ start_btn = gr.Button("Загрузить модель")
60
+ status = gr.Textbox(value="Модель не загружена", label="Статус", interactive=False)
61
+
62
+ # Кнопка загрузки модели
63
+ def load_event(spec):
64
+ try:
65
+ load_model(spec)
66
+ return f"Модель загружена: {spec}"
67
+ except Exception as e:
68
+ return f"Ошибка: {e}"
69
+
70
+ start_btn.click(load_event, inputs=[model_path], outputs=[status])
71
+ webcam.change(detect_live, inputs=[webcam, conf], outputs=[output])
72
+
73
+ demo.launch()
74
+
75
+ if __name__ == "__main__":
76
+ main()
77
+