File size: 3,674 Bytes
6cedb7a
5aad3df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f9bbe2
5aad3df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f9bbe2
5aad3df
 
6f9bbe2
 
 
 
 
5aad3df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# !pip install ultralytics
import gradio as gr
import cv2
from ultralytics import YOLO
import torch
import os
import numpy as np 


loaded_model = YOLO('best.pt')

# Проверка устройства
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f'Используется устройство: {device}')
loaded_model.to(device)


# # --- Глобальные переменные для оптимизации ---
# # Пропуск кадров для увеличения производительности
# FRAME_SKIP = 2 # Обрабатывать каждый 2-й кадр
# frame_counter = 0
# last_annotated_frame = None # Храним последний обработанный кадр


# --- Функция для обработки веб-камеры ---
def predict_webcam(img, conf_threshold, iou_threshold):
    # global frame_counter, last_annotated_frame

    if img is None:
        return last_annotated_frame # Возвращаем последний кадр, если новый не пришел

    # Исправляем зеркальное отражение
    img = cv2.flip(img, 1)

    # frame_counter += 1
    # if frame_counter % FRAME_SKIP != 0 and last_annotated_frame is not None:
    #      # Если пропускаем кадр, возвращаем предыдущий результат, чтобы не было "замирания"
    #     return last_annotated_frame

    # Пропускаем кадр через модель
    results = loaded_model.track( # ИЗМЕНЕНО: .predict() на .track() для стабильности
        source=img,
        conf=conf_threshold,
        iou=iou_threshold,
        imgsz=640,
        verbose=False,
        persist=True, # ВАЖНО для трекера: сохранять треки между кадрами
        tracker='botsort.yaml' # Включаем трекер
    )

    # results - это список, содержащий один объект Results
    # plot() возвращает аннотированное изображение в формате numpy array (BGR)
    annotated_frame = results[0].plot()

    # Преобразование цвета из BGR (OpenCV) в RGB (Gradio)
    # annotated_frame_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)

    # Сохраняем последний успешно обработанный кадр
    # last_annotated_frame = annotated_frame_rgb
    last_annotated_frame = annotated_frame
    
    # return annotated_frame_rgb
    return annotated_frame

# --- Определение интерфейса Gradio ---
iface = gr.Interface(
    fn=predict_webcam,
    inputs=[
        gr.Image(type="numpy", label="Webcam Feed", streaming=True),
        gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold"),
        gr.Slider(minimum=0, maximum=1, value=0.45, label="IoU threshold"),
    ],
    outputs=gr.Image(type="numpy", label="Result"),
    live=True,
    title="Impurity Detection (Webcam)",
    description="Real-time impurity detection using your webcam. Adjust confidence and IoU thresholds below.",
)

# # --- Запуск интерфейса Gradio ---
# if __name__ == "__main__":
#     # РЕШЕНИЕ №4 (дополнительно): .queue() для более отзывчивого интерфейса
#     iface.queue().launch(share=True, debug=True)


if __name__ == "__main__":
    print("\nЗапуск Gradio интерфейса. Ожидайте появления публичной ссылки...")
    iface.launch(share=True) # Устанавливаем share=True для запуска в Colab