Skip to content

Commit be92fc1

Browse files
committed
ci: Add GitHub Actions workflow for build and release
1 parent 7deb48a commit be92fc1

File tree

2 files changed

+44
-24
lines changed

2 files changed

+44
-24
lines changed

analytics.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
1-
# analytics.py (ФИНАЛЬНАЯ РАБОЧАЯ ВЕРСИЯ v2)
1+
# analytics.py
22

33
import sys
4+
import os # <--- Добавили os
45
import json
56
import time
67
import base64
78
import 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+
922
try:
10-
# Основные библиотеки для работы с видео и нейронными сетями
1123
import cv2
1224
import numpy as np
1325
import onnxruntime as ort
1426
except 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 без изменений) ...
2332
COCO_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+
106116
def 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

191201
if __name__ == "__main__":

python_src/analytics.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,34 @@
1-
# analytics.py (ФИНАЛЬНАЯ РАБОЧАЯ ВЕРСИЯ v2)
1+
# analytics.py
22

33
import sys
4+
import os # <--- Добавили os
45
import json
56
import time
67
import base64
78
import 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+
922
try:
10-
# Основные библиотеки для работы с видео и нейронными сетями
1123
import cv2
1224
import numpy as np
1325
import onnxruntime as ort
1426
except 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 без изменений) ...
2332
COCO_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+
106116
def 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

191201
if __name__ == "__main__":

0 commit comments

Comments
 (0)