723 lines
28 KiB
C#
723 lines
28 KiB
C#
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Newtonsoft.Json;
|
|
using static AgroBase.Models.Enums;
|
|
|
|
namespace AgroBase.Models.Operadores
|
|
{
|
|
public class VisualWorkerModel
|
|
{
|
|
public DateTime Momento { get; set; }
|
|
public bool Iniciado { get; set; }
|
|
public DateTime IniciadoEm { get; set; }
|
|
public bool Pronto { get; set; }
|
|
public DateTime ProntoEm { get; set; }
|
|
public DateTime UltimaMensagem { get; set; }
|
|
[JsonIgnore]
|
|
public Dictionary<TipoFrameCamera, OAKCameraFrameModel> CameraFrames { get; set; } = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
|
public VisualWorkerMessageAnaliseModel Analises { get; set; } = new VisualWorkerMessageAnaliseModel();
|
|
public OAKImuModel Imu { get; set; } = new OAKImuModel();
|
|
public StatusModulo Status { get; set; }
|
|
public bool StatusValido => new List<StatusModulo>() { StatusModulo.Operante, StatusModulo.Alerta }.Contains(Status);
|
|
public VisualWorkerResumoModel Resumo { get; set; }
|
|
public VisualWorkerPerformanceModel Performance { get; set; } = new VisualWorkerPerformanceModel();
|
|
public VisualWorkerRedisTimestampsModel Timestamps { get; set; } = new VisualWorkerRedisTimestampsModel();
|
|
|
|
public VisualWorkerModel Clone()
|
|
{
|
|
return new VisualWorkerModel()
|
|
{
|
|
Momento = Momento,
|
|
Iniciado = Iniciado,
|
|
IniciadoEm = IniciadoEm,
|
|
Pronto = Pronto,
|
|
ProntoEm = ProntoEm,
|
|
CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>(CameraFrames ?? new Dictionary<TipoFrameCamera, OAKCameraFrameModel>()),
|
|
Analises = Analises?.Clone(),
|
|
Imu = Imu?.Clone(),
|
|
UltimaMensagem = UltimaMensagem,
|
|
Status = Status,
|
|
Resumo = Resumo?.Clone(),
|
|
Performance = Performance?.Clone() ?? new VisualWorkerPerformanceModel(),
|
|
Timestamps = Timestamps?.Clone() ?? new VisualWorkerRedisTimestampsModel(),
|
|
};
|
|
}
|
|
|
|
public void ReiniciarEstado()
|
|
{
|
|
Iniciado = false;
|
|
IniciadoEm = DateTime.MinValue;
|
|
Pronto = false;
|
|
ProntoEm = DateTime.MinValue;
|
|
CameraFrames = new Dictionary<TipoFrameCamera, OAKCameraFrameModel>();
|
|
Analises = new VisualWorkerMessageAnaliseModel();
|
|
Imu = new OAKImuModel();
|
|
Resumo = new VisualWorkerResumoModel();
|
|
Status = StatusModulo.Desconectado;
|
|
Performance = new VisualWorkerPerformanceModel();
|
|
Timestamps = new VisualWorkerRedisTimestampsModel();
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerRedisTimestampsModel
|
|
{
|
|
public double analise { get; set; }
|
|
public double segmentacao { get; set; }
|
|
public double deteccao { get; set; }
|
|
public double matriz_confianca { get; set; }
|
|
public double performance_visual { get; set; }
|
|
|
|
public VisualWorkerRedisTimestampsModel Clone()
|
|
{
|
|
return (VisualWorkerRedisTimestampsModel)MemberwiseClone();
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerResumoModel
|
|
{
|
|
// Operacional
|
|
public StatusCarroMapa StatusCarro { get; set; }
|
|
public double ErroLateral { get; set; }
|
|
public double ErroAngular { get; set; }
|
|
public string Modo { get; set; }
|
|
|
|
// Segurança / bloqueio
|
|
public bool ParadaDetectada { get; set; } = false;
|
|
public bool DeveParar { get; set; } = false;
|
|
public bool EnviarComandoParada { get; set; } = false;
|
|
public bool EnviarComandoRetomada { get; set; } = false;
|
|
|
|
// Novo: operador + técnico enxuto
|
|
public VisualWorkerResumoOperacionalModel Operacional { get; set; } = new VisualWorkerResumoOperacionalModel();
|
|
public VisualWorkerResumoTecnicoModel Tecnico { get; set; } = new VisualWorkerResumoTecnicoModel();
|
|
|
|
private bool _comandoParadaEnviado { get; set; } = false;
|
|
|
|
|
|
public void AtualizarDados(VisualWorkerModel Sonar)
|
|
{
|
|
Modo = Sonar?.Analises?.matriz_confianca?.block?.decision?.mode ?? "free";
|
|
ParadaDetectada = (Sonar?.Analises?.matriz_confianca?.block?.decision?.parar ?? false);
|
|
StatusCarro = Sonar?.Analises?.segmentacao?.status_corredor ?? StatusCarroMapa.Indefinido;
|
|
ErroLateral = Sonar?.Analises?.segmentacao?.erro_lateral_pct ?? 0;
|
|
ErroAngular = Sonar?.Analises?.segmentacao?.erro_angular ?? 0;
|
|
|
|
AtualizarResumoOperacional(Sonar);
|
|
AtualizarResumoTecnico(Sonar);
|
|
}
|
|
|
|
private void AtualizarResumoOperacional(VisualWorkerModel visual)
|
|
{
|
|
var block = visual?.Analises?.matriz_confianca?.block;
|
|
var decision = block?.decision;
|
|
var trend = block?.trend;
|
|
var debug = visual?.Analises?.segmentacao?.status_corredor_debug;
|
|
|
|
Operacional.DistanciaObstaculoM = block?.d_block_line_m;
|
|
Operacional.VelocidadeMaxSugeridaMps = decision?.v_max_sugerida_mps;
|
|
Operacional.RiscoObstaculo = decision?.risk_ema ?? trend?.risk_ema ?? 0;
|
|
|
|
Operacional.MotivoBloqueio = block?.reason;
|
|
Operacional.DetalheBloqueio = block?.reason_detail;
|
|
|
|
Operacional.OrigemStatusCorredor = debug?.origem_status;
|
|
Operacional.ConfiancaStatusCorredor = debug?.status_modelo_conf ?? 0;
|
|
}
|
|
|
|
private void AtualizarResumoTecnico(VisualWorkerModel visual)
|
|
{
|
|
var perf = visual?.Performance;
|
|
var ts = visual?.Timestamps;
|
|
|
|
Tecnico.FpsModeloIA = GetFps(perf, "segmentacao");
|
|
Tecnico.FpsDeteccao = GetFps(perf, "deteccao");
|
|
Tecnico.FpsMatrizConfianca = GetFps(perf, "matriz_confianca");
|
|
Tecnico.FpsAnalise = GetFps(perf, "analise");
|
|
|
|
Tecnico.LatenciaModeloMs = GetLatenciaMediaMs(perf, "segmentacao");
|
|
Tecnico.LatenciaDeteccaoMs = GetLatenciaMediaMs(perf, "deteccao");
|
|
|
|
var nowUnix = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() / 1000.0;
|
|
|
|
Tecnico.IdadeAnaliseMs = AgeMs(nowUnix, ts?.analise ?? 0);
|
|
Tecnico.IdadeSegmentacaoMs = AgeMs(nowUnix, ts?.segmentacao ?? 0);
|
|
Tecnico.IdadeDeteccaoMs = AgeMs(nowUnix, ts?.deteccao ?? 0);
|
|
Tecnico.IdadeMatrizConfiancaMs = AgeMs(nowUnix, ts?.matriz_confianca ?? 0);
|
|
|
|
Tecnico.TemSegmentacao = perf?.visual_cache?.tem_seg ?? false;
|
|
Tecnico.TemGrid = perf?.visual_cache?.tem_grid ?? false;
|
|
|
|
Tecnico.ModeloTravado =
|
|
Tecnico.IdadeSegmentacaoMs > 1500 ||
|
|
Tecnico.FpsModeloIA <= 0.2;
|
|
|
|
Tecnico.VisualAtrasado =
|
|
Tecnico.IdadeAnaliseMs > 1500 ||
|
|
Tecnico.IdadeMatrizConfiancaMs > 1500;
|
|
|
|
Tecnico.SaudeVisual = CalcularSaudeVisual();
|
|
}
|
|
|
|
private static double GetFps(VisualWorkerPerformanceModel perf, string loopName)
|
|
{
|
|
if (perf?.loops == null)
|
|
return 0;
|
|
|
|
return perf.loops.TryGetValue(loopName, out var loop)
|
|
? loop?.fps_real ?? 0
|
|
: 0;
|
|
}
|
|
|
|
private static double GetLatenciaMediaMs(VisualWorkerPerformanceModel perf, string loopName)
|
|
{
|
|
if (perf?.loops == null)
|
|
return 0;
|
|
|
|
if (!perf.loops.TryGetValue(loopName, out var loop) || loop?.latencia_ms == null)
|
|
return 0;
|
|
|
|
// Ajusta o nome conforme o JSON real: "avg", "mean", "media", etc.
|
|
return loop.latencia_ms["avg"]?.Value<double>()
|
|
?? loop.latencia_ms["mean"]?.Value<double>()
|
|
?? loop.latencia_ms["media"]?.Value<double>()
|
|
?? 0;
|
|
}
|
|
|
|
private static double AgeMs(double nowUnix, double tsUnix)
|
|
{
|
|
if (tsUnix <= 0)
|
|
return 999999;
|
|
|
|
return Math.Max(0, (nowUnix - tsUnix) * 1000.0);
|
|
}
|
|
|
|
private string CalcularSaudeVisual()
|
|
{
|
|
if (Tecnico.ModeloTravado)
|
|
return "travado";
|
|
|
|
if (Tecnico.VisualAtrasado)
|
|
return "atrasado";
|
|
|
|
if (Tecnico.FpsModeloIA < 2)
|
|
return "lento";
|
|
|
|
return "ok";
|
|
}
|
|
|
|
public void AtualizarStatusBloqueioManual(VisualWorkerModel Sonar, bool consideraEmMovimento)
|
|
{
|
|
var op = Variaveis.OperacaoEmAndamento;
|
|
|
|
if (!(op.Parametros?.Controle?.OakParadaPorObstaculo ?? false))
|
|
{
|
|
_comandoParadaEnviado = false;
|
|
DeveParar = false;
|
|
EnviarComandoParada = false;
|
|
EnviarComandoRetomada = false;
|
|
}
|
|
else
|
|
{
|
|
List<Direcao> _direcoesInterromperMovimento = new List<Direcao> { Direcao.Frente }; //, Direcao.Tras
|
|
Direcao _ultimaDirecaoControle = op.Controle?.TiposControle?.FirstOrDefault(x => x?.Tipo == T_Code.Mov)?.UltimaDirecao ?? Direcao.Parado;
|
|
bool _carroEmMovimento = _direcoesInterromperMovimento.Contains(_ultimaDirecaoControle);
|
|
bool emMovimento = consideraEmMovimento ? _carroEmMovimento : true;
|
|
DeveParar = Sonar?.StatusValido == true && (ParadaDetectada || Modo == "stop");
|
|
EnviarComandoParada = DeveParar && emMovimento;
|
|
if (EnviarComandoParada)
|
|
{
|
|
_comandoParadaEnviado = true;
|
|
}
|
|
EnviarComandoRetomada = !ParadaDetectada && _comandoParadaEnviado;
|
|
if (EnviarComandoRetomada)
|
|
{
|
|
_comandoParadaEnviado = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public VisualWorkerResumoModel Clone()
|
|
{
|
|
return new VisualWorkerResumoModel()
|
|
{
|
|
StatusCarro = StatusCarro,
|
|
ErroLateral = ErroLateral,
|
|
ErroAngular = ErroAngular,
|
|
Modo = Modo,
|
|
ParadaDetectada = ParadaDetectada,
|
|
DeveParar = DeveParar,
|
|
EnviarComandoParada = EnviarComandoParada,
|
|
EnviarComandoRetomada = EnviarComandoRetomada,
|
|
_comandoParadaEnviado = _comandoParadaEnviado,
|
|
Operacional = Operacional?.Clone() ?? new VisualWorkerResumoOperacionalModel(),
|
|
Tecnico = Tecnico?.Clone() ?? new VisualWorkerResumoTecnicoModel(),
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
public class VisualWorkerResumoTecnicoModel
|
|
{
|
|
public double FpsModeloIA { get; set; }
|
|
public double FpsDeteccao { get; set; }
|
|
public double FpsMatrizConfianca { get; set; }
|
|
public double FpsAnalise { get; set; }
|
|
|
|
public double LatenciaModeloMs { get; set; }
|
|
public double LatenciaDeteccaoMs { get; set; }
|
|
|
|
public double IdadeAnaliseMs { get; set; }
|
|
public double IdadeSegmentacaoMs { get; set; }
|
|
public double IdadeDeteccaoMs { get; set; }
|
|
public double IdadeMatrizConfiancaMs { get; set; }
|
|
|
|
public bool TemSegmentacao { get; set; }
|
|
public bool TemGrid { get; set; }
|
|
|
|
public bool ModeloTravado { get; set; }
|
|
public bool VisualAtrasado { get; set; }
|
|
public string SaudeVisual { get; set; } = "desconhecida";
|
|
|
|
public VisualWorkerResumoTecnicoModel Clone()
|
|
{
|
|
return new VisualWorkerResumoTecnicoModel()
|
|
{
|
|
FpsAnalise = FpsAnalise,
|
|
FpsDeteccao = FpsDeteccao,
|
|
FpsMatrizConfianca = FpsMatrizConfianca,
|
|
FpsModeloIA = FpsModeloIA,
|
|
IdadeAnaliseMs = IdadeAnaliseMs,
|
|
IdadeDeteccaoMs = IdadeDeteccaoMs,
|
|
IdadeMatrizConfiancaMs = IdadeMatrizConfiancaMs,
|
|
IdadeSegmentacaoMs = IdadeSegmentacaoMs,
|
|
LatenciaDeteccaoMs = LatenciaDeteccaoMs,
|
|
LatenciaModeloMs = LatenciaModeloMs,
|
|
ModeloTravado = ModeloTravado,
|
|
SaudeVisual = SaudeVisual,
|
|
TemGrid = TemGrid,
|
|
TemSegmentacao = TemSegmentacao,
|
|
VisualAtrasado = VisualAtrasado
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerResumoOperacionalModel
|
|
{
|
|
public double? DistanciaObstaculoM { get; set; }
|
|
public double? VelocidadeMaxSugeridaMps { get; set; }
|
|
public double RiscoObstaculo { get; set; }
|
|
|
|
public string MotivoBloqueio { get; set; }
|
|
public string DetalheBloqueio { get; set; }
|
|
|
|
public string OrigemStatusCorredor { get; set; }
|
|
public double ConfiancaStatusCorredor { get; set; }
|
|
|
|
public VisualWorkerResumoOperacionalModel Clone()
|
|
{
|
|
return new VisualWorkerResumoOperacionalModel()
|
|
{
|
|
ConfiancaStatusCorredor = ConfiancaStatusCorredor,
|
|
DetalheBloqueio = DetalheBloqueio,
|
|
DistanciaObstaculoM = DistanciaObstaculoM,
|
|
MotivoBloqueio = MotivoBloqueio,
|
|
OrigemStatusCorredor = OrigemStatusCorredor,
|
|
RiscoObstaculo = RiscoObstaculo,
|
|
VelocidadeMaxSugeridaMps = VelocidadeMaxSugeridaMps
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageAnaliseModel
|
|
{
|
|
public DateTime timestamp { get; set; }
|
|
public VisualWorkerMessageSegmentacaoSemanticaModel segmentacao { get; set; } = new VisualWorkerMessageSegmentacaoSemanticaModel();
|
|
public VisualWorkerMessageMatrizConfiancaModel matriz_confianca { get; set; } = new VisualWorkerMessageMatrizConfiancaModel();
|
|
public List<VisualWorkerMessageDeteccaoModel> deteccao { get; set; } = new List<VisualWorkerMessageDeteccaoModel>();
|
|
|
|
public VisualWorkerMessageAnaliseModel Clone()
|
|
{
|
|
return new VisualWorkerMessageAnaliseModel()
|
|
{
|
|
timestamp = timestamp,
|
|
segmentacao = segmentacao?.Clone() ?? new VisualWorkerMessageSegmentacaoSemanticaModel(),
|
|
matriz_confianca = matriz_confianca?.Clone() ?? new VisualWorkerMessageMatrizConfiancaModel(),
|
|
deteccao = deteccao?.Select(x => x.Clone()).ToList() ?? new List<VisualWorkerMessageDeteccaoModel>()
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageAnaliseBBoxModel
|
|
{
|
|
public string tipo { get; set; }
|
|
public List<double> bbox { get; set; } // [x, y, w, h]
|
|
public List<double> centro_percentual { get; set; } // [x%, y%]
|
|
public double? distancia_m { get; set; }
|
|
public double? largura_m { get; set; }
|
|
public double? altura_m { get; set; }
|
|
public List<double> profundidades { get; set; } // [z1, z2] ou null
|
|
public double? variacao { get; set; } // delta Z ou null
|
|
}
|
|
|
|
public class VisualWorkerMessageSegmentacaoSemanticaModel
|
|
{
|
|
public double timestamp { get; set; }
|
|
public int height { get; set; }
|
|
public int width { get; set; }
|
|
public double? erro_angular { get; set; }
|
|
public double? erro_lateral_pct { get; set; }
|
|
public StatusCarroMapa status_corredor { get; set; }
|
|
public StatusCarroMapa status_corredor_anterior { get; set; }
|
|
public VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel status_corredor_debug { get; set; }
|
|
public List<double?[]> centros_corredor { get; set; } = new List<double?[]>();
|
|
public List<int> larguras_px { get; set; } = new List<int>();
|
|
|
|
public VisualWorkerMessageSegmentacaoSemanticaModel Clone()
|
|
{
|
|
return new VisualWorkerMessageSegmentacaoSemanticaModel()
|
|
{
|
|
timestamp = timestamp,
|
|
height = height,
|
|
width = width,
|
|
erro_angular = erro_angular,
|
|
erro_lateral_pct = erro_lateral_pct,
|
|
status_corredor = status_corredor,
|
|
status_corredor_anterior = status_corredor_anterior,
|
|
status_corredor_debug = status_corredor_debug?.Clone(),
|
|
centros_corredor = centros_corredor?
|
|
.Select(x => x?.ToArray())
|
|
.ToList()
|
|
?? new List<double?[]>(),
|
|
larguras_px = new List<int>(larguras_px ?? new List<int>()),
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel
|
|
{
|
|
public string origem_status { get; set; }
|
|
public StatusCarroMapa status_modelo { get; set; }
|
|
public string status_modelo_nome { get; set; }
|
|
public string status_modelo_label_name { get; set; }
|
|
public double status_modelo_conf { get; set; }
|
|
public dynamic status_modelo_probs { get; set; }
|
|
public StatusCarroMapa status_heuristico { get; set; }
|
|
public string status_heuristico_nome { get; set; }
|
|
public dynamic heuristica_debug { get; set; }
|
|
|
|
public VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel Clone()
|
|
{
|
|
return new VisualWorkerMessageSegmentacaoSemanticaDebugCorredorModel
|
|
{
|
|
origem_status = origem_status,
|
|
status_modelo = status_modelo,
|
|
status_modelo_nome = status_modelo_nome,
|
|
status_modelo_label_name = status_modelo_label_name,
|
|
status_modelo_conf = status_modelo_conf,
|
|
status_modelo_probs = CloneDynamic(status_modelo_probs),
|
|
status_heuristico = status_heuristico,
|
|
status_heuristico_nome = status_heuristico_nome,
|
|
heuristica_debug = CloneDynamic(heuristica_debug)
|
|
};
|
|
}
|
|
|
|
private static object CloneDynamic(object valor)
|
|
{
|
|
if (valor is JToken token)
|
|
return token.DeepClone();
|
|
|
|
return valor;
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageMatrizConfiancaModel
|
|
{
|
|
public float ts { get; set; }
|
|
public int seq { get; set; }
|
|
public int grid_w { get; set; }
|
|
public int grid_h { get; set; }
|
|
public List<float> y_range_m { get; set; } = new List<float>();
|
|
public List<float> row_dist_m { get; set; } = new List<float>();
|
|
public List<float> row_scale_x_m { get; set; } = new List<float>();
|
|
public VisualWorkerMessageMatrizConfiancaBlockModel block { get; set; } = new VisualWorkerMessageMatrizConfiancaBlockModel();
|
|
|
|
public VisualWorkerMessageMatrizConfiancaModel Clone()
|
|
{
|
|
return new VisualWorkerMessageMatrizConfiancaModel()
|
|
{
|
|
ts = ts,
|
|
seq = seq,
|
|
grid_w = grid_w,
|
|
grid_h = grid_h,
|
|
y_range_m = new List<float>(y_range_m ?? new List<float>()),
|
|
row_dist_m = new List<float>(row_dist_m ?? new List<float>()),
|
|
row_scale_x_m = new List<float>(row_scale_x_m ?? new List<float>()),
|
|
block = block?.Clone() ?? new VisualWorkerMessageMatrizConfiancaBlockModel(),
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageMatrizConfiancaBlockModel
|
|
{
|
|
public float? d_block_line_m { get; set; }
|
|
public float d_obs_true_min_m { get; set; }
|
|
public bool blocked { get; set; }
|
|
public bool blocked_raw { get; set; }
|
|
public string reason { get; set; }
|
|
public string reason_detail { get; set; }
|
|
public VisualWorkerMessageMatrizConfiancaBlockDecisionModel decision { get; set; }
|
|
public VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel trend { get; set; }
|
|
|
|
public VisualWorkerMessageMatrizConfiancaBlockModel Clone()
|
|
{
|
|
return new VisualWorkerMessageMatrizConfiancaBlockModel()
|
|
{
|
|
d_block_line_m = d_block_line_m,
|
|
d_obs_true_min_m = d_obs_true_min_m,
|
|
blocked = blocked,
|
|
blocked_raw = blocked_raw,
|
|
reason = reason,
|
|
reason_detail = reason_detail,
|
|
decision = decision?.Clone(),
|
|
trend = trend?.Clone()
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageMatrizConfiancaBlockDecisionModel
|
|
{
|
|
public bool parar { get; set; }
|
|
public float dist_necessaria { get; set; }
|
|
public float? v_max_sugerida_mps { get; set; }
|
|
public int frames_on { get; set; }
|
|
public int frames_off { get; set; }
|
|
public int N_on { get; set; }
|
|
public int N_off { get; set; }
|
|
public string mode { get; set; }
|
|
public double risk_ema { get; set; }
|
|
public int frames_risk_on { get; set; }
|
|
|
|
public VisualWorkerMessageMatrizConfiancaBlockDecisionModel Clone()
|
|
{
|
|
return new VisualWorkerMessageMatrizConfiancaBlockDecisionModel()
|
|
{
|
|
parar = parar,
|
|
dist_necessaria = dist_necessaria,
|
|
v_max_sugerida_mps = v_max_sugerida_mps,
|
|
frames_on = frames_on,
|
|
frames_off = frames_off,
|
|
N_on = N_on,
|
|
N_off = N_off,
|
|
mode = mode,
|
|
frames_risk_on = frames_risk_on,
|
|
risk_ema = risk_ema
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel
|
|
{
|
|
public double risk_raw { get; set; }
|
|
public double risk_ema { get; set; }
|
|
public string band { get; set; }
|
|
public double delta_central { get; set; }
|
|
public double delta_side_bias { get; set; }
|
|
public double approaching_obs_m { get; set; }
|
|
public double approaching_det_m { get; set; }
|
|
public int frames_risk_on { get; set; }
|
|
public int frames_risk_off { get; set; }
|
|
|
|
public VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel Clone()
|
|
{
|
|
return new VisualWorkerMessageMatrizConfiancaBlockDecisionTrendModel()
|
|
{
|
|
risk_raw = risk_raw,
|
|
risk_ema = risk_ema,
|
|
band = band,
|
|
delta_central = delta_central,
|
|
delta_side_bias = delta_side_bias,
|
|
approaching_obs_m = approaching_obs_m,
|
|
approaching_det_m = approaching_det_m,
|
|
frames_risk_on = frames_risk_on,
|
|
frames_risk_off = frames_risk_off
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerMessageDeteccaoModel
|
|
{
|
|
public int label_id { get; set; }
|
|
public string label { get; set; }
|
|
public double conf { get; set; }
|
|
public List<double> bbox_norm { get; set; }
|
|
public List<double> bbox_px { get; set; }
|
|
public int track_id { get; set; }
|
|
public string track_status { get; set; }
|
|
public bool tem_tracker { get; set; }
|
|
public List<double> xyz_m { get; set; }
|
|
public double? distancia_m { get; set; }
|
|
public double? lateral_m { get; set; }
|
|
public double? altura_relativa_m { get; set; }
|
|
public List<double> bbox_full { get; set; }
|
|
|
|
public VisualWorkerMessageDeteccaoModel Clone()
|
|
{
|
|
return new VisualWorkerMessageDeteccaoModel()
|
|
{
|
|
label_id = label_id,
|
|
label = label,
|
|
bbox_norm = bbox_norm != null
|
|
? new List<double>(bbox_norm)
|
|
: new List<double>(),
|
|
bbox_px = bbox_px != null
|
|
? new List<double>(bbox_px)
|
|
: new List<double>(),
|
|
conf = conf,
|
|
track_id = track_id,
|
|
track_status = track_status,
|
|
tem_tracker = tem_tracker,
|
|
xyz_m = xyz_m != null
|
|
? new List<double>(xyz_m)
|
|
: new List<double>(),
|
|
distancia_m = distancia_m,
|
|
lateral_m = lateral_m,
|
|
altura_relativa_m = altura_relativa_m,
|
|
bbox_full = bbox_full != null
|
|
? new List<double>(bbox_full)
|
|
: new List<double>(),
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
public class VisualWorkerPerformanceModel
|
|
{
|
|
public double timestamp { get; set; }
|
|
public Dictionary<string, VisualWorkerPerformanceLoopModel> loops { get; set; } = new Dictionary<string, VisualWorkerPerformanceLoopModel>();
|
|
public JObject sync { get; set; } = new JObject();
|
|
public JObject camera_cache { get; set; } = new JObject();
|
|
public VisualWorkerPerformanceCacheModel visual_cache { get; set; } = new VisualWorkerPerformanceCacheModel();
|
|
public VisualWorkerPerformancePublicacaoModel pub_debug { get; set; } = new VisualWorkerPerformancePublicacaoModel();
|
|
public JObject contadores { get; set; } = new JObject();
|
|
|
|
[JsonExtensionData]
|
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
|
|
|
public VisualWorkerPerformanceModel Clone()
|
|
{
|
|
return new VisualWorkerPerformanceModel
|
|
{
|
|
timestamp = timestamp,
|
|
loops = loops?.ToDictionary(
|
|
x => x.Key,
|
|
x => x.Value?.Clone()
|
|
) ?? new Dictionary<string, VisualWorkerPerformanceLoopModel>(),
|
|
|
|
sync = sync != null ? (JObject)sync.DeepClone() : new JObject(),
|
|
camera_cache = camera_cache != null
|
|
? (JObject)camera_cache.DeepClone()
|
|
: new JObject(),
|
|
|
|
visual_cache = visual_cache?.Clone()
|
|
?? new VisualWorkerPerformanceCacheModel(),
|
|
|
|
pub_debug = pub_debug?.Clone()
|
|
?? new VisualWorkerPerformancePublicacaoModel(),
|
|
|
|
contadores = contadores != null
|
|
? (JObject)contadores.DeepClone()
|
|
: new JObject(),
|
|
|
|
Extra = Extra?.ToDictionary(
|
|
x => x.Key,
|
|
x => x.Value?.DeepClone()
|
|
) ?? new Dictionary<string, JToken>()
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerPerformanceLoopModel
|
|
{
|
|
public double fps_real { get; set; }
|
|
public JObject periodo_ms { get; set; } = new JObject();
|
|
public JObject latencia_ms { get; set; } = new JObject();
|
|
public Dictionary<string, JObject> metrics_ms { get; set; } = new Dictionary<string, JObject>();
|
|
|
|
[JsonExtensionData]
|
|
public IDictionary<string, JToken> Extra { get; set; } = new Dictionary<string, JToken>();
|
|
|
|
public VisualWorkerPerformanceLoopModel Clone()
|
|
{
|
|
return new VisualWorkerPerformanceLoopModel
|
|
{
|
|
fps_real = fps_real,
|
|
periodo_ms = periodo_ms != null
|
|
? (JObject)periodo_ms.DeepClone()
|
|
: new JObject(),
|
|
|
|
latencia_ms = latencia_ms != null
|
|
? (JObject)latencia_ms.DeepClone()
|
|
: new JObject(),
|
|
|
|
metrics_ms = metrics_ms?.ToDictionary(
|
|
x => x.Key,
|
|
x => x.Value != null
|
|
? (JObject)x.Value.DeepClone()
|
|
: new JObject()
|
|
) ?? new Dictionary<string, JObject>(),
|
|
|
|
Extra = Extra?.ToDictionary(
|
|
x => x.Key,
|
|
x => x.Value?.DeepClone()
|
|
) ?? new Dictionary<string, JToken>()
|
|
};
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerPerformanceCacheModel
|
|
{
|
|
public double seg_ts { get; set; }
|
|
public double det_ts { get; set; }
|
|
public double grid_ts { get; set; }
|
|
|
|
public bool tem_seg { get; set; }
|
|
public bool tem_grid { get; set; }
|
|
|
|
public VisualWorkerPerformanceCacheModel Clone()
|
|
{
|
|
return (VisualWorkerPerformanceCacheModel)MemberwiseClone();
|
|
}
|
|
}
|
|
|
|
public class VisualWorkerPerformancePublicacaoModel
|
|
{
|
|
public double ts { get; set; }
|
|
public int publicou { get; set; }
|
|
public int campos { get; set; }
|
|
public double redis_ms { get; set; }
|
|
|
|
public VisualWorkerPerformancePublicacaoModel Clone()
|
|
{
|
|
return (VisualWorkerPerformancePublicacaoModel)MemberwiseClone();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public enum VisualWorkerCommandType
|
|
{
|
|
ScriptCarregado = 1,
|
|
CalibrarProfundidade = 2,
|
|
IniciarCameraManager = 3,
|
|
AtualizarSaudeCamera = 4,
|
|
GetCameraFrame = 5,
|
|
SaveCameraFrames = 6,
|
|
EnviarImagemMock = 7
|
|
}
|
|
|
|
|
|
|
|
}
|