"""Inferencia MediaPipe real, com modelos locais e imagens oficiais de teste.""" import importlib.util from pathlib import Path import sys import tempfile import threading from playwright.sync_api import sync_playwright ROOT=Path(__file__).resolve().parents[1] FIXTURES=ROOT.parents[1]/'work/tracking-fixtures' sys.path.insert(0,str(ROOT)) spec=importlib.util.spec_from_file_location('kiosk_tracking',ROOT/'kiosk-server.py') kiosk=importlib.util.module_from_spec(spec);spec.loader.exec_module(kiosk) class Handler(kiosk.Handler): def do_GET(self): if self.path in ('/test-portrait','/test-hands'): name='portrait.jpg' if self.path=='/test-portrait' else 'right_hands.jpg' return self.enviar((FIXTURES/name).read_bytes(),'image/jpeg') super().do_GET() def main(): with tempfile.TemporaryDirectory() as tmp: server=kiosk.Servidor(('127.0.0.1',0),Handler) server.controle=kiosk.ControlePC(Path(tmp)/'config.json') thread=threading.Thread(target=server.serve_forever,daemon=True);thread.start() base='http://127.0.0.1:'+str(server.server_port) try: with sync_playwright() as p: browser=p.chromium.launch(headless=True) page=browser.new_page();errors=[];external=[] page.on('pageerror',lambda e: errors.append(str(e))) page.on('console',lambda m: print('WORKER',m.text[:180]) if m.type=='error' else None) def route(r): if not r.request.url.startswith(base): external.append(r.request.url);r.abort() else:r.continue_() page.route('**/*',route) page.goto(base+'/') # painel novo: nada pode sair para a internet results=page.evaluate("""async () => { const worker=new Worker('/rastreador-worker.js'); const send=msg=>new Promise((resolve,reject)=>{ worker.onmessage=({data})=>data.tipo==='erro'?reject(Error(data.erro)):resolve(data); worker.onerror=e=>reject(Error(e.message)); worker.postMessage(msg,msg.bitmap?[msg.bitmap]:[]); }); const config={rosto:true,maos:true}; await send({config}); const a=await createImageBitmap(await (await fetch('/test-portrait')).blob()); const face=await send({config,bitmap:a,timestamp:1000}); const b=await createImageBitmap(await (await fetch('/test-hands')).blob()); const hand=await send({config,bitmap:b,timestamp:2000}); worker.terminate();return {face,hand}; }""") assert results['face']['faces'], 'Rosto da imagem oficial nao detectado' assert results['hand']['hands'], 'Maos da imagem oficial nao detectadas' assert len(results['hand']['hands'][0])==21 print('Inferencia real: %s rosto(s), %s mao(s); %.1f/%.1f ms' % ( len(results['face']['faces']),len(results['hand']['hands']),results['face']['ms'],results['hand']['ms'])) assert not external,external assert not errors,errors browser.close() print('Inferencia real no worker e painel sem acesso externo: OK') finally: server.shutdown();server.server_close();thread.join() if __name__=='__main__':main()