adicionado inversao no eixo de movimento do weed_detector
This commit is contained in:
parent
84e2c88b4f
commit
719a71917d
|
|
@ -71,6 +71,13 @@ class WeedDetector:
|
||||||
self.config.get("inverter_ordem_bicos", False)
|
self.config.get("inverter_ordem_bicos", False)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TESTE INLINE:
|
||||||
|
# False = lógica atual: erva caminha topo -> pé
|
||||||
|
# True = lógica invertida: erva caminha pé -> topo
|
||||||
|
self.inverter_sentido_vertical_bicos = bool(
|
||||||
|
self.config.get("inverter_sentido_vertical_bicos", True)
|
||||||
|
)
|
||||||
|
|
||||||
self.detector_debug_perf = bool(
|
self.detector_debug_perf = bool(
|
||||||
self.config.get("detector_debug_perf", False)
|
self.config.get("detector_debug_perf", False)
|
||||||
)
|
)
|
||||||
|
|
@ -145,16 +152,15 @@ class WeedDetector:
|
||||||
"""
|
"""
|
||||||
Converte os dois parâmetros de campo para zona de atuação normalizada.
|
Converte os dois parâmetros de campo para zona de atuação normalizada.
|
||||||
|
|
||||||
Convenção:
|
Convenção interna:
|
||||||
0.0 = topo da imagem
|
0.0 = topo da imagem
|
||||||
1.0 = pé da imagem
|
1.0 = pé da imagem
|
||||||
|
|
||||||
Exemplo:
|
Normal:
|
||||||
faixa_atuacao_bicos = 0.70
|
faixa=0.90, area=0.10 -> 90% até 100%, embaixo.
|
||||||
area_atuacao_bicos = 0.10
|
|
||||||
|
|
||||||
Resultado:
|
Com inverter_sentido_vertical_bicos=True:
|
||||||
zona de atuação = 70% até 80% da imagem
|
faixa=0.90, area=0.10 -> 0% até 10%, em cima.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
faixa = float(cfg.get("faixa_atuacao_bicos", 0.70) or 0.70)
|
faixa = float(cfg.get("faixa_atuacao_bicos", 0.70) or 0.70)
|
||||||
|
|
@ -172,6 +178,17 @@ class WeedDetector:
|
||||||
if fim < inicio:
|
if fim < inicio:
|
||||||
inicio, fim = fim, inicio
|
inicio, fim = fim, inicio
|
||||||
|
|
||||||
|
if getattr(self, "inverter_sentido_vertical_bicos", False):
|
||||||
|
# Espelha verticalmente.
|
||||||
|
# Exemplo: 0.90..1.00 vira 0.00..0.10.
|
||||||
|
inicio, fim = 1.0 - fim, 1.0 - inicio
|
||||||
|
|
||||||
|
inicio = max(0.0, min(1.0, inicio))
|
||||||
|
fim = max(0.0, min(1.0, fim))
|
||||||
|
|
||||||
|
if fim < inicio:
|
||||||
|
inicio, fim = fim, inicio
|
||||||
|
|
||||||
return inicio, fim
|
return inicio, fim
|
||||||
|
|
||||||
def atualizar_config(self, config: Optional[dict] = None):
|
def atualizar_config(self, config: Optional[dict] = None):
|
||||||
|
|
@ -187,6 +204,7 @@ class WeedDetector:
|
||||||
|
|
||||||
old_qtd = self.qtd_bicos
|
old_qtd = self.qtd_bicos
|
||||||
old_inv = self.inverter_ordem_bicos
|
old_inv = self.inverter_ordem_bicos
|
||||||
|
old_inv_vertical = getattr(self, "inverter_sentido_vertical_bicos", False)
|
||||||
old_num_cells = getattr(self, "num_cells", None)
|
old_num_cells = getattr(self, "num_cells", None)
|
||||||
old_cell_cm = getattr(self, "cell_cm", None)
|
old_cell_cm = getattr(self, "cell_cm", None)
|
||||||
old_comp_cm = getattr(self, "comprimento_visao_chao_cm", None)
|
old_comp_cm = getattr(self, "comprimento_visao_chao_cm", None)
|
||||||
|
|
@ -219,12 +237,19 @@ class WeedDetector:
|
||||||
self.inverter_ordem_bicos,
|
self.inverter_ordem_bicos,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
self.inverter_sentido_vertical_bicos = bool(
|
||||||
|
self.config.get(
|
||||||
|
"inverter_sentido_vertical_bicos",
|
||||||
|
self.inverter_sentido_vertical_bicos,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
self._atualizar_geometria_memoria()
|
self._atualizar_geometria_memoria()
|
||||||
|
|
||||||
mudou_mapeamento = (
|
mudou_mapeamento = (
|
||||||
old_qtd != self.qtd_bicos
|
old_qtd != self.qtd_bicos
|
||||||
or old_inv != self.inverter_ordem_bicos
|
or old_inv != self.inverter_ordem_bicos
|
||||||
|
or old_inv_vertical != self.inverter_sentido_vertical_bicos
|
||||||
or old_num_cells != self.num_cells
|
or old_num_cells != self.num_cells
|
||||||
or old_cell_cm != self.cell_cm
|
or old_cell_cm != self.cell_cm
|
||||||
or old_comp_cm != self.comprimento_visao_chao_cm
|
or old_comp_cm != self.comprimento_visao_chao_cm
|
||||||
|
|
@ -488,6 +513,10 @@ class WeedDetector:
|
||||||
"grid": grid_info,
|
"grid": grid_info,
|
||||||
"score_update": score_update_info,
|
"score_update": score_update_info,
|
||||||
"atuacao": estat_atuacao,
|
"atuacao": estat_atuacao,
|
||||||
|
|
||||||
|
"sentido_vertical_invertido": bool(
|
||||||
|
getattr(self, "inverter_sentido_vertical_bicos", False)
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
return atuacao_bicos, estatisticas
|
return atuacao_bicos, estatisticas
|
||||||
|
|
@ -564,14 +593,19 @@ class WeedDetector:
|
||||||
shift_cells: float,
|
shift_cells: float,
|
||||||
) -> np.ndarray:
|
) -> np.ndarray:
|
||||||
"""
|
"""
|
||||||
Desloca a memória para baixo na imagem.
|
Desloca a memória na direção física da atuação.
|
||||||
|
|
||||||
|
Convenção interna:
|
||||||
cell 0 = topo da imagem
|
cell 0 = topo da imagem
|
||||||
cell N-1 = pé da imagem
|
cell N-1 = pé da imagem
|
||||||
|
|
||||||
Se o rover avançou, o que estava na célula 20 vai para 21, 22...
|
Normal:
|
||||||
Portanto:
|
erva caminha topo -> pé
|
||||||
new[i] = old[i - shift]
|
old[20] -> new[21]
|
||||||
|
|
||||||
|
Invertido:
|
||||||
|
erva caminha pé -> topo
|
||||||
|
old[80] -> new[79]
|
||||||
"""
|
"""
|
||||||
if grid.size == 0:
|
if grid.size == 0:
|
||||||
return grid
|
return grid
|
||||||
|
|
@ -585,7 +619,13 @@ class WeedDetector:
|
||||||
return np.zeros_like(grid, dtype=np.float32)
|
return np.zeros_like(grid, dtype=np.float32)
|
||||||
|
|
||||||
idx = np.arange(n, dtype=np.float32)
|
idx = np.arange(n, dtype=np.float32)
|
||||||
src = idx - float(shift_cells)
|
|
||||||
|
if getattr(self, "inverter_sentido_vertical_bicos", False):
|
||||||
|
# Move a memória para cima: índices diminuem.
|
||||||
|
src = idx + float(shift_cells)
|
||||||
|
else:
|
||||||
|
# Move a memória para baixo: índices aumentam.
|
||||||
|
src = idx - float(shift_cells)
|
||||||
|
|
||||||
shifted = np.zeros_like(grid, dtype=np.float32)
|
shifted = np.zeros_like(grid, dtype=np.float32)
|
||||||
|
|
||||||
|
|
@ -749,8 +789,15 @@ class WeedDetector:
|
||||||
# porque elas chegarão na zona quando o bico abrir de fato.
|
# porque elas chegarão na zona quando o bico abrir de fato.
|
||||||
antecipacao_frac = max(0.0, vel_mps * lat_s * k_shift)
|
antecipacao_frac = max(0.0, vel_mps * lat_s * k_shift)
|
||||||
|
|
||||||
zona_eval_ini_frac = zona_ini_frac - antecipacao_frac
|
if getattr(self, "inverter_sentido_vertical_bicos", False):
|
||||||
zona_eval_fim_frac = zona_fim_frac - antecipacao_frac
|
# Se a erva vem do pé para o topo, antecipar significa olhar
|
||||||
|
# um pouco abaixo da zona real, pois ela ainda vai subir até o bico.
|
||||||
|
zona_eval_ini_frac = zona_ini_frac + antecipacao_frac
|
||||||
|
zona_eval_fim_frac = zona_fim_frac + antecipacao_frac
|
||||||
|
else:
|
||||||
|
# Lógica atual: erva vem do topo para o pé.
|
||||||
|
zona_eval_ini_frac = zona_ini_frac - antecipacao_frac
|
||||||
|
zona_eval_fim_frac = zona_fim_frac - antecipacao_frac
|
||||||
|
|
||||||
zona_eval_ini_frac = max(0.0, min(1.0, zona_eval_ini_frac))
|
zona_eval_ini_frac = max(0.0, min(1.0, zona_eval_ini_frac))
|
||||||
zona_eval_fim_frac = max(0.0, min(1.0, zona_eval_fim_frac))
|
zona_eval_fim_frac = max(0.0, min(1.0, zona_eval_fim_frac))
|
||||||
|
|
@ -841,6 +888,10 @@ class WeedDetector:
|
||||||
if zona_scores.size
|
if zona_scores.size
|
||||||
else np.zeros(self.qtd_bicos, dtype=np.float32)
|
else np.zeros(self.qtd_bicos, dtype=np.float32)
|
||||||
),
|
),
|
||||||
|
|
||||||
|
"sentido_vertical_invertido": bool(
|
||||||
|
getattr(self, "inverter_sentido_vertical_bicos", False)
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
def _agregar_score_zona(
|
def _agregar_score_zona(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue