Passei três fins de semana convencido de que precisava de um modelo de segmentação próprio. Spoiler: não precisava.
O problema
Queria detectar a posição dos dedos para o cubo mágico controlado por gesto. Minha primeira ideia foi treinar uma U-Net pequena para segmentar a mão e extrair a pose dos contornos.
Por que não funcionou
- Dados. Anotar máscaras de mão à mão é lento e eu não tinha dataset bom.
- CPU. No alvo (webcam de laptop, sem GPU dedicada) a U-Net rodava a ~8 FPS. Inutilizável para interação.
- Pose != máscara. Eu queria 21 landmarks, não pixels. Estava resolvendo o problema errado.
A virada
O MediaPipe Hands entrega 21 landmarks 3D por mão, roda em tempo real no CPU e já vem treinado. Troquei semanas de trabalho por:
const landmarker = await HandLandmarker.createFromOptions(vision, {
baseOptions: { modelAssetPath: "/wasm/hand_landmarker.task", delegate: "GPU" },
numHands: 2,
});
A lição não é “MediaPipe é melhor”. É que eu estava resolvendo um problema que já estava resolvido.
O que ficou
Foco no que é meu: o mapeamento landmark→gesto→rotação do cubo. Essa parte ninguém resolve por mim — e é onde o tempo deveria ter ido desde o começo.