framefields 2.1.3 → 2.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -618
- package/dist/audio/index.d.mts +4 -4
- package/dist/audio/index.mjs +10 -10
- package/dist/{audio-CfBpzxn9.d.mts → audio-1QquqDJs.d.mts} +3 -3
- package/dist/{audio-CfBpzxn9.d.mts.map → audio-1QquqDJs.d.mts.map} +1 -1
- package/dist/{audio-DqaHxtG3.mjs → audio-BYqbtdH8.mjs} +3 -3
- package/dist/{audio-DqaHxtG3.mjs.map → audio-BYqbtdH8.mjs.map} +1 -1
- package/dist/{dist-BgFYDCoL.mjs → dist-BLbXEC6V.mjs} +2 -2
- package/dist/{dist-BgFYDCoL.mjs.map → dist-BLbXEC6V.mjs.map} +1 -1
- package/dist/{dist-Cog5jyVI.mjs → dist-DQlYw4eG.mjs} +44 -4
- package/dist/dist-DQlYw4eG.mjs.map +1 -0
- package/dist/effects/index.d.mts +4 -4
- package/dist/effects/index.mjs +35 -35
- package/dist/{effects-CXrmO68D.mjs → effects-DgpPr38s.mjs} +2 -2
- package/dist/{effects-CXrmO68D.mjs.map → effects-DgpPr38s.mjs.map} +1 -1
- package/dist/fonts/index.mjs +2 -2
- package/dist/{fonts-BUVSUWXJ.mjs → fonts-DakFEiDw.mjs} +2 -2
- package/dist/{fonts-BUVSUWXJ.mjs.map → fonts-DakFEiDw.mjs.map} +1 -1
- package/dist/{gpu-Bj08zUc5.mjs → gpu-AbcLcr1f.mjs} +2 -2
- package/dist/{gpu-Bj08zUc5.mjs.map → gpu-AbcLcr1f.mjs.map} +1 -1
- package/dist/{index-Cpkzy5XR.d.mts → index--1jnkoBj.d.mts} +20 -2
- package/dist/index--1jnkoBj.d.mts.map +1 -0
- package/dist/{index-BzQc812z.d.mts → index-BqzHDFkU.d.mts} +3 -3
- package/dist/{index-BzQc812z.d.mts.map → index-BqzHDFkU.d.mts.map} +1 -1
- package/dist/{index-DpWia6iH.d.mts → index-CaZfxDXx.d.mts} +27 -3
- package/dist/index-CaZfxDXx.d.mts.map +1 -0
- package/dist/{index-Fciq8bcC.d.mts → index-D6_KcajH.d.mts} +2 -2
- package/dist/{index-Fciq8bcC.d.mts.map → index-D6_KcajH.d.mts.map} +1 -1
- package/dist/{index-D__HdInU.d.mts → index-DLbtJPrc.d.mts} +23 -12
- package/dist/index-DLbtJPrc.d.mts.map +1 -0
- package/dist/{index--0vVZDPM.d.mts → index-DgJIBC_N.d.mts} +3 -3
- package/dist/{index--0vVZDPM.d.mts.map → index-DgJIBC_N.d.mts.map} +1 -1
- package/dist/index.d.mts +16 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +50 -50
- package/dist/index.mjs.map +1 -1
- package/dist/preview/index.d.mts +2 -2
- package/dist/preview/index.mjs +10 -10
- package/dist/{preview-BOqCRCgp.mjs → preview-BQ3BhcVX.mjs} +2 -2
- package/dist/{preview-BOqCRCgp.mjs.map → preview-BQ3BhcVX.mjs.map} +1 -1
- package/dist/preview-engine/audio.mjs +1 -1
- package/dist/preview-engine/{chunk-JJ5EF3EY.mjs → chunk-2W4BMOAZ.mjs} +1 -1
- package/dist/preview-engine/chunk-7OMK352W.mjs +1 -0
- package/dist/preview-engine/chunk-FJH5A2PV.mjs +1 -0
- package/dist/preview-engine/{chunk-USM33CF5.mjs → chunk-HFUA47QH.mjs} +1 -1
- package/dist/preview-engine/chunk-K7M5EIFC.mjs +98 -0
- package/dist/preview-engine/{chunk-5DOD2NVY.mjs → chunk-MOW55DX2.mjs} +1 -1
- package/dist/preview-engine/chunk-VUFDQJ2B.mjs +1 -0
- package/dist/preview-engine/{chunk-ZIIFTWDH.mjs → chunk-XETMNJVV.mjs} +1 -1
- package/dist/preview-engine/{chunk-AE2336RK.mjs → chunk-Z457JJCO.mjs} +1 -1
- package/dist/preview-engine/effects.mjs +1 -1
- package/dist/preview-engine/framefields.mjs +21 -21
- package/dist/preview-engine/player.mjs +1 -1
- package/dist/preview-engine/{renderers-57WDL6XN.mjs → renderers-HVTQ2B3H.mjs} +1 -1
- package/dist/preview-engine/{renderers-BH5MXUTT.mjs → renderers-OZYUGZG7.mjs} +1 -1
- package/dist/preview-engine/{renderers-2SVWAB42.mjs → renderers-UHYNEWQD.mjs} +1 -1
- package/dist/preview-engine/signals.mjs +1 -1
- package/dist/{program-D8JoVobr.mjs → program-Cc_2_YXn.mjs} +2 -2
- package/dist/{program-D8JoVobr.mjs.map → program-Cc_2_YXn.mjs.map} +1 -1
- package/dist/renderer/index.d.mts +3 -3
- package/dist/renderer/index.mjs +3 -3
- package/dist/{renderer-B9ProG0Z.mjs → renderer-2DjggBBS.mjs} +2 -2
- package/dist/{renderer-B9ProG0Z.mjs.map → renderer-2DjggBBS.mjs.map} +1 -1
- package/dist/{renderer-CBBhVrwO.mjs → renderer-4GYrnTfw.mjs} +2 -2
- package/dist/{renderer-CBBhVrwO.mjs.map → renderer-4GYrnTfw.mjs.map} +1 -1
- package/dist/renderer-9ETXaINw.mjs +5 -0
- package/dist/renderer-B3MVDN_e.mjs +5 -0
- package/dist/{renderer-CZ7-42SE.mjs → renderer-B4cnT3ce.mjs} +3 -3
- package/dist/{renderer-CZ7-42SE.mjs.map → renderer-B4cnT3ce.mjs.map} +1 -1
- package/dist/{renderer-0dD1VQsz.mjs → renderer-B5PFBOjv.mjs} +3 -3
- package/dist/{renderer-0dD1VQsz.mjs.map → renderer-B5PFBOjv.mjs.map} +1 -1
- package/dist/renderer-B6iUuWcx.mjs +6 -0
- package/dist/renderer-B8IdU-7S.mjs +5 -0
- package/dist/renderer-BEGJCxuL.mjs +5 -0
- package/dist/{renderer-BlTPu9QT.mjs → renderer-BEzUirF0.mjs} +2 -2
- package/dist/{renderer-BlTPu9QT.mjs.map → renderer-BEzUirF0.mjs.map} +1 -1
- package/dist/{renderer-ByGPFIu2.mjs → renderer-BKd2nRnO.mjs} +2 -2
- package/dist/{renderer-ByGPFIu2.mjs.map → renderer-BKd2nRnO.mjs.map} +1 -1
- package/dist/renderer-BLAkNFx7.mjs +5 -0
- package/dist/{renderer--2bwnzBi.mjs → renderer-BN0CzoG_.mjs} +2 -2
- package/dist/{renderer--2bwnzBi.mjs.map → renderer-BN0CzoG_.mjs.map} +1 -1
- package/dist/{renderer-aw8EsrS9.mjs → renderer-BNcsS03m.mjs} +2 -2
- package/dist/{renderer-aw8EsrS9.mjs.map → renderer-BNcsS03m.mjs.map} +1 -1
- package/dist/{renderer-Bs_f_App.d.mts → renderer-BO-7bYa5.d.mts} +2 -2
- package/dist/{renderer-Bs_f_App.d.mts.map → renderer-BO-7bYa5.d.mts.map} +1 -1
- package/dist/{renderer--JBbEfTc.mjs → renderer-BPMywsr4.mjs} +3 -3
- package/dist/{renderer--JBbEfTc.mjs.map → renderer-BPMywsr4.mjs.map} +1 -1
- package/dist/renderer-BVNhv2ft.mjs +5 -0
- package/dist/renderer-BaXTEIe0.mjs +5 -0
- package/dist/{renderer-BeuG4dyz.mjs → renderer-Bfrwo_It.mjs} +2 -2
- package/dist/{renderer-BeuG4dyz.mjs.map → renderer-Bfrwo_It.mjs.map} +1 -1
- package/dist/{renderer-DT1bySqu.mjs → renderer-BhxQzrHF.mjs} +2 -2
- package/dist/{renderer-DT1bySqu.mjs.map → renderer-BhxQzrHF.mjs.map} +1 -1
- package/dist/renderer-BjeA7s36.mjs +5 -0
- package/dist/renderer-BtGNxEay.mjs +5 -0
- package/dist/renderer-BvZg2RJG.mjs +5 -0
- package/dist/{renderer-BaYEXoS3.mjs → renderer-C2eBC0FB.mjs} +3 -3
- package/dist/{renderer-BaYEXoS3.mjs.map → renderer-C2eBC0FB.mjs.map} +1 -1
- package/dist/{renderer-B7jZuO6k.mjs → renderer-C4UqxwcT.mjs} +2 -2
- package/dist/{renderer-B7jZuO6k.mjs.map → renderer-C4UqxwcT.mjs.map} +1 -1
- package/dist/{renderer-Bm0W9qgc.mjs → renderer-C6u-XrH-.mjs} +3 -3
- package/dist/{renderer-Bm0W9qgc.mjs.map → renderer-C6u-XrH-.mjs.map} +1 -1
- package/dist/{renderer-BNyDJZzl.mjs → renderer-CB87_0vL.mjs} +3 -3
- package/dist/{renderer-BNyDJZzl.mjs.map → renderer-CB87_0vL.mjs.map} +1 -1
- package/dist/{renderer-FSCTtHrt.mjs → renderer-CD38wGmN.mjs} +2 -2
- package/dist/{renderer-FSCTtHrt.mjs.map → renderer-CD38wGmN.mjs.map} +1 -1
- package/dist/{renderer-ClIXn9ZU.mjs → renderer-CGZqCmf2.mjs} +2 -2
- package/dist/{renderer-ClIXn9ZU.mjs.map → renderer-CGZqCmf2.mjs.map} +1 -1
- package/dist/{renderer-CVD0oPsf.mjs → renderer-CHkqgIOL.mjs} +2 -2
- package/dist/{renderer-CVD0oPsf.mjs.map → renderer-CHkqgIOL.mjs.map} +1 -1
- package/dist/{renderer-Dj_K1f1T.mjs → renderer-CK0u3Psf.mjs} +3 -3
- package/dist/{renderer-Dj_K1f1T.mjs.map → renderer-CK0u3Psf.mjs.map} +1 -1
- package/dist/renderer-CLW6tUUn.mjs +5 -0
- package/dist/{renderer-BJ_GtjUk.mjs → renderer-CO4theVJ.mjs} +2 -2
- package/dist/{renderer-KcV0gCO5.mjs → renderer-CPW9o3Lc.mjs} +3 -3
- package/dist/{renderer-KcV0gCO5.mjs.map → renderer-CPW9o3Lc.mjs.map} +1 -1
- package/dist/renderer-CS-ojgJk.mjs +5 -0
- package/dist/{renderer-BwBc5xNu.mjs → renderer-CSfLMXN8.mjs} +3 -3
- package/dist/{renderer-BwBc5xNu.mjs.map → renderer-CSfLMXN8.mjs.map} +1 -1
- package/dist/{renderer-0fRv8mc5.mjs → renderer-CSoyJ8GH.mjs} +2 -2
- package/dist/{renderer-0fRv8mc5.mjs.map → renderer-CSoyJ8GH.mjs.map} +1 -1
- package/dist/renderer-CUQtKECw.mjs +5 -0
- package/dist/renderer-CV-l8wMq.mjs +5 -0
- package/dist/renderer-CV7_ALA5.mjs +5 -0
- package/dist/renderer-CVR6T6Lp.mjs +5 -0
- package/dist/{renderer-B-QXAPY0.mjs → renderer-CZ9gHx-4.mjs} +2 -2
- package/dist/{renderer-B-QXAPY0.mjs.map → renderer-CZ9gHx-4.mjs.map} +1 -1
- package/dist/renderer-CZKFEf_6.mjs +3 -0
- package/dist/{renderer-C-BjN5HM.mjs → renderer-CciB_sav.mjs} +3 -3
- package/dist/{renderer-C-BjN5HM.mjs.map → renderer-CciB_sav.mjs.map} +1 -1
- package/dist/{renderer-hIbXvzPu.mjs → renderer-ClWgdN2v.mjs} +2 -2
- package/dist/renderer-CtUF95UW.mjs +5 -0
- package/dist/{renderer-BJD6Ouon.mjs → renderer-Cv1wmjhA.mjs} +2 -2
- package/dist/{renderer-BJD6Ouon.mjs.map → renderer-Cv1wmjhA.mjs.map} +1 -1
- package/dist/{renderer-CJnIeI0m.mjs → renderer-Cxh7j423.mjs} +3 -3
- package/dist/{renderer-CJnIeI0m.mjs.map → renderer-Cxh7j423.mjs.map} +1 -1
- package/dist/{renderer-cjiONTY_.mjs → renderer-D0enmulV.mjs} +2 -2
- package/dist/{renderer-cjiONTY_.mjs.map → renderer-D0enmulV.mjs.map} +1 -1
- package/dist/renderer-D8ymQoTB.mjs +5 -0
- package/dist/renderer-D9x3UE1Y.mjs +5 -0
- package/dist/renderer-DAEXqa2Q.mjs +5 -0
- package/dist/renderer-DDhU9Goq.mjs +5 -0
- package/dist/{renderer-CgFs_3gW.mjs → renderer-DEQ09sg7.mjs} +2 -2
- package/dist/{renderer-CgFs_3gW.mjs.map → renderer-DEQ09sg7.mjs.map} +1 -1
- package/dist/{renderer-CATBdL9s.mjs → renderer-DRpIQFAK.mjs} +2 -2
- package/dist/{renderer-CATBdL9s.mjs.map → renderer-DRpIQFAK.mjs.map} +1 -1
- package/dist/{renderer-Dd9NUd_I.mjs → renderer-DT3QVVht.mjs} +2 -2
- package/dist/{renderer-Dd9NUd_I.mjs.map → renderer-DT3QVVht.mjs.map} +1 -1
- package/dist/{renderer-BqCx28Zb.mjs → renderer-DU3216cx.mjs} +3 -3
- package/dist/{renderer-BqCx28Zb.mjs.map → renderer-DU3216cx.mjs.map} +1 -1
- package/dist/{renderer-BXZo84vM.mjs → renderer-DU6i7shO.mjs} +2 -2
- package/dist/{renderer-BXZo84vM.mjs.map → renderer-DU6i7shO.mjs.map} +1 -1
- package/dist/renderer-DcCKath2.mjs +5 -0
- package/dist/{renderer-CmEvkdNL.mjs → renderer-DfSRmz7q.mjs} +3 -3
- package/dist/{renderer-CmEvkdNL.mjs.map → renderer-DfSRmz7q.mjs.map} +1 -1
- package/dist/renderer-DiBphLzn.mjs +5 -0
- package/dist/renderer-Diq9Z7gZ.mjs +5 -0
- package/dist/renderer-DjZiO7iA.mjs +5 -0
- package/dist/{renderer-Ba7Rc8DE.mjs → renderer-DkGODUgE.mjs} +3 -3
- package/dist/{renderer-Ba7Rc8DE.mjs.map → renderer-DkGODUgE.mjs.map} +1 -1
- package/dist/{renderer-DKmV8F6L.mjs → renderer-DlqDnh-8.mjs} +2 -2
- package/dist/{renderer-DKmV8F6L.mjs.map → renderer-DlqDnh-8.mjs.map} +1 -1
- package/dist/{renderer-CMOAtGdC.mjs → renderer-Dnm_SVy6.mjs} +3 -3
- package/dist/{renderer-CMOAtGdC.mjs.map → renderer-Dnm_SVy6.mjs.map} +1 -1
- package/dist/{renderer-Cun5J3z9.mjs → renderer-DppnY7RT.mjs} +3 -3
- package/dist/{renderer-Cun5J3z9.mjs.map → renderer-DppnY7RT.mjs.map} +1 -1
- package/dist/{renderer-CmpV4YNd.mjs → renderer-DqhZTIiC.mjs} +2 -2
- package/dist/{renderer-CmpV4YNd.mjs.map → renderer-DqhZTIiC.mjs.map} +1 -1
- package/dist/renderer-Dtj6o-74.mjs +5 -0
- package/dist/renderer-Duaam6bJ.mjs +5 -0
- package/dist/{renderer-CxE5__5p.mjs → renderer-DwCg5pXn.mjs} +2 -2
- package/dist/{renderer-CxE5__5p.mjs.map → renderer-DwCg5pXn.mjs.map} +1 -1
- package/dist/{renderer-B8Wjov5-.mjs → renderer-Dyh8c41v.mjs} +2 -2
- package/dist/{renderer-B6x_Mmpf.mjs → renderer-DzDZlez7.mjs} +247 -63
- package/dist/renderer-DzDZlez7.mjs.map +1 -0
- package/dist/renderer-FHqZe3K1.mjs +5 -0
- package/dist/renderer-FTKfOejk.mjs +5 -0
- package/dist/{renderer-BPDita2c.mjs → renderer-FgcNOe1R.mjs} +5 -5
- package/dist/{renderer-BPDita2c.mjs.map → renderer-FgcNOe1R.mjs.map} +1 -1
- package/dist/{renderer-58bVJfZx.mjs → renderer-L7UTxwZT.mjs} +2 -2
- package/dist/{renderer-58bVJfZx.mjs.map → renderer-L7UTxwZT.mjs.map} +1 -1
- package/dist/renderer-LmbkN82X.mjs +5 -0
- package/dist/{renderer-C-AzyBir.mjs → renderer-PbJk25JW.mjs} +3 -3
- package/dist/{renderer-C-AzyBir.mjs.map → renderer-PbJk25JW.mjs.map} +1 -1
- package/dist/renderer-SDspl6p-.mjs +5 -0
- package/dist/renderer-SWVUDypd.mjs +5 -0
- package/dist/renderer-WhpTBwDM.mjs +5 -0
- package/dist/renderer-WrpQEVdv.mjs +5 -0
- package/dist/{renderer-mp1NN5zk.mjs → renderer-dc39dBVA.mjs} +283 -79
- package/dist/renderer-dc39dBVA.mjs.map +1 -0
- package/dist/{renderer-Br1OuXr_.mjs → renderer-dj3f8cMg.mjs} +3 -3
- package/dist/{renderer-Br1OuXr_.mjs.map → renderer-dj3f8cMg.mjs.map} +1 -1
- package/dist/{renderer-BcFdZx4j.mjs → renderer-dwTzrQ2G.mjs} +3 -3
- package/dist/{renderer-BcFdZx4j.mjs.map → renderer-dwTzrQ2G.mjs.map} +1 -1
- package/dist/{renderer-Cd5BLFnS.mjs → renderer-egZPy7vq.mjs} +2 -2
- package/dist/{renderer-Cd5BLFnS.mjs.map → renderer-egZPy7vq.mjs.map} +1 -1
- package/dist/{renderer-ChO8NNw9.mjs → renderer-gwV6hyYm.mjs} +2 -2
- package/dist/{renderer-ChO8NNw9.mjs.map → renderer-gwV6hyYm.mjs.map} +1 -1
- package/dist/{renderer-pNxZ_lV2.mjs → renderer-lXmtdrdI.mjs} +2 -2
- package/dist/{renderer-pNxZ_lV2.mjs.map → renderer-lXmtdrdI.mjs.map} +1 -1
- package/dist/{renderer-D_2Y_tdA.mjs → renderer-n2kYIGtb.mjs} +2 -2
- package/dist/{renderer-D_2Y_tdA.mjs.map → renderer-n2kYIGtb.mjs.map} +1 -1
- package/dist/renderer-r4ney0FZ.mjs +5 -0
- package/dist/{renderer-Bos8nRhT.mjs → renderer-sHDPBywo.mjs} +2 -2
- package/dist/{renderer-Bos8nRhT.mjs.map → renderer-sHDPBywo.mjs.map} +1 -1
- package/dist/{renderer-D9mf-msP.mjs → renderer-scbJx-Dx.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-ZKjdDfYg.mjs → renderers-CP8CFWDs-B8HIr3kj.mjs} +2 -2
- package/dist/{renderers-CP8CFWDs-ZKjdDfYg.mjs.map → renderers-CP8CFWDs-B8HIr3kj.mjs.map} +1 -1
- package/dist/signals/index.d.mts +5 -5
- package/dist/signals/index.mjs +4 -4
- package/package.json +58 -55
- package/dist/dist-Cog5jyVI.mjs.map +0 -1
- package/dist/index-Cpkzy5XR.d.mts.map +0 -1
- package/dist/index-D__HdInU.d.mts.map +0 -1
- package/dist/index-DpWia6iH.d.mts.map +0 -1
- package/dist/preview-engine/chunk-3GNP7TJH.mjs +0 -98
- package/dist/preview-engine/chunk-CYY366IE.mjs +0 -1
- package/dist/preview-engine/chunk-NI577OMQ.mjs +0 -1
- package/dist/preview-engine/chunk-VRGREB3V.mjs +0 -1
- package/dist/renderer-3MuT2oZO.mjs +0 -5
- package/dist/renderer-AX_fHrXM.mjs +0 -5
- package/dist/renderer-B2-LQreV.mjs +0 -5
- package/dist/renderer-B2QhkksW.mjs +0 -5
- package/dist/renderer-B5CoE2Cv.mjs +0 -5
- package/dist/renderer-B6Au6f82.mjs +0 -5
- package/dist/renderer-B6qAMLXh.mjs +0 -5
- package/dist/renderer-B6x_Mmpf.mjs.map +0 -1
- package/dist/renderer-BEfvyxL_.mjs +0 -5
- package/dist/renderer-BH4j4urG.mjs +0 -5
- package/dist/renderer-BH4zfzus.mjs +0 -5
- package/dist/renderer-BRjW_pgJ.mjs +0 -6
- package/dist/renderer-BVo6W_BO.mjs +0 -5
- package/dist/renderer-BbxBM7Vh.mjs +0 -5
- package/dist/renderer-C07CnYVd.mjs +0 -5
- package/dist/renderer-C2Z3vJCu.mjs +0 -5
- package/dist/renderer-C31qkFvm.mjs +0 -5
- package/dist/renderer-C3FV8cYm.mjs +0 -5
- package/dist/renderer-CQXszrAF.mjs +0 -5
- package/dist/renderer-CWK41ajp.mjs +0 -5
- package/dist/renderer-C_U225ub.mjs +0 -5
- package/dist/renderer-C_nPzKwZ.mjs +0 -5
- package/dist/renderer-Cd6I_dsC.mjs +0 -5
- package/dist/renderer-Ceb06HuN.mjs +0 -5
- package/dist/renderer-D3P5SLcx.mjs +0 -5
- package/dist/renderer-D9R8QXS7.mjs +0 -5
- package/dist/renderer-D9SJ4Fg9.mjs +0 -5
- package/dist/renderer-DGAypVNj.mjs +0 -5
- package/dist/renderer-DLAAfwg0.mjs +0 -5
- package/dist/renderer-DTkBPkBu.mjs +0 -5
- package/dist/renderer-DbaTMTuo.mjs +0 -5
- package/dist/renderer-DsxhQdCp.mjs +0 -5
- package/dist/renderer-GSFP7v2z.mjs +0 -3
- package/dist/renderer-Hf1pCqoN.mjs +0 -5
- package/dist/renderer-V0UuIniZ.mjs +0 -5
- package/dist/renderer-VCnMXWqE.mjs +0 -5
- package/dist/renderer-lifu3xIt.mjs +0 -5
- package/dist/renderer-mPDgLBi4.mjs +0 -5
- package/dist/renderer-mp1NN5zk.mjs.map +0 -1
|
@@ -190,7 +190,7 @@ const COCO_CLASSES = [
|
|
|
190
190
|
];
|
|
191
191
|
|
|
192
192
|
//#endregion
|
|
193
|
-
//#region ../vision/dist/src-
|
|
193
|
+
//#region ../vision/dist/src-BjTNynFj.mjs
|
|
194
194
|
function computeIoU(boxA, boxB) {
|
|
195
195
|
const xA = Math.max(boxA.originX, boxB.originX);
|
|
196
196
|
const yA = Math.max(boxA.originY, boxB.originY);
|
|
@@ -1534,27 +1534,42 @@ var WebGPUProvider = class {
|
|
|
1534
1534
|
const ORT_WEBGPU_SPECIFIER = "onnxruntime-web/webgpu";
|
|
1535
1535
|
const WEBGPU_SPECIFIER = "webgpu";
|
|
1536
1536
|
let nodeWebGPUReady;
|
|
1537
|
+
/** CPU rasterizers (lavapipe, llvmpipe, SwiftShader): slower than the CPU EP. */
|
|
1538
|
+
const SOFTWARE_ADAPTER = /llvmpipe|lavapipe|swiftshader|software/i;
|
|
1537
1539
|
/**
|
|
1538
|
-
* Ensure `globalThis.navigator.gpu` exists
|
|
1539
|
-
*
|
|
1540
|
-
*
|
|
1540
|
+
* Ensure `globalThis.navigator.gpu` exists and has a hardware adapter that
|
|
1541
|
+
* onnxruntime-web's WebGPU EP can use. In the renderer this is already the Dawn
|
|
1542
|
+
* device; otherwise imports the `webgpu` (Dawn) package and installs its
|
|
1543
|
+
* globals. Rejects when the only adapter is a software rasterizer.
|
|
1541
1544
|
*/
|
|
1542
1545
|
function ensureNodeWebGPU() {
|
|
1543
1546
|
if (!nodeWebGPUReady) {
|
|
1544
1547
|
nodeWebGPUReady = (async () => {
|
|
1545
1548
|
const g = globalThis;
|
|
1546
|
-
if (g.navigator?.gpu)
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1549
|
+
if (!g.navigator?.gpu) {
|
|
1550
|
+
const { create, globals } = await import(
|
|
1551
|
+
/* @vite-ignore */
|
|
1552
|
+
WEBGPU_SPECIFIER
|
|
1550
1553
|
);
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1554
|
+
Object.assign(globalThis, globals);
|
|
1555
|
+
g.navigator ??= {};
|
|
1556
|
+
Object.defineProperty(g.navigator, "gpu", {
|
|
1557
|
+
value: create([]),
|
|
1558
|
+
configurable: true,
|
|
1559
|
+
writable: true
|
|
1560
|
+
});
|
|
1561
|
+
}
|
|
1562
|
+
const adapter = await (g.navigator?.gpu).requestAdapter({ powerPreference: "high-performance" });
|
|
1563
|
+
if (!adapter) throw new Error("No WebGPU adapter.");
|
|
1564
|
+
const info = adapter.info ?? {};
|
|
1565
|
+
const name = [
|
|
1566
|
+
info.vendor,
|
|
1567
|
+
info.architecture,
|
|
1568
|
+
info.device,
|
|
1569
|
+
info.description
|
|
1570
|
+
].filter(Boolean).join(" ");
|
|
1571
|
+
if (adapter.isFallbackAdapter === true || info.isFallbackAdapter === true || SOFTWARE_ADAPTER.test(name)) throw new Error(`WebGPU adapter is a software rasterizer (${name}).`);
|
|
1572
|
+
patchSupportedFeatures(adapter.features);
|
|
1558
1573
|
})();
|
|
1559
1574
|
nodeWebGPUReady.catch(() => {
|
|
1560
1575
|
nodeWebGPUReady = void 0;
|
|
@@ -1562,6 +1577,36 @@ function ensureNodeWebGPU() {
|
|
|
1562
1577
|
}
|
|
1563
1578
|
return nodeWebGPUReady;
|
|
1564
1579
|
}
|
|
1580
|
+
/**
|
|
1581
|
+
* Dawn's Node `GPUSupportedFeatures` has `has`/`keys`/`size` but no `forEach`,
|
|
1582
|
+
* which onnxruntime-web's WebGPU build calls on adapter and device features
|
|
1583
|
+
* (they share the class). Adds the missing set-like methods once.
|
|
1584
|
+
*/
|
|
1585
|
+
function patchSupportedFeatures(features) {
|
|
1586
|
+
const proto = Object.getPrototypeOf(features);
|
|
1587
|
+
if (!proto || typeof proto.keys !== "function") return;
|
|
1588
|
+
if (typeof proto.forEach !== "function") Object.defineProperty(proto, "forEach", {
|
|
1589
|
+
value(callback, thisArg) {
|
|
1590
|
+
for (const key of this.keys()) callback.call(thisArg, key, key, this);
|
|
1591
|
+
},
|
|
1592
|
+
configurable: true,
|
|
1593
|
+
writable: true
|
|
1594
|
+
});
|
|
1595
|
+
if (typeof proto.values !== "function") Object.defineProperty(proto, "values", {
|
|
1596
|
+
value() {
|
|
1597
|
+
return this.keys();
|
|
1598
|
+
},
|
|
1599
|
+
configurable: true,
|
|
1600
|
+
writable: true
|
|
1601
|
+
});
|
|
1602
|
+
if (typeof proto.entries !== "function") Object.defineProperty(proto, "entries", {
|
|
1603
|
+
*value() {
|
|
1604
|
+
for (const key of this.keys()) yield [key, key];
|
|
1605
|
+
},
|
|
1606
|
+
configurable: true,
|
|
1607
|
+
writable: true
|
|
1608
|
+
});
|
|
1609
|
+
}
|
|
1565
1610
|
var NodeWebGPUProvider = class {
|
|
1566
1611
|
kind = "webgpu";
|
|
1567
1612
|
_inner;
|
|
@@ -1573,6 +1618,7 @@ var NodeWebGPUProvider = class {
|
|
|
1573
1618
|
ORT_WEBGPU_SPECIFIER
|
|
1574
1619
|
);
|
|
1575
1620
|
if (mod.env?.wasm) mod.env.wasm.numThreads = 1;
|
|
1621
|
+
if (mod.env?.webgpu) mod.env.webgpu.powerPreference = "high-performance";
|
|
1576
1622
|
return mod;
|
|
1577
1623
|
});
|
|
1578
1624
|
this._inner = new WebGPUProvider({
|
|
@@ -1586,41 +1632,113 @@ var NodeWebGPUProvider = class {
|
|
|
1586
1632
|
}
|
|
1587
1633
|
};
|
|
1588
1634
|
let defaultProvider;
|
|
1635
|
+
function requestedVisionBackend() {
|
|
1636
|
+
const value = typeof process !== "undefined" ? process.env.FRAMEFIELDS_VISION_PROVIDER?.trim().toLowerCase() : void 0;
|
|
1637
|
+
return value === "webgpu" || value === "cuda" || value === "cpu" ? value : "auto";
|
|
1638
|
+
}
|
|
1589
1639
|
/**
|
|
1590
1640
|
* Prefers the GPU (onnxruntime-web's WebGPU EP on the process's WebGPU device —
|
|
1591
1641
|
* the Dawn device the renderer already creates, or one this ensures) and falls
|
|
1592
1642
|
* back to the CPU provider (onnxruntime-node) when a WebGPU session cannot be
|
|
1593
|
-
* created: no
|
|
1594
|
-
*
|
|
1643
|
+
* created: no hardware adapter, no Dawn, or onnxruntime-web not installed. The
|
|
1644
|
+
* choice is made on the first session and kept.
|
|
1645
|
+
*
|
|
1646
|
+
* `FRAMEFIELDS_VISION_PROVIDER` forces one backend instead: `webgpu`, `cpu`, or
|
|
1647
|
+
* `cuda` (onnxruntime-node's CUDA EP on Linux x64; needs the CUDA 12 and cuDNN 9
|
|
1648
|
+
* libraries). A forced backend that fails throws instead of falling back.
|
|
1595
1649
|
*/
|
|
1596
1650
|
var AutoSessionProvider = class {
|
|
1597
1651
|
_resolved;
|
|
1652
|
+
_resolving;
|
|
1598
1653
|
get kind() {
|
|
1599
1654
|
return this._resolved?.kind ?? "webgpu";
|
|
1600
1655
|
}
|
|
1601
1656
|
async createSession(modelBytes) {
|
|
1602
|
-
if (
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
this.
|
|
1607
|
-
|
|
1608
|
-
}
|
|
1609
|
-
|
|
1610
|
-
|
|
1657
|
+
if (this._resolved) return this._resolved.createSession(modelBytes);
|
|
1658
|
+
if (!this._resolving) {
|
|
1659
|
+
this._resolving = this.resolve(modelBytes);
|
|
1660
|
+
this._resolving.catch(() => {
|
|
1661
|
+
this._resolving = void 0;
|
|
1662
|
+
});
|
|
1663
|
+
const { provider: provider$1, first } = await this._resolving;
|
|
1664
|
+
this._resolved = provider$1;
|
|
1665
|
+
if (first) return first;
|
|
1666
|
+
return provider$1.createSession(modelBytes);
|
|
1667
|
+
}
|
|
1668
|
+
const { provider } = await this._resolving;
|
|
1669
|
+
return provider.createSession(modelBytes);
|
|
1670
|
+
}
|
|
1671
|
+
async resolve(modelBytes) {
|
|
1672
|
+
const backend = requestedVisionBackend();
|
|
1673
|
+
if (backend === "cpu") return { provider: new NodeSessionProvider() };
|
|
1674
|
+
if (backend === "cuda") return { provider: new NodeSessionProvider({ executionProviders: ["cuda", "cpu"] }) };
|
|
1675
|
+
const webgpu = new NodeWebGPUProvider({ wasmFallback: false });
|
|
1676
|
+
try {
|
|
1677
|
+
return {
|
|
1678
|
+
provider: webgpu,
|
|
1679
|
+
first: await webgpu.createSession(modelBytes)
|
|
1680
|
+
};
|
|
1681
|
+
} catch (err) {
|
|
1682
|
+
if (backend === "webgpu") throw err;
|
|
1683
|
+
return { provider: new NodeSessionProvider() };
|
|
1611
1684
|
}
|
|
1612
|
-
return this._resolved.createSession(modelBytes);
|
|
1613
1685
|
}
|
|
1614
1686
|
};
|
|
1687
|
+
let processProvider;
|
|
1615
1688
|
/**
|
|
1616
1689
|
* The provider for a runner created without one: GPU if possible, otherwise CPU.
|
|
1690
|
+
* One per process, so the GPU probe runs once however many runners there are.
|
|
1617
1691
|
*/
|
|
1618
1692
|
function createDefaultSessionProvider() {
|
|
1619
|
-
|
|
1693
|
+
if (defaultProvider) return defaultProvider();
|
|
1694
|
+
processProvider ??= new AutoSessionProvider();
|
|
1695
|
+
return processProvider;
|
|
1696
|
+
}
|
|
1697
|
+
/**
|
|
1698
|
+
* CPUs this process may use: the affinity mask, capped by a cgroup CPU quota
|
|
1699
|
+
* (containers). ONNX Runtime sizes its thread pool from the host's cores, which
|
|
1700
|
+
* oversubscribes a container limited to fewer CPUs than the host has.
|
|
1701
|
+
*/
|
|
1702
|
+
async function availableCpus() {
|
|
1703
|
+
const os$1 = await import("node:os");
|
|
1704
|
+
const cpus = typeof os$1.availableParallelism === "function" ? os$1.availableParallelism() : os$1.cpus().length;
|
|
1705
|
+
const quota = await cgroupCpuQuota();
|
|
1706
|
+
return Math.max(1, quota !== void 0 ? Math.min(cpus, quota) : cpus);
|
|
1707
|
+
}
|
|
1708
|
+
/** cgroup v2 `cpu.max` or v1 `cpu.cfs_quota_us`, in CPUs (rounded up); undefined when unlimited. */
|
|
1709
|
+
async function cgroupCpuQuota() {
|
|
1710
|
+
if (typeof process === "undefined" || process.platform !== "linux") return;
|
|
1711
|
+
const { readFile: readFile$1 } = await import("node:fs/promises");
|
|
1712
|
+
const read = (path$1) => readFile$1(path$1, "utf8").then((text) => text.trim(), () => void 0);
|
|
1713
|
+
const toCpus = (quota, period) => quota > 0 && period > 0 ? Math.ceil(quota / period) : void 0;
|
|
1714
|
+
const v2 = await read("/sys/fs/cgroup/cpu.max");
|
|
1715
|
+
if (v2 !== void 0) {
|
|
1716
|
+
const [quota, period] = v2.split(/\s+/);
|
|
1717
|
+
return quota === "max" ? void 0 : toCpus(Number(quota), Number(period));
|
|
1718
|
+
}
|
|
1719
|
+
const v1Quota = await read("/sys/fs/cgroup/cpu/cpu.cfs_quota_us");
|
|
1720
|
+
const v1Period = await read("/sys/fs/cgroup/cpu/cpu.cfs_period_us");
|
|
1721
|
+
if (v1Quota === void 0 || v1Period === void 0) return void 0;
|
|
1722
|
+
return toCpus(Number(v1Quota), Number(v1Period));
|
|
1723
|
+
}
|
|
1724
|
+
/**
|
|
1725
|
+
* Intra-op threads for CPU sessions: `FRAMEFIELDS_VISION_THREADS` when set,
|
|
1726
|
+
* else the available CPUs on Linux (where containers cap them), else ONNX
|
|
1727
|
+
* Runtime's own default (undefined).
|
|
1728
|
+
*/
|
|
1729
|
+
async function cpuSessionThreads() {
|
|
1730
|
+
const env = typeof process !== "undefined" ? Number.parseInt(process.env.FRAMEFIELDS_VISION_THREADS ?? "", 10) : NaN;
|
|
1731
|
+
if (Number.isFinite(env) && env > 0) return env;
|
|
1732
|
+
if (typeof process === "undefined" || process.platform !== "linux") return;
|
|
1733
|
+
return availableCpus();
|
|
1620
1734
|
}
|
|
1621
1735
|
/** onnxruntime-node provider. The native module is imported lazily on first session. */
|
|
1622
1736
|
var NodeSessionProvider = class {
|
|
1623
1737
|
kind = "node";
|
|
1738
|
+
_executionProviders;
|
|
1739
|
+
constructor(options = {}) {
|
|
1740
|
+
this._executionProviders = options.executionProviders ?? ["cpu"];
|
|
1741
|
+
}
|
|
1624
1742
|
ortPromise;
|
|
1625
1743
|
async ort() {
|
|
1626
1744
|
if (!this.ortPromise) this.ortPromise = import("onnxruntime-node").catch((err) => {
|
|
@@ -1631,9 +1749,14 @@ var NodeSessionProvider = class {
|
|
|
1631
1749
|
}
|
|
1632
1750
|
async createSession(modelBytes) {
|
|
1633
1751
|
const ort = await this.ort();
|
|
1752
|
+
const threads = await cpuSessionThreads();
|
|
1634
1753
|
const session = await ort.InferenceSession.create(modelBytes, {
|
|
1635
|
-
executionProviders: [
|
|
1636
|
-
graphOptimizationLevel: "all"
|
|
1754
|
+
executionProviders: [...this._executionProviders],
|
|
1755
|
+
graphOptimizationLevel: "all",
|
|
1756
|
+
...threads !== void 0 ? {
|
|
1757
|
+
intraOpNumThreads: threads,
|
|
1758
|
+
interOpNumThreads: 1
|
|
1759
|
+
} : {}
|
|
1637
1760
|
});
|
|
1638
1761
|
return {
|
|
1639
1762
|
run: async (input) => {
|
|
@@ -1652,6 +1775,7 @@ var NodeSessionProvider = class {
|
|
|
1652
1775
|
};
|
|
1653
1776
|
}
|
|
1654
1777
|
};
|
|
1778
|
+
const MAX_INSTANCE_PASSES = 4;
|
|
1655
1779
|
/**
|
|
1656
1780
|
* Lazy vision runner.
|
|
1657
1781
|
*
|
|
@@ -1666,38 +1790,57 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1666
1790
|
classes;
|
|
1667
1791
|
maskThreshold;
|
|
1668
1792
|
featherRadius;
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
/** One RTMDet-Ins pass per frame buffer, shared by detect() and segment(). */
|
|
1674
|
-
_instancePass;
|
|
1675
|
-
constructor(options) {
|
|
1793
|
+
_core;
|
|
1794
|
+
/** False for derived runners: their sessions belong to the runner they came from. */
|
|
1795
|
+
_ownsCore;
|
|
1796
|
+
constructor(options, core) {
|
|
1676
1797
|
this.variant = options.variant ?? "s";
|
|
1677
1798
|
this.confidence = options.confidence ?? .3;
|
|
1678
1799
|
this.classes = options.classes;
|
|
1679
1800
|
this.maskThreshold = options.maskThreshold ?? .5;
|
|
1680
1801
|
this.featherRadius = options.featherRadius;
|
|
1681
|
-
this.
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1802
|
+
this._ownsCore = core === void 0;
|
|
1803
|
+
this._core = core ?? {
|
|
1804
|
+
store: options.store ?? new VisionModelStore({
|
|
1805
|
+
modelsDir: options.modelsDir,
|
|
1806
|
+
baseUrl: options.baseUrl,
|
|
1807
|
+
timeoutMs: options.timeoutMs,
|
|
1808
|
+
onProgress: options.onProgress
|
|
1809
|
+
}),
|
|
1810
|
+
provider: options.provider ?? createDefaultSessionProvider(),
|
|
1811
|
+
sessions: /* @__PURE__ */ new Map(),
|
|
1812
|
+
tensorScratch: /* @__PURE__ */ new Map(),
|
|
1813
|
+
runQueue: /* @__PURE__ */ new Map(),
|
|
1814
|
+
instancePasses: []
|
|
1815
|
+
};
|
|
1688
1816
|
}
|
|
1689
1817
|
/** Cheap: no downloads, no sessions, no side effects. */
|
|
1690
1818
|
static create(options = {}) {
|
|
1691
1819
|
return new VisionRunner$1(options);
|
|
1692
1820
|
}
|
|
1821
|
+
/**
|
|
1822
|
+
* A runner with other decode options (confidence, classes, mask threshold,
|
|
1823
|
+
* feather) that shares this runner's models, sessions and per-frame RTMDet-Ins
|
|
1824
|
+
* pass — e.g. one per layer, without loading a model twice. Its `close()` is a
|
|
1825
|
+
* no-op; closing this runner releases the shared sessions.
|
|
1826
|
+
*/
|
|
1827
|
+
derive(options) {
|
|
1828
|
+
return new VisionRunner$1({
|
|
1829
|
+
variant: this.variant,
|
|
1830
|
+
confidence: options.confidence ?? this.confidence,
|
|
1831
|
+
classes: "classes" in options ? options.classes : this.classes,
|
|
1832
|
+
maskThreshold: options.maskThreshold ?? this.maskThreshold,
|
|
1833
|
+
featherRadius: "featherRadius" in options ? options.featherRadius : this.featherRadius
|
|
1834
|
+
}, this._core);
|
|
1835
|
+
}
|
|
1693
1836
|
get modelsDir() {
|
|
1694
|
-
return this.
|
|
1837
|
+
return this._core.store.modelsDir;
|
|
1695
1838
|
}
|
|
1696
1839
|
/** Every registry model keyed to its current download state (downloaded → "ready"). */
|
|
1697
1840
|
get downloadStatus() {
|
|
1698
1841
|
const statuses = /* @__PURE__ */ new Map();
|
|
1699
1842
|
for (const key of Object.keys(VISION_MODELS)) statuses.set(key, "pending");
|
|
1700
|
-
for (const [key, status] of this.
|
|
1843
|
+
for (const [key, status] of this._core.store.statuses()) statuses.set(key, status);
|
|
1701
1844
|
return statuses;
|
|
1702
1845
|
}
|
|
1703
1846
|
/** The model serving `task` (matte depends on frame aspect; defaults to square). */
|
|
@@ -1714,7 +1857,7 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1714
1857
|
keys.add("selfie-square");
|
|
1715
1858
|
keys.add("selfie-landscape");
|
|
1716
1859
|
} else keys.add(this.modelKeyFor(task));
|
|
1717
|
-
await this.
|
|
1860
|
+
await this._core.store.preload([...keys]);
|
|
1718
1861
|
await Promise.all([...keys].map((key) => this.session(key)));
|
|
1719
1862
|
}
|
|
1720
1863
|
/** COCO-80 boxes (sorted by score, source pixels). Masks are not decoded. */
|
|
@@ -1761,13 +1904,19 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1761
1904
|
});
|
|
1762
1905
|
}
|
|
1763
1906
|
close() {
|
|
1764
|
-
|
|
1765
|
-
this.
|
|
1766
|
-
|
|
1767
|
-
|
|
1907
|
+
if (!this._ownsCore) return;
|
|
1908
|
+
const core = this._core;
|
|
1909
|
+
for (const promise of core.sessions.values()) promise.then((session) => session.release()).catch(() => void 0);
|
|
1910
|
+
core.sessions.clear();
|
|
1911
|
+
core.runQueue.clear();
|
|
1912
|
+
core.instancePasses.length = 0;
|
|
1913
|
+
core.store.clearMemoryCache();
|
|
1768
1914
|
}
|
|
1769
1915
|
instancePass(image) {
|
|
1770
|
-
|
|
1916
|
+
const passes = this._core.instancePasses;
|
|
1917
|
+
const content = contentKey(image);
|
|
1918
|
+
const byContent = passes.find((pass$1) => pass$1.content === content);
|
|
1919
|
+
if (byContent) return byContent.result;
|
|
1771
1920
|
const key = this.modelKeyFor("segment");
|
|
1772
1921
|
const result = this.infer(key, image).then(({ outputs, transform }) => {
|
|
1773
1922
|
const dets = output(outputs, "dets", key);
|
|
@@ -1784,12 +1933,15 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1784
1933
|
}
|
|
1785
1934
|
};
|
|
1786
1935
|
});
|
|
1787
|
-
|
|
1788
|
-
|
|
1936
|
+
const pass = {
|
|
1937
|
+
content,
|
|
1789
1938
|
result
|
|
1790
1939
|
};
|
|
1940
|
+
passes.push(pass);
|
|
1941
|
+
if (passes.length > MAX_INSTANCE_PASSES) passes.shift();
|
|
1791
1942
|
result.catch(() => {
|
|
1792
|
-
|
|
1943
|
+
const index = passes.indexOf(pass);
|
|
1944
|
+
if (index >= 0) passes.splice(index, 1);
|
|
1793
1945
|
});
|
|
1794
1946
|
return result;
|
|
1795
1947
|
}
|
|
@@ -1805,15 +1957,30 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1805
1957
|
...this.featherRadius !== void 0 ? { featherRadius: this.featherRadius } : {}
|
|
1806
1958
|
};
|
|
1807
1959
|
}
|
|
1808
|
-
|
|
1960
|
+
/**
|
|
1961
|
+
* Runs one model on one image. Runs of the same model are queued: they share
|
|
1962
|
+
* the input scratch buffer, and one run already uses the session's threads.
|
|
1963
|
+
*/
|
|
1964
|
+
infer(key, image) {
|
|
1965
|
+
const queue = this._core.runQueue;
|
|
1966
|
+
const run = (queue.get(key) ?? Promise.resolve()).then(() => this.inferNow(key, image), () => this.inferNow(key, image));
|
|
1967
|
+
const tail = run.catch(() => void 0);
|
|
1968
|
+
queue.set(key, tail);
|
|
1969
|
+
tail.then(() => {
|
|
1970
|
+
if (queue.get(key) === tail) queue.delete(key);
|
|
1971
|
+
});
|
|
1972
|
+
return run;
|
|
1973
|
+
}
|
|
1974
|
+
async inferNow(key, image) {
|
|
1809
1975
|
const session = await this.session(key);
|
|
1810
1976
|
const desc = VISION_MODELS[key];
|
|
1811
1977
|
const spec = preprocessSpec(desc.family, desc.input);
|
|
1812
1978
|
const size = 3 * spec.width * spec.height;
|
|
1813
|
-
|
|
1979
|
+
const scratchByKey = this._core.tensorScratch;
|
|
1980
|
+
let scratch = scratchByKey.get(key);
|
|
1814
1981
|
if (!scratch || scratch.length < size) {
|
|
1815
1982
|
scratch = new Float32Array(size);
|
|
1816
|
-
|
|
1983
|
+
scratchByKey.set(key, scratch);
|
|
1817
1984
|
}
|
|
1818
1985
|
const { tensor, transform } = imageToTensor(image, spec, scratch);
|
|
1819
1986
|
return {
|
|
@@ -1831,18 +1998,34 @@ var VisionRunner = class VisionRunner$1 {
|
|
|
1831
1998
|
};
|
|
1832
1999
|
}
|
|
1833
2000
|
session(key) {
|
|
1834
|
-
|
|
2001
|
+
const { sessions, store, provider } = this._core;
|
|
2002
|
+
let promise = sessions.get(key);
|
|
1835
2003
|
if (!promise) {
|
|
1836
|
-
promise =
|
|
1837
|
-
|
|
1838
|
-
|
|
2004
|
+
promise = store.ensure(key).then((bytes) => provider.createSession(bytes)).catch((err) => {
|
|
2005
|
+
sessions.delete(key);
|
|
2006
|
+
store.evict(key);
|
|
1839
2007
|
throw err;
|
|
1840
2008
|
});
|
|
1841
|
-
|
|
2009
|
+
sessions.set(key, promise);
|
|
1842
2010
|
}
|
|
1843
2011
|
return promise;
|
|
1844
2012
|
}
|
|
1845
2013
|
};
|
|
2014
|
+
/** Size plus a 64-bit hash of the pixels: equal keys mean the same picture. */
|
|
2015
|
+
function contentKey(image) {
|
|
2016
|
+
const { data } = image;
|
|
2017
|
+
const words = data.byteOffset % 4 === 0 ? data.byteLength >>> 2 : 0;
|
|
2018
|
+
const view = new Uint32Array(data.buffer, data.byteOffset, words);
|
|
2019
|
+
let h1 = 2166136261;
|
|
2020
|
+
let h2 = 16777619 ^ data.byteLength;
|
|
2021
|
+
for (let i = 0; i < words; i++) {
|
|
2022
|
+
const v = view[i];
|
|
2023
|
+
h1 = Math.imul(h1 ^ v, 2654435761);
|
|
2024
|
+
h2 = Math.imul(h2 ^ v, 2246822519) ^ h1 >>> 15;
|
|
2025
|
+
}
|
|
2026
|
+
for (let i = words * 4; i < data.length; i++) h1 = Math.imul(h1 ^ data[i], 2654435761);
|
|
2027
|
+
return `${image.width}x${image.height}:${(h1 >>> 0).toString(36)}:${(h2 >>> 0).toString(36)}`;
|
|
2028
|
+
}
|
|
1846
2029
|
function output(outputs, name, key) {
|
|
1847
2030
|
const tensor = outputs[name];
|
|
1848
2031
|
if (!tensor) throw new Error(`Vision model '${key}' returned no '${name}' output (got: ${Object.keys(outputs).join(", ") || "none"}). Expected the ${VISION_MODELS[key].source}.`);
|
|
@@ -3014,7 +3197,7 @@ var VisionNode = class VisionNode$1 {
|
|
|
3014
3197
|
};
|
|
3015
3198
|
|
|
3016
3199
|
//#endregion
|
|
3017
|
-
//#region ../../nodes/node-vision/dist/renderers-
|
|
3200
|
+
//#region ../../nodes/node-vision/dist/renderers-BcBWZ-Rc.mjs
|
|
3018
3201
|
let scratchValues = new Uint8Array(0);
|
|
3019
3202
|
let scratchLengths = new Uint32Array(0);
|
|
3020
3203
|
function encodeMask(mask, width, height) {
|
|
@@ -3287,7 +3470,13 @@ var MatteCompositor = class {
|
|
|
3287
3470
|
pass.end();
|
|
3288
3471
|
}
|
|
3289
3472
|
};
|
|
3290
|
-
|
|
3473
|
+
/**
|
|
3474
|
+
* Runners by model options (variant, models dir, mirror), each with the runners
|
|
3475
|
+
* derived from it by decode options — layers that differ only in classes or
|
|
3476
|
+
* confidence share sessions instead of reloading the models.
|
|
3477
|
+
*/
|
|
3478
|
+
const sharedRunners = /* @__PURE__ */ new Map();
|
|
3479
|
+
const MAX_SHARED_RUNNERS = 4;
|
|
3291
3480
|
let sharedSkeletonRenderer = null;
|
|
3292
3481
|
let sharedCompositor = null;
|
|
3293
3482
|
let sharedCompositorFormat = null;
|
|
@@ -3384,27 +3573,42 @@ function selectSubject(selected, nodeKey, frame) {
|
|
|
3384
3573
|
/**
|
|
3385
3574
|
* Lazy shared runner — `create()` is a pure constructor (zero I/O); the first frame that
|
|
3386
3575
|
* requests a task triggers that task's model download at inference time (never at init).
|
|
3387
|
-
*
|
|
3576
|
+
* Nodes with the same model options share sessions; decode options (classes,
|
|
3577
|
+
* confidence, …) get a derived runner over the same sessions.
|
|
3388
3578
|
*/
|
|
3389
3579
|
function getSharedRunner(op) {
|
|
3390
|
-
const
|
|
3580
|
+
const modelOptions = {
|
|
3391
3581
|
variant: op.variant,
|
|
3392
|
-
confidence: op.confidence,
|
|
3393
|
-
classes: op.classes,
|
|
3394
|
-
maskThreshold: op.maskThreshold,
|
|
3395
|
-
featherRadius: op.featherRadius,
|
|
3396
3582
|
modelsDir: op.modelsDir,
|
|
3397
3583
|
baseUrl: op.baseUrl
|
|
3398
3584
|
};
|
|
3399
|
-
const
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
runner
|
|
3585
|
+
const modelKey = JSON.stringify(modelOptions);
|
|
3586
|
+
let entry = sharedRunners.get(modelKey);
|
|
3587
|
+
if (!entry) {
|
|
3588
|
+
if (sharedRunners.size >= MAX_SHARED_RUNNERS) {
|
|
3589
|
+
const [oldestKey, oldest] = sharedRunners.entries().next().value;
|
|
3590
|
+
oldest.runner.close();
|
|
3591
|
+
sharedRunners.delete(oldestKey);
|
|
3592
|
+
}
|
|
3593
|
+
entry = {
|
|
3594
|
+
runner: VisionRunner.create(modelOptions),
|
|
3595
|
+
derived: /* @__PURE__ */ new Map()
|
|
3405
3596
|
};
|
|
3597
|
+
sharedRunners.set(modelKey, entry);
|
|
3598
|
+
}
|
|
3599
|
+
const decodeOptions = {
|
|
3600
|
+
confidence: op.confidence,
|
|
3601
|
+
classes: op.classes,
|
|
3602
|
+
maskThreshold: op.maskThreshold,
|
|
3603
|
+
featherRadius: op.featherRadius
|
|
3604
|
+
};
|
|
3605
|
+
const decodeKey = JSON.stringify(decodeOptions);
|
|
3606
|
+
let runner = entry.derived.get(decodeKey);
|
|
3607
|
+
if (!runner) {
|
|
3608
|
+
runner = entry.runner.derive(decodeOptions);
|
|
3609
|
+
entry.derived.set(decodeKey, runner);
|
|
3406
3610
|
}
|
|
3407
|
-
return
|
|
3611
|
+
return runner;
|
|
3408
3612
|
}
|
|
3409
3613
|
function getObjectTracker(nodeKey, op) {
|
|
3410
3614
|
let tracker = objectTrackers.get(nodeKey);
|
|
@@ -3955,4 +4159,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer })
|
|
|
3955
4159
|
|
|
3956
4160
|
//#endregion
|
|
3957
4161
|
export { PoseSkeletonRenderer as a, TemporalObjectTracker as c, VisionRunner as d, analyzeSequence as f, COCO_CLASSES as h, COCO17_KEYPOINT_NAMES as i, VisionBundle as l, pinNodeToObject as m, COCO17_BONES as n, SegmentationTexturePool as o, pinNodeToLandmark as p, COCO17_KEYPOINTS as r, SpatialLandmarkTransformer as s, renderers_default as t, VisionNode as u };
|
|
3958
|
-
//# sourceMappingURL=renderer-
|
|
4162
|
+
//# sourceMappingURL=renderer-dc39dBVA.mjs.map
|