-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathconfig.py
More file actions
135 lines (105 loc) · 5.8 KB
/
Copy pathconfig.py
File metadata and controls
135 lines (105 loc) · 5.8 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
"""
Configuracao central do EPI Detect.
Todos os limites aqui foram calibrados em video real, nao escolhidos por
intuicao. Os comentarios registram a medicao que justifica cada valor,
para que ajustes futuros partam de dado e nao de tentativa.
Para adaptar a uma maquina ou camera especifica, nao edite este arquivo:
crie um settings_local.json na raiz do projeto com as chaves que quiser
sobrescrever. Ele e ignorado pelo git.
"""
from __future__ import annotations
import json
import os
from pathlib import Path
ROOT = Path(__file__).parent
# ── fonte de video ────────────────────────────────────────────────────────────
# Aceita indice de webcam (0, 1, ...) ou URL RTSP de camera IP.
# Exemplo RTSP: "rtsp://usuario:senha@192.168.0.50:554/stream1"
SOURCE = 0
FRAME_WIDTH = 640
FRAME_HEIGHT = 480
TARGET_FPS = 30
# ── modelo ────────────────────────────────────────────────────────────────────
# yolov8n-pose e o menor da familia. Baixa sozinho na primeira execucao.
MODEL_PATH = os.getenv("EPI_MODEL_PATH", "yolov8n-pose.pt")
# Resolucao de entrada do modelo. Nao existe valor bom para todo caso:
# plano aberto, pessoas a ~150 px -> 1280 (em 896 pessoas desaparecem)
# plano fechado, pessoa a ~440 px -> 768 (acerta mais e roda ~3x mais rapido)
# O YOLO responde por cerca de 99% do custo por frame, entao esse numero e
# o que mais mexe no desempenho. Ver detector.pick_input_size().
INPUT_SIZE = 1280
INPUT_SIZE_NEAR = 768
# Fracao da altura do quadro a partir da qual a cena e considerada plano
# fechado e passa a usar INPUT_SIZE_NEAR.
NEAR_SCENE_RATIO = 0.30
# ── limites de deteccao ───────────────────────────────────────────────────────
# 0.20 mantem pessoas ao fundo. Abaixo de 0.15 comecam a entrar caixas
# achatadas de reflexo no piso, que MAX_ASPECT descarta.
CONF_THRESH = 0.20
# Pessoa e sempre mais alta que larga, mesmo sentada. Reflexo no piso chega
# em proporcoes de 6:1, entao 2.6 separa os dois casos com folga.
MAX_ASPECT = 2.60
# Pose coerente tem 10 ou mais keypoints confiaveis; deteccao fantasma
# costuma trazer 1 ou 2.
MIN_KEYPOINTS = 4
KEYPOINT_MIN_CONF = 0.15
# Cobertura de cor de colete no tronco. Colete refletivo cobre bem mais
# que 9% da faixa; o valor baixo tolera oclusao parcial por carga ou volante.
VEST_THRESH = 0.09
# Cobertura de capacete na calota da cabeca. Medido em video real:
# com capacete a cobertura fica entre 0.29 e 0.82; cabeca descoberta da
# 0.00 depois de excluir pele e cabelo. O corte em 0.24 separa com folga.
HELMET_THRESH = 0.24
# ── estabilizacao temporal ────────────────────────────────────────────────────
# Voto de maioria numa janela de frames evita que o rotulo pisque quando a
# pessoa cruza sombra ou vira de lado.
STABILIZE_WINDOW = 6
STABILIZE_RATIO = 0.40
TRACK_IOU = 0.20
TRACK_MAX_MISSING = 18 # frames de tolerancia antes de esquecer a pessoa
# ── interface ─────────────────────────────────────────────────────────────────
SYSTEM_TITLE = "SISTEMA DE DETECCAO DE EPI"
SIDEBAR_WIDTH = 235
# Caixas tracejadas mostrando onde a IA mede cada EPI. Bom para demonstrar
# o funcionamento; desligue para uma tela de operacao mais limpa.
SHOW_ANALYSIS_ZONES = True
# ── servidor web ──────────────────────────────────────────────────────────────
HOST = "0.0.0.0"
PORT = int(os.getenv("EPI_PORT", "5000"))
STREAM_FPS = 12
JPEG_QUALITY = 70
# ── aceleracao ────────────────────────────────────────────────────────────────
# OpenVINO acelera em iGPU Intel. Requer exportar o modelo antes:
# yolo export model=yolov8n-pose.pt format=openvino
USE_OPENVINO = os.getenv("EPI_USE_OPENVINO", "0") == "1"
TORCH_THREADS = int(os.getenv("EPI_TORCH_THREADS", "0")) or None
# ── sobrescrita local ─────────────────────────────────────────────────────────
_OVERRIDABLE = {
"SOURCE", "FRAME_WIDTH", "FRAME_HEIGHT", "TARGET_FPS",
"INPUT_SIZE", "INPUT_SIZE_NEAR", "NEAR_SCENE_RATIO",
"CONF_THRESH", "MAX_ASPECT", "MIN_KEYPOINTS", "KEYPOINT_MIN_CONF",
"VEST_THRESH", "HELMET_THRESH",
"STABILIZE_WINDOW", "STABILIZE_RATIO", "TRACK_IOU", "TRACK_MAX_MISSING",
"SYSTEM_TITLE", "SIDEBAR_WIDTH", "SHOW_ANALYSIS_ZONES",
"HOST", "PORT", "STREAM_FPS", "JPEG_QUALITY",
"USE_OPENVINO", "TORCH_THREADS", "MODEL_PATH",
}
LOCAL_SETTINGS = ROOT / "settings_local.json"
def _apply_local_overrides() -> list[str]:
"""Aplica settings_local.json sobre os valores acima.
Mantem a configuracao especifica da maquina fora do repositorio,
de modo que atualizar o codigo nunca sobrescreva o ajuste local.
"""
if not LOCAL_SETTINGS.exists():
return []
try:
data = json.loads(LOCAL_SETTINGS.read_text(encoding="utf-8"))
except (json.JSONDecodeError, OSError):
return []
applied = []
for key, value in data.items():
if key in _OVERRIDABLE:
globals()[key] = value
applied.append(key)
return applied
APPLIED_OVERRIDES = _apply_local_overrides()