1- # analytics.py (ФИНАЛЬНАЯ РАБОЧАЯ ВЕРСИЯ v2)
1+ # analytics.py
22
33import sys
4+ import os # <--- Добавили os
45import json
56import time
67import base64
78import threading
89
10+ # VVVV --- БЛОК ОПРЕДЕЛЕНИЯ ПУТИ ДЛЯ PYINSTALLER --- VVVV
11+ # Этот код определяет, запущен ли скрипт как скомпилированный .exe
12+ # Если да, он устанавливает базовый путь к распакованным файлам.
13+ if getattr (sys , 'frozen' , False ):
14+ # Если мы "заморожены" (скомпилированы в .exe)
15+ application_path = sys ._MEIPASS
16+ else :
17+ # Если мы запускаемся как обычный .py скрипт
18+ application_path = os .path .dirname (os .path .abspath (__file__ ))
19+ # ^^^^ --- КОНЕЦ БЛОКА --- ^^^^
20+
21+
922try :
10- # Основные библиотеки для работы с видео и нейронными сетями
1123 import cv2
1224 import numpy as np
1325 import onnxruntime as ort
1426except Exception as e :
15- # Если одна из ключевых библиотек не установлена или не может быть загружена,
16- # отправляем сообщение об ошибке и завершаем работу.
1727 error_message = f"Fatal error during library import: { str (e )} "
1828 print (json .dumps ({"status" : "error" , "message" : error_message }), flush = True )
1929 sys .exit (1 )
2030
21- # Встроенный словарь классов COCO.
22- # Это делает скрипт независимым от изменений в библиотеке ultralytics.
31+ # ... (остальной код класса FrameGrabber, preprocess, postprocess без изменений) ...
2332COCO_CLASSES = {
2433 0 : 'person' , 1 : 'bicycle' , 2 : 'car' , 3 : 'motorcycle' , 4 : 'airplane' , 5 : 'bus' , 6 : 'train' , 7 : 'truck' ,
2534 8 : 'boat' , 9 : 'traffic light' , 10 : 'fire hydrant' , 11 : 'stop sign' , 12 : 'parking meter' , 13 : 'bench' ,
@@ -103,12 +112,16 @@ def postprocess(output, ratio, pad, confidence_threshold=0.5, iou_threshold=0.5)
103112 })
104113 return detections
105114
115+
106116def run_analytics (rtsp_url , config_str ):
107117 try :
108118 providers = ['CPUExecutionProvider' ]
109119 print (json .dumps ({"status" : "info" , "provider" : "CPUExecutionProvider" }), flush = True )
110120
111- model_path = 'yolov8n.onnx'
121+ # VVVV --- ИЗМЕНЕНИЕ: Используем абсолютный путь к модели --- VVVV
122+ model_path = os .path .join (application_path , 'yolov8n.onnx' )
123+ # ^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^
124+
112125 session = ort .InferenceSession (model_path , providers = providers )
113126
114127 input_name = session .get_inputs ()[0 ].name
@@ -132,7 +145,6 @@ def run_analytics(rtsp_url, config_str):
132145
133146 frame_grabber = None
134147
135- # VVVVVV --- ИЗМЕНЕНИЕ: Добавлен бесконечный цикл --- VVVVVV
136148 while True :
137149 try :
138150 if frame_grabber is None or frame_grabber .stopped :
@@ -142,7 +154,7 @@ def run_analytics(rtsp_url, config_str):
142154 time .sleep (2 )
143155 except IOError as e :
144156 print (json .dumps ({"status" : "error" , "message" : str (e )}), flush = True )
145- time .sleep (5 ) # Пауза перед новой попыткой подключения
157+ time .sleep (5 )
146158 continue
147159
148160 frame_count = 0
@@ -179,13 +191,11 @@ def run_analytics(rtsp_url, config_str):
179191 print (json .dumps (result ), flush = True )
180192
181193 except Exception as e :
182- # Ловим любые другие ошибки, чтобы скрипт не падал
183194 print (json .dumps ({"status" : "error" , "message" : f"Runtime error: { str (e )} " }), flush = True )
184195 if frame_grabber :
185196 frame_grabber .stop ()
186197 frame_grabber = None
187- time .sleep (5 ) # Пауза перед перезапуском
188- # ^^^^^^ --- КОНЕЦ ИЗМЕНЕНИЯ --- ^^^^^^
198+ time .sleep (5 )
189199
190200
191201if __name__ == "__main__" :
0 commit comments