From 6853d3f26410b852b25c905b0fe2cb08efa18f55 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Fri, 15 Aug 2025 16:03:05 -0300 Subject: [PATCH] adicionado ia de deteccao de objetos ao visual worker --- .../__pycache__/camera_oak.cpython-311.pyc | Bin 22917 -> 31498 bytes .../workers/camera_worker/camera_oak.py | 203 ++++++++++++++++-- .../camera_manager.cpython-311.pyc | Bin 78311 -> 87745 bytes .../__pycache__/config.cpython-311.pyc | Bin 3459 -> 3994 bytes .../workers/visual_worker/camera_manager.py | 200 ++++++++++++++++- .../Scripts/workers/visual_worker/config.py | 31 ++- .../segmentacao_semantica.cpython-311.pyc | Bin 22607 -> 22613 bytes .../processamento/segmentacao_semantica.py | 4 +- .../camera_manager.cpython-311.pyc | Bin 15146 -> 15292 bytes .../__pycache__/config.cpython-311.pyc | Bin 4801 -> 4809 bytes .../__pycache__/weed_detector.cpython-311.pyc | Bin 21408 -> 21418 bytes .../workers/weed_worker/camera_manager.py | 6 +- .../Scripts/workers/weed_worker/config.py | 6 +- .../workers/weed_worker/weed_detector.py | 12 +- Python/OAK/datasets/_7_convert_fastscnn.py | 3 +- Python/OAK/datasets/config.json | 3 +- 16 files changed, 418 insertions(+), 50 deletions(-) diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/__pycache__/camera_oak.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/camera_worker/__pycache__/camera_oak.cpython-311.pyc index 90fe9a08360a5e44d759f6f6fa1273a018d36d5b..2226b50b64846bdb7d65b41138e6d988874e9111 100644 GIT binary patch delta 11977 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

#KDg3G_o%nE7Uj=p10Xa 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 delta 9795 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 diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/__pycache__/config.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/__pycache__/config.cpython-311.pyc index 9ce2ba71136afc2521074bca672c135d3fbf81a1..112f93d3b9a3537d4c470bb4667bdf3cb448bf62 100644 GIT binary patch delta 1088 zcmaKq&2JM&6u@Wfwb$#l9ZU+b<9rf6vXn$sIq{LY4kZY+4gw+&G?lx%GdQalPc*Xu zfj|x-2d>ptYE)6R>ZRNOapXk*0$1u`HBu!msOoJIAVuQBn@vEWNIdEN^k&|hH*e;> z+m)Y(3xDMESp>3Y_1A^_JwFsm_~^rZF1 zJas;?$!UxRcZCDPVPz;B8vSi-?Lt@?h|F|38zI1*{HsFHHNNkh##;`>37*G%xi#5G z?e+Eb_io-2{Av!PT)C^2#C9n1PR*)KC7(=b(^&sg!$21W_p{Z`BseV`zlayX<^_cu zKo&Xu|HD6r{d1tA7qEi736H_;6Q{mstK@F9ri!vODqYL3d#1O<6oy*_&E@O-Vw*|aTa zoe|m+^JkWAF|XQoaMEcp$J!yYj_oc&&~lqd!={`qwd^*Py5qUm+!mFZ<8dN8n!{{g zrXA+{u$gq0g-p6OSMX)ZU9df6v#Zi1UfXLoecMrSgf(SqfpI~lahdsyJKiFd=_Seq zYfEzp(ov#rgd}2t(j}=0cFC40pW9wr8vd2btnK-%!>tS-g=g_y3S$cDr}!R#)IB>M zIleDmxh-1=D&js_SelJvr)FnPo@jh^d`_tG9ogvH#<;4_*c{h7_%48oF90j(X=yMl zRl>ghuz&FIn!8pG`$}Q&&ahmK66sIWjJ`#&r#BrTz{=Or2+H+!wViQ?Ej(il1k>h| z{hvZcnSWbIeePuaxYWL3?jqk0o{h0mL&NLAcy2KJEtslOapcjdToQkI0GA{5KISpT RlM#A{bP@MO=tIPXyaAvPBH#c3 delta 559 zcmbOw-z?3yoR^o20SG32nwufXJCRR<(QKo-2BWY*3SSFjlw=Bj3qzDt3S%&Xrr_ob z#tp1oY(T}#K>S%|vJ$&8(;Sw`p6s^F>?s_RJK3dKIcB+9V2UXRZ)^KrGao pY``bW1&SD8NHY}cY!2sRW;E1hl>ESeN<=X-GHQKbz$Czy0stElfaU-I diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py index 03796397d..e296c016f 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/camera_manager.py @@ -33,11 +33,13 @@ class CameraManager: self._ultima_analise_solo = {} self._ultima_analise_radar = {} self._ultima_analise_segmentacao = {} + self._ultima_analise_deteccao = {} self._ultima_analise_matriz_confianca = {} self._ultima_analise_matriz_custo = {} self._ultimo_rgb_frame = None self._ultimo_depth_frame = None self._ts_segmentacao_anterior = 0 + self._ts_deteccao_anterior = 0 self._pool = ThreadPoolExecutor(max_workers=6) def inicializar(self, mx_id): @@ -56,11 +58,12 @@ class CameraManager: self.mx_id = mx_id - from visual_worker.config import load_config - camera_config = load_config() + from visual_worker.config import load_seg_config, load_det_config + seg_config = load_seg_config() + det_config = load_det_config() try: - nova = CameraOak(self.mostrar_log, mx_id, modelo_ia_onboard=camera_config) + nova = CameraOak(self.mostrar_log, mx_id, modelo_ia_seg=seg_config, modelo_ia_det=det_config) if nova.iniciado: self.camera = nova except Exception as e: @@ -78,7 +81,7 @@ class CameraManager: self.setores_referencia = None self.anomalias_manager = AnaliseAnomaliasManager() self.solo_manager = AnaliseSoloManager() - self.segmentacao_manager = SegmentacaoManager(self.camera.colormap_rgb, self.camera.classes) + self.segmentacao_manager = SegmentacaoManager(self.camera.modelo_ia_seg.get("colormap_rgb"), self.camera.modelo_ia_seg.get("classes")) self.radar_manager = Radar2DManager() self.data_fuser = CostmapFuser(grid_shape=self.grid_ref_shape, K=3, M=2, fuse_method="q0.7", block_thr=0.7, central_cols=None, y_range_m=(0.5,5.0), near_is_bottom=True, fov_h_rad=np.radians(self.camera.parametros["fov_h"]), robot_width=self.largura_robo_m) self.operante = True @@ -88,12 +91,16 @@ class CameraManager: self._ultima_analise_solo = {} self._ultima_analise_radar = {} self._ultima_analise_segmentacao = {} + self._ultima_analise_deteccao = {} self._ultima_analise_matriz_confianca = {} self._ultima_analise_matriz_custo = {} + self._ts_segmentacao_anterior = 0 + self._ts_deteccao_anterior = 0 self._ultimo_rgb_frame = None self._depth_frame_necessario = True self._rgb_frame_necessario = True self._nova_segmentacao_disponivel = False + self._nova_deteccao_disponivel = False self._nova_grid_conf_disponivel = False self._analisando_anomalias = False @@ -102,6 +109,7 @@ class CameraManager: self._analisando_matriz_custo = False self._analisando_matriz_confianca = False self._analisando_segmentacao = False + self._analisando_deteccao = False self._iniciar_loop_analise_continua(15.0) self.iniciando = False @@ -178,7 +186,6 @@ class CameraManager: try: predictions, res = self.camera.requisitar_segmentacao() if predictions is not None: - self._ultimo_predictions = predictions return predictions, self.camera.timestamp_ultima_segmentacao, res elif "X_LINK_ERROR" in res["erro"]: self.reiniciar_status() @@ -189,6 +196,23 @@ class CameraManager: return None, None, None + def get_detections(self): + if self.camera is None: + return None, None, None + + try: + detections, res = self.camera.requisitar_deteccao() + if detections is not None: + return detections, self.camera.timestamp_ultima_deteccao, res + elif "X_LINK_ERROR" in res["erro"]: + self.reiniciar_status() + except Exception as e: + self.mostrar_log("Erro ao requisitar detections:", e) + if "X_LINK_ERROR" in str(e): + self.reiniciar_status() + + return None, None, None + def get_select_frame(self, tipo: CameraFrameType): f = None t = None @@ -273,18 +297,18 @@ class CameraManager: def _realizar_analises(self): + self._analise_segmentacao() + if self._depth_frame_necessario: depth_frame_np, depth_timestamp, depth_res = self.get_depth_frame() else: depth_frame_np = self._ultimo_depth_frame - self._analise_segmentacao() parametros_camera = self.camera.parametros fov_h = parametros_camera["fov_h"] distancia_max_m = parametros_camera["distancia_maxima"] / 1000.0 self._analise_matriz_confianca(depth_frame_np, distancia_max_m, fov_h) - #key, vis = self.debug_show_costmap(rgb_frame=self._ultimo_rgb_frame, grid_dict=self._ultima_analise_matriz_confianca, grid_shape=self.grid_ref_shape, window_name="viz MPC", wait=1, text_mode="mini") - #key, vis = self.debug_show_visualworker(frame_bgr=self._ultimo_rgb_frame, grid=self._ultima_analise_matriz_confianca, wait=1, text_mode="full", draw_grid=True, draw_cells=True, draw_legend=True) - self.segmentacao_manager.display_segmentation_debug(self._ultimo_rgb_frame, 150) + + self._analise_deteccao() def _realizar_analises_async(self): executor = self._pool @@ -351,6 +375,12 @@ class CameraManager: ) self._nova_segmentacao_disponivel = True + from visual_worker.config import load_seg_config + if load_seg_config().get("debug_visual", False): + #key, vis = self.debug_show_costmap(rgb_frame=self._ultimo_rgb_frame, grid_dict=self._ultima_analise_matriz_confianca, grid_shape=self.grid_ref_shape, window_name="viz MPC", wait=1, text_mode="mini") + #key, vis = self.debug_show_visualworker(frame_bgr=self._ultimo_rgb_frame, grid=self._ultima_analise_matriz_confianca, wait=1, text_mode="full", draw_grid=True, draw_cells=True, draw_legend=True) + self.segmentacao_manager.display_segmentation_debug(self._ultimo_rgb_frame, 150) + # Enviar comando para atualizar os dados de controle sempre que um novo dado de segmentacao seja processado e a operacao seja do tipo MapeamentoVisual #op_modo = ContextoGlobalRedis.get_operacao().get("modo", ModoOperacao.NaoDefinido.value) #movimento_automatico = ContextoGlobalRedis.get_controle().get("movimento_automatico", False) @@ -375,7 +405,7 @@ class CameraManager: t0 = time.time() #grid_conf = self._gerar_grid_confianca(depth_frame_np, segmentacao, dist_max) - grid_conf = self._construir_grid_confianca(depth_frame_np, segmentacao, self.grid_ref, self.grid_ref_shape, self.camera.classes) + grid_conf = self._construir_grid_confianca(depth_frame_np, segmentacao, self.grid_ref, self.grid_ref_shape, self.camera.modelo_ia_seg.get("classes")) #self.mostrar_log(grid_conf) t1 = time.time() grid_conf["ultima_chamada"] = self._ultima_analise_matriz_confianca.get("ultima_chamada", t0) @@ -401,6 +431,38 @@ class CameraManager: self._analisando_matriz_confianca = False #self.mostrar_log("Matriz de confianca concluida") + def _analise_deteccao(self): + if self._analisando_deteccao or self.camera.modelo_ia_det is None: return + self._analisando_deteccao = True + try: + t0 = time.time() + dets, ts, meta = self.get_detections() + if ts == self._ts_deteccao_anterior: return + self._ts_deteccao_anterior = ts + if dets is not None: + t1 = time.time() + analise_deteccoes = { + "bboxes": dets + } + self._calcular_performance(t0, t1, analise_deteccoes) + self._ultima_analise_deteccao = analise_deteccoes + ContextoGlobalRedis.atualizar_ctx_dict( + CtxKey.DadosVisualWorker, + ts_analise=t1, + deteccao=converter_valores_numpy(dets) + ) + self._nova_deteccao_disponivel = True + + from visual_worker.config import load_det_config + if load_det_config().get("debug_visual", False): + self._overlay_deteccoes(self._ultimo_rgb_frame, dets) + + except Exception as e: + self.mostrar_log(f"❌ Erro na deteccao de objetos: {e}") + finally: + self._analisando_deteccao = False + #self.mostrar_log(f"Deteccao concluida em {self._ultima_analise_deteccao['latencia']:.4f} s, a {fps:.4f} FPS") + def _analise_anomalias(self, grid_conf, limiar_delta, limiar_conf, dist_max, largura_min, altura_min): if self._analisando_anomalias: return @@ -1399,4 +1461,122 @@ class CameraManager: cv2.imshow(win_name, vis) cv2.waitKey(1) return vis, metrics + + + def _overlay_deteccoes( + self, + rgb_frame, + dets, + conf_thr=0.5, # limiar de confiança pra desenhar + roi_frac=None, # (rx1,ry1,rx2,ry2) normalizado da ROI usada no detector (ex.: (0.0,y1,1.0,y2)) + show=True, # se True, faz cv2.imshow + janela="det", # nome da janela + fps_state=None, # dict estado do FPS (persistido fora), ex.: {} + ): + """ + dets: lista de dicts no formato: + { + "label_id": int, + "label": str|None, + "conf": float, + "bbox_norm": [x0,y0,x1,y1] # 0..1 relativo ao input do detector (na ROI) + # opcional: "bbox_full": [x0,y0,x1,y1] em px do frame completo + } + Retorna: (frame_com_overlay, fps_state, keep_loop_bool) + """ + img = cv2.resize(rgb_frame.copy(), (1280, 720)) + H, W = img.shape[:2] + + # paleta simples por classe + palette = [ + (255, 56, 56), (255, 157, 151), (72, 249, 10), (0, 255, 0), (0, 0, 255), + (255, 0, 255), (0, 255, 255), (255, 191, 0), (52, 148, 230), (147, 112, 219) + ] + + def _map_bbox_norm_to_full(bn): + # bn é [x0n,y0n,x1n,y1n] relativo ao input da ROI (0..1) + x0n, y0n, x1n, y1n = bn + if roi_frac is not None: + rx1, ry1, rx2, ry2 = roi_frac + sx, sy = (rx2 - rx1), (ry2 - ry1) + x0 = int(round((rx1 + x0n * sx) * W)) + y0 = int(round((ry1 + y0n * sy) * H)) + x1 = int(round((rx1 + x1n * sx) * W)) + y1 = int(round((ry1 + y1n * sy) * H)) + else: + x0 = int(round(x0n * W)) + y0 = int(round(y0n * H)) + x1 = int(round(x1n * W)) + y1 = int(round(y1n * H)) + # clamp + x0 = max(0, min(W - 1, x0)); x1 = max(0, min(W - 1, x1)) + y0 = max(0, min(H - 1, y0)); y1 = max(0, min(H - 1, y1)) + return x0, y0, x1, y1 + + def _put_label(img, text, x, y, bg): + (tw, th), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1) + cv2.rectangle(img, (x, max(0, y - th - 6)), (x + tw + 6, y), bg, -1) + cv2.putText(img, text, (x + 3, y - 4), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA) + + # desenhar ROI (opcional, ajuda debug) + if roi_frac is not None: + rx1, ry1, rx2, ry2 = roi_frac + x0r, y0r = int(rx1 * W), int(ry1 * H) + x1r, y1r = int(rx2 * W), int(ry2 * H) + cv2.rectangle(img, (x0r, y0r), (x1r, y1r), (60, 60, 60), 1) + + # desenhar detecções + for d in dets: + if d.get("conf", 0.0) < conf_thr: + continue + + # bbox em px do frame + if "bbox_full" in d and d["bbox_full"]: + x0, y0, x1, y1 = d["bbox_full"] + # clamp se necessário + x0 = max(0, min(W - 1, int(x0))); x1 = max(0, min(W - 1, int(x1))) + y0 = max(0, min(H - 1, int(y0))); y1 = max(0, min(H - 1, int(y1))) + else: + bn = d.get("bbox_norm", None) + if not bn: + continue + x0, y0, x1, y1 = _map_bbox_norm_to_full(bn) + + if x1 <= x0 or y1 <= y0: + continue + + lid = int(d.get("label_id", -1)) + color = palette[lid % len(palette)] if lid >= 0 else (0, 255, 0) + + cv2.rectangle(img, (x0, y0), (x1, y1), color, 2) + + name = d.get("label", None) + txt = f"{name or f'id:{lid}'} {d.get('conf', 0.0):.2f}" + _put_label(img, txt, x0, y0, color) + + # FPS (EMA) + now = time.monotonic() + if fps_state is None: + fps_state = {} + t_prev = fps_state.get("t_prev") + fps_ema = fps_state.get("fps_ema") + if t_prev is not None: + dt = now - t_prev + if dt > 0: + fps_inst = 1.0 / dt + alpha = 0.90 + fps_ema = fps_inst if fps_ema is None else (alpha * fps_ema + (1 - alpha) * fps_inst) + fps_state["t_prev"] = now + fps_state["fps_ema"] = fps_ema + + if fps_ema: + cv2.putText(img, f"FPS: {fps_ema:.1f}", (10, 22), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (50, 220, 50), 2, cv2.LINE_AA) + + keep = True + if show: + cv2.imshow(janela, img) + k = cv2.waitKey(1) & 0xFF + keep = (k != 27) # ESC para sair + + return img, fps_state, keep \ No newline at end of file diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/config.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/config.py index 993d80c7b..5bd3ee81b 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/config.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/config.py @@ -37,7 +37,7 @@ _CONFIG_CACHE = None _CONFIG_MTIME = None _CONFIG_LOCK = threading.Lock() -def load_config(force_reload=False): +def load_seg_config(force_reload=False): global _CONFIG_CACHE, _CONFIG_MTIME with _CONFIG_LOCK: #try: @@ -72,15 +72,36 @@ def load_config(force_reload=False): # "kernel_morf": 3 # } _CONFIG_CACHE = { - "debug_visual": True, + "debug_visual": False, "ia_roi_begin": 0.0, "ia_roi_size": 1.0, - "ia_resolution": [512,288] + "ia_resolution": [512,288], + "det_every_n": 1, } _CONFIG_CACHE["ia_model_path"] = ContextoGlobalRedis.get_equipamento().get("path_ia_model_ruas", "C:/AgroBaseModels/Ruas/model-1_1.blob") _CONFIG_CACHE["ia_labelmap_path"] = ContextoGlobalRedis.get_equipamento().get("path_ia_labelmap_ruas", "C:/AgroBaseModels/Ruas/model-1_1.txt") return _CONFIG_CACHE -def reload_config(): - return load_config(force_reload=True) +def reload_seg_config(): + return load_seg_config(force_reload=True) + +def load_det_config(): + _CONFIG_DET = { + "debug_visual": False, + "ia_roi_begin": 0.0, + "ia_roi_size": 1.0, + "ia_resolution": [300,300], + "det_every_n": 3, + "ia_conf": 0.5, + "ia_model_path": "C:\\AgroBaseModels\\Ruas\\det_3.blob", + "classes": [ + "background", + "aeroplane","bicycle","bird","boat","bottle", + "bus","car","cat","chair","cow", + "diningtable","dog","horse","motorbike","person", + "pottedplant","sheep","sofa","train","tvmonitor", + ] + } + return _CONFIG_DET + diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/__pycache__/segmentacao_semantica.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/__pycache__/segmentacao_semantica.cpython-311.pyc index 42d47b665c17df729415e039cb23e850502ed336..30a638402680f6a39bb1a8626194cca014174273 100644 GIT binary patch delta 80 zcmX@Vf${1FM&9MTyj%=GU|BUk!)YV0AsZ)uPJUuad~s^}W@k2gCglc328ITP8yprF XP|*!Rg$eQ(1(mJ{Ds5iOvBn<&#}63` delta 74 zcmcb*f${tXM&9MTyj%=Guq$(ZhSf%1LpE0KoczR;&F*aWOp0}k3=9nnH#kf#prRXs RG83dH%1)8pypm&$KL9-07Y6_U diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/segmentacao_semantica.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/segmentacao_semantica.py index 11bee7be4..3a9ae7253 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/segmentacao_semantica.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/visual_worker/processamento/segmentacao_semantica.py @@ -15,8 +15,8 @@ class ClassesSegmentacao(IntEnum): class SegmentacaoManager: def __init__(self, color_map, classes): - from visual_worker.config import load_config - config = load_config() + from visual_worker.config import load_seg_config + config = load_seg_config() resolucao = config.get("ia_resolution") self.color_map = color_map self.classes = classes diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/camera_manager.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/camera_manager.cpython-311.pyc index 51f03c8894bf3e520df61eb1d6f2cac71956f875..e2e502669fbfb9595e98c84fbb0c79a2c99e7422 100644 GIT binary patch delta 1114 zcmY+DU1$_n6oB{6{%12u{Mlp^ad(oEh6&5ErpcPxpuxm!*GOn8Jl!G_=sw@yt@FoFBX#BSAerI0gd z5iSI-!+NkIRCK~!gQIdgB!ZX1Vo5JhP0y(cy0I8H+fn#lio!p^9|R)6#isc^sTYC& zy}w2JerkOgk?RrJY6%6&q4cZ7>`P9qAOg%C4BCFK1^Y!fFt88sETYJOnB}as} zF4qY%A-rpR_^Kz33r?%Ic}^h1u+-8m$9V;8H zK*%wx-rg;c47`slB-7krhmO-?iIzk&a#D;fl_w2U?Gsy~&lsb7+N2MpiUY&=s z3WwAG?Ce(mNv^5I;X5gAefhyLk5s@69hIuKNSRtw3OdUvRZ}l1rkd9$7_}bv#YxgB zJT#@~nX;N!(Q6*#nv2xT<@K`3bd9plxr+55CLt<6YdwYHXXq!Gd{*#I{)C)?WPd+d zux9$tyZf>Jt+_gW>gG@r1rYGbZK<*uaP6YgitT2DhgmHm3PA zdR*nOy%ohU6}EzM(@Cb3Xs*n`uE5^|abE`ghOF2}LH8`mHp$hziEk^kDEk{@4xq;k z#4W^a#46$rha7CAyN8N19JbG>YA4mx>@F@sbBaMzgHBeKfu&T6tieX=Az6Xb`v=ET z7_|>EiEw6zO|w}9o)TL?EOFQ#O*KsC8nOqdTtl3*Uhm&S!Z%TNYBW&7+rw5N_VKS> a=TPiI;LZOxFv9=Yszwj8r&jZUDESYa!5|s{ delta 1050 zcmY+C-){_26vy|@{@&S9Ep4|e)~tq_ZNo-~t&$R&ZA(%_AN*)Cz1^Lzt=XN;o!Mg3 zM!cX85^)jYM#f)e`z^aSeUJ`D=y#fiwZRglt~Zah84v+~jlB)ABZ{kzNd*TOQ8n znobJ1q>$XO?aye~FjRxAU@|*KYvVDxKXjg3K=fPaaMSvCf&acwk><<%72%p->3k3^ zO26^E4aG3ASvKr|hE27Y$zzt|7x5Jr zDKY`k8Jq$P4gD#=I_qikghzCaHCO zlkNmuMe{y2CZ-edRNWg-JM5gK7rVr5xFrxr? V@jnAw3VODzsa<5=y3rX!zX95(4Ql`Z diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/config.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/config.cpython-311.pyc index 1eae5a0c73fe255b6f4257f1786e4cb9c47c153c..49e567b8895d62efb4adc25cac2d14af6d51f71c 100644 GIT binary patch delta 101 zcmX@8dQz2lIWI340}v!s&Cd|n$Q#JZ$)A&-m=a%{n!Y)i_c{}|U{NYeV6vltB)`-O jmJ8gv7rAw>aO+-R(cPRWV8jIWI340}w3moR-0|kvEW+l{+UtF=cZ)?{y}9-l9|xCq6kpFD)~@$P1`0 v8;FaAfkXqtU2d@jE*H2pFLG;M;nuvsqPe+Hz>Y~u>jMKLBRWyU2h;)p5yBm@ diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/weed_detector.cpython-311.pyc b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/__pycache__/weed_detector.cpython-311.pyc index d76e4a0cd3e6be990773724a090b76c93f1f793c..63d4f8f507c9cab1ab9621248882c7f6ff17240d 100644 GIT binary patch delta 160 zcmZ3moN?81M&9MTyj%=GP*^oTqh}+p9xEq*PJUuad~s^}W(QU`CS?mo28ITP8ysdA zP|*!Rg$eQ(1(mJ{Ds5iQzMDh2iU@_x0*aiBGbS&U43@UKz=MKrh^kD8zbLA9MO1CG Ipj5vl0C00N1poj5 delta 150 zcmZ3roN>W&M&9MTyj%=GaQ(x~jFOGKdaSJ6Ir)hxn_XDlm=w(z85kNEZg3b~Kt(qM zWhO{Zl$|2Gc`f^H4#f(B%DM#F!;m=HZNc1rAKX{mlo0I8rb AK>z>% diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/camera_manager.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/camera_manager.py index b6a9efd23..aef139f7f 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/camera_manager.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/camera_manager.py @@ -42,8 +42,8 @@ class CameraManager: self.mx_id = mx_id - from weed_worker.config import load_config - camera_config = load_config() + from weed_worker.config import load_seg_config + camera_config = load_seg_config() try: nova = CameraOak(self.mostrar_log, mx_id, modelo_ia_onboard=camera_config) @@ -62,7 +62,7 @@ class CameraManager: self._ultimo_rgb_frame = None self._ultimo_predictions = None - self.weed_detector = WeedDetector(self.camera.colormap_rgb, self.camera.classes) + self.weed_detector = WeedDetector(self.camera.modelo_ia_seg.get("colormap_rgb"), self.camera.modelo_ia_seg.get("classes")) self._iniciar_loop_analise_continua(20.0) self.iniciando = False diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py index 7e57e9faa..5d25fc37c 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/config.py @@ -39,7 +39,7 @@ _CONFIG_CACHE = None _CONFIG_MTIME = None _CONFIG_LOCK = threading.Lock() -def load_config(force_reload=False): +def load_seg_config(force_reload=False): global _CONFIG_CACHE, _CONFIG_MTIME with _CONFIG_LOCK: #try: @@ -104,5 +104,5 @@ def load_config(force_reload=False): _CONFIG_CACHE["faixa_atuacao_bicos"] = dadosAtu.get("percent_vertical_deteccao", 0.3) return _CONFIG_CACHE -def reload_config(): - return load_config(force_reload=True) +def reload_seg_config(): + return load_seg_config(force_reload=True) diff --git a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py index 0f1629b69..9c587515c 100644 --- a/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py +++ b/AgroBase/AgroBase/bin/x64/Debug/Python/Scripts/workers/weed_worker/weed_detector.py @@ -12,8 +12,8 @@ class ClassesSegmentacao(IntEnum): class WeedDetector: def __init__(self, color_map, classes): - from weed_worker.config import load_config - config = load_config() + from weed_worker.config import load_seg_config + config = load_seg_config() resolucao = config.get("ia_resolution") self.color_map = color_map self.classes = classes @@ -40,8 +40,8 @@ class WeedDetector: self._seg_fps_ema = None # opcional: chame quando terminar a segmentação def _reiniciar_deteccoes(self): - from weed_worker.config import load_config - config = load_config() + from weed_worker.config import load_seg_config + config = load_seg_config() qtd_bicos = config.get("qtd_bicos") self.ervas_ativas_radar = [] self.ervas_ativas_filtradas = [] @@ -99,8 +99,8 @@ class WeedDetector: print("[Erro] Máscara de classes não encontrada no resultado") return None - from weed_worker.config import load_config - config = load_config() + from weed_worker.config import load_seg_config + config = load_seg_config() # vel_norm pode vir do contexto (0..1 da sua Vmax). Se não tiver, manda 0.0 vel_norm = float(config.get("velocidade_robo", 0.0)) diff --git a/Python/OAK/datasets/_7_convert_fastscnn.py b/Python/OAK/datasets/_7_convert_fastscnn.py index d36a8c874..c92aef692 100644 --- a/Python/OAK/datasets/_7_convert_fastscnn.py +++ b/Python/OAK/datasets/_7_convert_fastscnn.py @@ -11,6 +11,7 @@ MODELO = config["camera"] MODEL_NAME = config["model_name"] RESOLUCAO = config["resolucao"] MAIN_CLASS_NAME = config["main_class_name"] +N_SHAVES = config["shaves"] use_main_class = config["use_main_class"] model_path = os.path.join(MODELO, "backup", config["modelo"], MODEL_NAME) labelmap_path = os.path.join(MODELO, "dataset", "labelmap.txt") @@ -55,7 +56,7 @@ blob_path = blobconverter.from_openvino( xml=os.path.join(model_path, model_name + ".xml"), bin=os.path.join(model_path, model_name + ".bin"), data_type="FP16", - shaves=6, + shaves=N_SHAVES, output_dir=model_path, #compile_params=[ # "-ip U8", # entrada em bytes; compila a conversão interna p/ FP16 diff --git a/Python/OAK/datasets/config.json b/Python/OAK/datasets/config.json index bcbb8da7b..d629f3fc6 100644 --- a/Python/OAK/datasets/config.json +++ b/Python/OAK/datasets/config.json @@ -6,5 +6,6 @@ "use_main_class": false, "resolucao": [512, 288], "roi_inicio": 0.0, - "roi_tamanho": 1.0 + "roi_tamanho": 1.0, + "shaves": 3 } \ No newline at end of file