Neste tutorial, construímos um agente de visão de simulação incorporado que aprende a perceber, planejar, prever e replanejar diretamente a partir de observações de pixels. Criamos um mundo de grade totalmente renderizado em NumPy no qual o agente observa frames RGB em vez de variáveis de estado simbólicas, permitindo-nos simular um pipeline simplificado no estilo Visão-Linguagem-Ação. Treinamos um modelo de mundo leve que codifica a entrada visual em uma representação latente, prevê estados futuros condicionados em ações e objetivos e reconstrói o próximo frame. Usando controle preditivo de modelo no espaço latente, permitimos que o agente amostre possíveis sequências de ações, avalie os resultados previstos e execute a melhor ação em um loop fechado. Copiar Código Copiado Usar um navegador diferente import random, numpy as np, torch, torch.nn as nn, torch.nn.functional as F import matplotlib.pyplot as plt from dataclasses import dataclass from typing import Tuple, Dict, List from torch.utils.data import Dataset, DataLoader try: from tqdm.auto import tqdm except Exception: def tqdm(x, **kwargs): return x SEED = 7 random.seed(SEED); np.random.seed(SEED); torch.manual_seed(SEED) if device.type == "cuda": torch.backends.cudnn.benchmark = True @dataclass class WorldConfig: grid_size: int = 8 cell_px: int = 14 max_steps: int = 45 n_obstacles: int = 8 spawn_margin: int = 1 class GridWorldRGBNoPIL: ACTIONS = {0:(0,-1),1:(0,1),2:(-1,0),3:(1,0),4:(0,0)} ACTION_NAMES = {0:"UP",1:"DOWN",2:"LEFT",3:"RIGHT",4:"STAY"} def __init__(self, cfg: WorldConfig): self.cfg = cfg self.reset() def reset(self) -> Dict: g = self.cfg.grid_size self.steps = 0 def sample_empty(exclude=set()): while True: x = random.randint(self.cfg.spawn_margin, g-1-self.cfg.spawn_margin) y = random.randint(self.cfg.spawn_margin, g-1-self.cfg.spawn_margin) if (x,y) not in exclude: return (x,y) self.obstacles = set() ax, ay = sample_empty() gx, gy = sample_empty(exclude={(ax,ay)}) used = {(ax,ay),(gx,gy)} for _ in range(self.cfg.n_obstacles): ox, oy = sample_empty(exclude=used) self.obstacles.add((ox,oy)) used.add((ox,oy)) self.agent = (ax,ay) self.goal = (gx,gy) return {"image": self._render_u8()} def _in_bounds(self, x, y): return 0 float: x,y = pos; gx,gy = self.goal return abs(x-gx)+abs(y-gy) def _state_vector(self) -> np.ndarray: g = self.cfg.grid_size - 1 ax,ay = self.agent; gx,gy = self.goal return np.array([ax/g, ay/g, gx/g, gy/g
Fonte: MarkTechPost
Publicado em 2026-04-28