shreyask commited on
Commit
016edcd
·
verified ·
1 Parent(s): 3402dce

initial upload: Falcon Perception browser demo

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ examples/perception.jpg filter=lfs diff=lfs merge=lfs -text
37
+ examples/sprinters.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,10 +1,39 @@
1
  ---
2
  title: Falcon Perception
3
- emoji: 👀
4
- colorFrom: indigo
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Falcon Perception
3
+ emoji: 🦅
4
+ colorFrom: blue
5
+ colorTo: indigo
6
  sdk: static
7
  pinned: false
8
+ license: apache-2.0
9
+ short_description: Open-vocabulary detection in-browser via WebGPU
10
  ---
11
 
12
+ # Falcon Perception In-Browser Demo
13
+
14
+ Interactive demo of [tiiuae/Falcon-Perception](https://huggingface.co/tiiuae/Falcon-Perception), a 0.6B-parameter vision-language model that does open-vocabulary object detection and segmentation from natural-language queries.
15
+
16
+ **Everything runs in your browser.** The model (~2 GB) is downloaded once from the Hub, cached, and executed on your GPU/CPU via ONNX Runtime Web. No server, no uploads.
17
+
18
+ ## What's here
19
+
20
+ - Query-driven detection: type what you want to find (e.g. `"athletes"`, `"the runner in front"`, `"orange cut from the top"`), get bounding boxes
21
+ - Toggle between Detection (bboxes) and Segmentation (colored regions — pixel-accurate masks coming once we export the AnyUp upsampler)
22
+ - History of recent runs, bundled example images, and a performance panel
23
+ - Greedy bbox-IoU NMS (threshold 0.6) dedupes over-refined predictions
24
+
25
+ ## ONNX weights
26
+
27
+ Model artifacts live at [shreyask/falcon-perception-onnx-webgpu](https://huggingface.co/shreyask/falcon-perception-onnx-webgpu). The critical file is `unified_v2.onnx` which implements 2D golden RoPE on image tokens — the original `unified.onnx` export dropped it, flipping the model's presence logits to absence and producing zero detections.
28
+
29
+ ## Requirements
30
+
31
+ - Chrome / Edge 113+ (WebGPU)
32
+ - ~2 GB free disk (browser cache)
33
+ - Multi-threaded WASM via SharedArrayBuffer, enabled on this Space through [`coi-serviceworker`](https://github.com/gzuidhof/coi-serviceworker)
34
+
35
+ ## Credits
36
+
37
+ - Base model: TII Falcon team
38
+ - MLX reference implementation: [Blaizzy/mlx-vlm](https://github.com/Blaizzy/mlx-vlm)
39
+ - ONNX conversion + browser demo: [@shreyask](https://huggingface.co/shreyask)
assets/chunk-DLHVD8vl.js ADDED
@@ -0,0 +1 @@
 
 
1
+ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});export{n,t};
assets/index-C4_QYrm1.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/index-Irf6GGXu.css ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-500:oklch(69.6% .17 162.48);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.left-3{left:calc(var(--spacing) * 3)}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.-mt-3{margin-top:calc(var(--spacing) * -3)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-full{height:100%}.h-screen{height:100vh}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[60\%\]{max-width:60%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-amber-900\/40{border-color:#7b330666}@supports (color:color-mix(in lab, red, red)){.border-amber-900\/40{border-color:color-mix(in oklab, var(--color-amber-900) 40%, transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/60{border-color:#1e293999}@supports (color:color-mix(in lab, red, red)){.border-gray-800\/60{border-color:color-mix(in oklab, var(--color-gray-800) 60%, transparent)}}.border-gray-800\/70{border-color:#1e2939b3}@supports (color:color-mix(in lab, red, red)){.border-gray-800\/70{border-color:color-mix(in oklab, var(--color-gray-800) 70%, transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab, red, red)){.border-red-500\/30{border-color:color-mix(in oklab, var(--color-red-500) 30%, transparent)}}.border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.border-red-900\/40{border-color:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.border-t-blue-500{border-top-color:var(--color-blue-500)}.bg-amber-950\/20{background-color:#46190133}@supports (color:color-mix(in lab, red, red)){.bg-amber-950\/20{background-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/10{background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.bg-blue-500\/15{background-color:#3080ff26}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/15{background-color:color-mix(in oklab, var(--color-blue-500) 15%, transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/40{background-color:#10182866}@supports (color:color-mix(in lab, red, red)){.bg-gray-900\/40{background-color:color-mix(in oklab, var(--color-gray-900) 40%, transparent)}}.bg-gray-900\/60{background-color:#10182899}@supports (color:color-mix(in lab, red, red)){.bg-gray-900\/60{background-color:color-mix(in oklab, var(--color-gray-900) 60%, transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/80{background-color:#030712cc}@supports (color:color-mix(in lab, red, red)){.bg-gray-950\/80{background-color:color-mix(in oklab, var(--color-gray-950) 80%, transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-red-950\/20{background-color:#46080933}@supports (color:color-mix(in lab, red, red)){.bg-red-950\/20{background-color:color-mix(in oklab, var(--color-red-950) 20%, transparent)}}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing) * 1)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-amber-300\/90{color:#ffd236e6}@supports (color:color-mix(in lab, red, red)){.text-amber-300\/90{color:color-mix(in oklab, var(--color-amber-300) 90%, transparent)}}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-400\/80{color:#ff6568cc}@supports (color:color-mix(in lab, red, red)){.text-red-400\/80{color:color-mix(in oklab, var(--color-red-400) 80%, transparent)}}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-blue-600\/20{--tw-shadow-color:#155dfc33}@supports (color:color-mix(in lab, red, red)){.shadow-blue-600\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-blue-600) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-blue-600\/25{--tw-shadow-color:#155dfc40}@supports (color:color-mix(in lab, red, red)){.shadow-blue-600\/25{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-blue-600) 25%, transparent) var(--tw-shadow-alpha), transparent)}}.ring-blue-500\/20{--tw-ring-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.ring-blue-500\/20{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.ring-gray-800{--tw-ring-color:var(--color-gray-800)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.placeholder\:text-gray-500::placeholder{color:var(--color-gray-500)}@media (hover:hover){.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:ring-blue-500:hover{--tw-ring-color:var(--color-blue-500)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-blue-600:disabled:hover{background-color:var(--color-blue-600)}}@media (width>=40rem){.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}}}html{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}button,input{transition-property:background-color,border-color,color,opacity;transition-duration:.15s}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
assets/inference.worker-CFimk-18.js ADDED
@@ -0,0 +1 @@
 
 
1
+ const e=`shreyask/falcon-perception-onnx-webgpu`,t=`https://huggingface.co/${e}/resolve/main`,n={unified:{file:`unified_v2.onnx`,size:203e7},embed_tokens:{file:`embed_tokens.onnx`,size:256e6},coord_decoder:{file:`coord_decoder.onnx`,size:96e6},size_decoder:{file:`size_decoder.onnx`,size:96e6},segm_head:{file:`segm_head.onnx`,size:9e6},img_projector:{file:`img_projector.onnx`,size:3e6},coord_encoder:{file:`coord_encoder.onnx`,size:2e6},size_encoder:{file:`size_encoder.onnx`,size:2e6}},r={dim:1024,n_layers:28,n_heads:16,head_dim:128,n_kv_heads:8,vocab_size:65536,max_seq_len:8192,segm_out_dim:256,coord_out_dim:2048,size_out_dim:2048,coord_token_id:240,size_token_id:241,seg_token_id:262,eos_id:11,img_id:227,image_cls_token_id:244,img_end_id:230,spatial_patch_size:16,temporal_patch_size:1,channel_size:3,rope_theta:1e4,presence_token_id:268,absence_token_id:269,end_of_query_token_id:263,start_of_query_token_id:264,ref_seg_token_id:258};function i(e,t=.6){if(e.length<=1)return e;let n=e.map((e,t)=>({det:e,idx:t,area:o(e.box)}));n.sort((e,t)=>t.area-e.area);let r=new Set,i=[];for(let{det:e,idx:o}of n){let n=!1;for(let r of i)if(a(e.box,r)>t){n=!0;break}n||(r.add(o),i.push(e.box))}return e.filter((e,t)=>r.has(t))}function a(e,t){let n=Math.max(e.x1,t.x1),r=Math.max(e.y1,t.y1),i=Math.min(e.x2,t.x2),a=Math.min(e.y2,t.y2),s=i-n,c=a-r;if(s<=0||c<=0)return 0;let l=s*c,u=o(e)+o(t)-l;return u>0?l/u:0}function o(e){return Math.max(0,e.x2-e.x1)*Math.max(0,e.y2-e.y1)}let s,c=null,l=!1;const u={};function d(e){self.postMessage(e)}async function f(e,n){let r=`${t}/${e}`,i=await fetch(r);if(!i.ok)throw Error(`Failed to fetch ${e}: ${i.status}`);let a=i.body?.getReader();if(!a)return i.arrayBuffer();let o=[],s=0;for(;;){let{done:t,value:r}=await a.read();if(t)break;o.push(r),s+=r.length,d({type:`progress`,progress:Math.round(s/n*100),loaded:s,total:n,file:e})}let c=new Uint8Array(s),l=0;for(let e of o)c.set(e,l),l+=e.length;return c.buffer}async function p(e,t,n,r){let i=`${t}.data`,[a,o]=await Promise.all([f(t,n*.01),f(i,n*.99)]),c=await s.InferenceSession.create(a,{executionProviders:r,externalData:[{path:i,data:new Uint8Array(o)}]});return console.log(`Loaded ${e}: inputs=[${c.inputNames}] outputs=[${c.outputNames}]`),c}async function m(){try{s=await import(`./ort.bundle.min-BZrO1_VY.js`),s.env.wasm.numThreads=Math.min(4,navigator.hardwareConcurrency||2);let t=import(`./transformers.web-DaZ4EEMB.js`).then(async({AutoTokenizer:t})=>{try{c=await t.from_pretrained(e),console.log(`Tokenizer loaded`)}catch(e){console.warn(`AutoTokenizer failed, will use fallback:`,e.message)}}),r=[`unified`,`embed_tokens`,`coord_decoder`,`size_decoder`,`segm_head`,`img_projector`,`coord_encoder`,`size_encoder`],i=0,a=Object.values(n).reduce((e,t)=>e+t.size,0),o=new Set([`unified`]);for(let e of r){let{file:t,size:r}=n[e];d({type:`progress`,progress:Math.round(i/a*100),loaded:i,total:a,file:t});let s=o.has(e)?[`wasm`]:[`webgpu`,`wasm`];try{u[e]=await p(e,t,r,s)}catch(n){console.warn(`${s[0]} failed for ${e}, trying WASM:`,n.message);try{u[e]=await p(e,t,r,[`wasm`])}catch(t){console.error(`Failed to load ${e}:`,t.message)}}i+=r}await t,c||console.log(`Using fallback tokenizer (hardcoded prompt tokens)`),d({type:`loaded`})}catch(e){d({type:`error`,message:e?.message??`Failed to load models`})}}function ee(e){let t=r.spatial_patch_size,n=e.width,i=e.height,a=Math.min(256/n,256/i,1);n=Math.floor(Math.round(n*a)/t)*t,i=Math.floor(Math.round(i*a)/t)*t,n=Math.max(n,t),i=Math.max(i,t);let o=new OffscreenCanvas(n,i).getContext(`2d`);o.drawImage(e,0,0,n,i);let s=o.getImageData(0,0,n,i),c=new Float32Array(i*n*3);for(let e=0;e<i*n;e++)c[e*3+0]=s.data[e*4+0]/255*2-1,c[e*3+1]=s.data[e*4+1]/255*2-1,c[e*3+2]=s.data[e*4+2]/255*2-1;return{pixels:c,width:n,height:i,patchH:i/t,patchW:n/t}}function te(e,t){let n=Math.sqrt(t/e),r=Math.sqrt(e/t),i=new Float32Array(e*t*2);for(let a=0;a<e;a++){let o=e>1?r*(2*a/(e-1)-1):0;for(let e=0;e<t;e++){let r=t>1?n*(2*e/(t-1)-1):0,s=a*t+e;i[s*2+0]=o,i[s*2+1]=r}}return i}async function h(e,t){if(l){console.log(`[detect] skipped — already running`);return}if(l=!0,console.log(`[detect] query="${t}" image=${e.width}x${e.height}`),!u.unified||!u.embed_tokens){d({type:`error`,message:`Not ready. Sessions: ${Object.keys(u).join(`,`)}`}),l=!1;return}try{let n=performance.now(),a=r.dim,o=r.spatial_patch_size,l=o*o*r.channel_size,{pixels:f,width:p,patchH:m,patchW:h}=ee(e),_=m*h;console.log(`[detect] image: ${p}px, ${m}x${h}=${_} patches`);let re=`Segment these expressions in the image:<|start_of_query|>${t}<|REF_SEG|>`,v;if(c){let e=c.encode(re,{add_special_tokens:!1});v=Array.from(e),console.log(`[detect] text tokens (${v.length}):`,v)}else v=[37462,1978,20528,821,790,6883,549,264,258],console.log(`[detect] using fallback tokens (no query text):`,v);let ie=[245,246,247,248],y=1+ie.length+_+1+v.length,b=new BigInt64Array(y),x=0;b[x++]=BigInt(r.image_cls_token_id);for(let e of ie)b[x++]=BigInt(e);let S=x;for(let e=0;e<_;e++)b[x++]=BigInt(r.img_id);b[x++]=BigInt(r.img_end_id);for(let e of v)b[x++]=BigInt(e);console.log(`[detect] total seq_len=${y}, token IDs: [${Array.from(b.slice(0,5)).map(Number)}...${Array.from(b.slice(-5)).map(Number)}]`);let ae=await u.embed_tokens.run({token_ids:new s.Tensor(`int64`,b,[1,y])}),C=new Float32Array(ae.embeddings.data),w=new Float32Array(_*l);for(let e=0;e<m;e++)for(let t=0;t<h;t++){let n=e*h+t;for(let r=0;r<o;r++)for(let i=0;i<o;i++){let a=e*o+r,s=t*o+i,c=(a*p+s)*3,u=n*l+(r*o+i)*3;w[u+0]=f[c+0],w[u+1]=f[c+1],w[u+2]=f[c+2]}}let oe=(await u.img_projector.run({pixel_patches:new s.Tensor(`float32`,w,[_,l])})).projected.data;for(let e=0;e<_;e++){let t=S*a+e*a,n=e*a;for(let e=0;e<a;e++)C[t+e]=oe[n+e]}let se=C.slice(0,5);console.log(`[detect] embedding[0][0:5]: [${Array.from(se).map(e=>e.toFixed(3)).join(`, `)}]`);let ce=C.slice(S*a,S*a+5);console.log(`[detect] embedding[imgStart][0:5]: [${Array.from(ce).map(e=>e.toFixed(3)).join(`, `)}]`);let le=C.slice((y-1)*a,(y-1)*a+5);console.log(`[detect] embedding[last][0:5]: [${Array.from(le).map(e=>e.toFixed(3)).join(`, `)}]`),console.log(`[detect] running encoder (seq_len=${y})...`);let T=new Float32Array(y),E=S+_+1,ue=new Set([245,246,247,248,r.img_id,r.img_end_id]),D=new Float32Array(y);for(let e=0;e<y;e++){let t=Number(b[e]);D[e]=ue.has(t)&&e<E?0:1}let O=0;for(let e=0;e<y;e++)O+=D[e],T[e]=O-1;let k=r.head_dim/4,A=r.rope_theta,j=new Float32Array(y*k*2);for(let e=0;e<y;e++){let t=T[e];for(let n=0;n<k;n++){let r=t/A**(2*n/(k*2));j[(e*k+n)*2+0]=Math.cos(r),j[(e*k+n)*2+1]=Math.sin(r)}}let M=new Uint8Array(y*y);for(let e=0;e<y;e++)for(let t=0;t<=e;t++)M[e*y+t]=1;for(let e=0;e<E;e++)for(let t=0;t<E;t++)M[e*y+t]=1;let N=r.vocab_size,P=r.coord_out_dim/2,F=r.n_layers,I=r.n_heads,L=r.head_dim,de=new Float32Array(F*2*1*I*0*L),R=new Float32Array(y*2);R.fill(NaN);let z=te(m,h);for(let e=0;e<_;e++){let t=(S+e)*2;R[t+0]=z[e*2+0],R[t+1]=z[e*2+1]}console.log(`[detect] prefill (seq_len=${y})...`);let B=await u.unified.run({token_embeddings:new s.Tensor(`float32`,C,[1,y,a]),freqs_cis:new s.Tensor(`float32`,j,[1,y,k,2]),pos_hw:new s.Tensor(`float32`,R,[1,y,2]),attention_mask:new s.Tensor(`bool`,M,[1,y,y]),past_kv:new s.Tensor(`float32`,de,[F,2,1,I,0,L]),past_len:new s.Tensor(`int64`,new BigInt64Array([0n]),[])}),V=B.logits.data,H=B.new_kv,U=y,W=(y-1)*N,G=V[W+r.presence_token_id],K=V[W+r.absence_token_id];console.log(`[detect] prefill done: presence=${G.toFixed(2)}, absence=${K.toFixed(2)}`);let q=[];if(G<=K&&G<0){console.log(`[detect] object "${t}" not found`),d({type:`result`,detections:q,inferenceMs:performance.now()-n});return}let fe=B.hidden_states.data,J=new Float32Array(fe.subarray((y-1)*a,y*a)),Y=V,X=T[y-1]+1,Z=null,Q=null,pe=new Set([r.eos_id,r.end_of_query_token_id]);for(let e=0;e<510;e++){let i=Y.length,o=g(Y,i-N,N);if(pe.has(o)){console.log(`[detect] stop token ${o} (${ne(o)}) at step ${e}`);break}if(o===r.absence_token_id){console.log(`[detect] <absence> at step ${e}, stopping`);break}if(o===r.coord_token_id){let t=await u.coord_decoder.run({hidden:new s.Tensor(`float32`,J,[1,a])}),n=new Float32Array(t.logits.data),r=.01,i=0,o=0,c=0,l=0;for(let e=0;e<100&&(i=g(n,0,P),o=g(n,P,P),c=i/(P-1),l=o/(P-1),q.some(e=>{let t=(e.box.x1+e.box.x2)/2,n=(e.box.y1+e.box.y2)/2;return Math.abs(t-c)<r&&Math.abs(n-l)<r}));e++)n[i]=-1/0,n[P+o]=-1/0;Z=[c,l],console.log(`[detect] step ${e}: <coord> → (${c.toFixed(3)}, ${l.toFixed(3)})`)}else if(o===r.size_token_id){let t=(await u.size_decoder.run({hidden:new s.Tensor(`float32`,J,[1,a])})).logits.data,n=g(t,0,P),r=g(t,P,P),i=Math.log2(1/P),o=2**(n/(P-1)*-i+i),c=2**(r/(P-1)*-i+i);Q=[o,c],console.log(`[detect] step ${e}: <size> → (h=${o.toFixed(3)}, w=${c.toFixed(3)})`)}else if(o===r.seg_token_id){if(Z&&Q){let[r,i]=Z,[a,o]=Q;if(q.push({label:t,score:1/(1+Math.exp(-(G-K))),box:{x1:Math.max(0,r-o/2),y1:Math.max(0,i-a/2),x2:Math.min(1,r+o/2),y2:Math.min(1,i+a/2)}}),console.log(`[detect] step ${e}: <seg> → object #${q.length} xy=(${r.toFixed(2)},${i.toFixed(2)}) hw=(${a.toFixed(2)},${o.toFixed(2)})`),d({type:`result`,detections:[...q],inferenceMs:performance.now()-n}),q.length>=100){console.log(`[detect] reached max 100 objects`);break}Z=null,Q=null}}else console.log(`[detect] step ${e}: ${ne(o)} (${o})`);let c;if(o===r.coord_token_id&&Z){let e=await u.coord_encoder.run({coords:new s.Tensor(`float32`,new Float32Array(Z),[1,2])});c=new Float32Array(e.encoded.data)}else if(o===r.size_token_id&&Q){let e=await u.size_encoder.run({sizes:new s.Tensor(`float32`,new Float32Array(Q),[1,2])});c=new Float32Array(e.encoded.data)}else{let e=await u.embed_tokens.run({token_ids:new s.Tensor(`int64`,new BigInt64Array([BigInt(o)]),[1,1])});c=new Float32Array(e.embeddings.data)}let l=new Float32Array(k*2);for(let e=0;e<k;e++){let t=X/A**(2*e/(k*2));l[e*2+0]=Math.cos(t),l[e*2+1]=Math.sin(t)}let f=new Uint8Array(U+1);f.fill(1);let p=new Float32Array([NaN,NaN]),m=await u.unified.run({token_embeddings:new s.Tensor(`float32`,c,[1,1,a]),freqs_cis:new s.Tensor(`float32`,l,[1,1,k,2]),pos_hw:new s.Tensor(`float32`,p,[1,1,2]),attention_mask:new s.Tensor(`bool`,f,[1,1,U+1]),past_kv:H,past_len:new s.Tensor(`int64`,new BigInt64Array([BigInt(U)]),[])});J=new Float32Array(m.hidden_states.data),Y=m.logits.data,H=m.new_kv,U+=1,X+=1}let me=q.length,$=i(q,.6),he=performance.now()-n;console.log(`[detect] done in ${he.toFixed(0)}ms, ${$.length} detections (${me} raw, ${me-$.length} merged by bbox-IoU NMS)`),d({type:`result`,detections:$,inferenceMs:he})}catch(e){console.error(`[detect] error:`,e),d({type:`error`,message:e?.message??`Inference failed`})}finally{l=!1}}function g(e,t,n){let r=0,i=-1/0;for(let a=0;a<n;a++)e[t+a]>i&&(i=e[t+a],r=a);return r}function ne(e){return{[r.coord_token_id]:`<coord>`,[r.size_token_id]:`<size>`,[r.seg_token_id]:`<seg>`,[r.eos_id]:`<eos>`,[r.presence_token_id]:`<presence>`,[r.absence_token_id]:`<absence>`,[r.end_of_query_token_id]:`<end_of_query>`}[e]??`token_${e}`}self.onmessage=async e=>{switch(e.data.type){case`load`:await m();break;case`detect`:await h(e.data.image,e.data.query);break}};
assets/ort-wasm-simd-threaded.asyncify-BrebZMa_.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:109c563dbbfebcebae5006d9978f85abb1d8292622e561bdc41b7a019f8b0096
3
+ size 22819905
assets/ort-wasm-simd-threaded.jsep-C887KxcQ.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2e0a3d0e3f6b7c13ecfaba38c13691fd19c9ed470e72f9d7d8416ca59ab6dbcd
3
+ size 25014754
assets/ort.bundle.min-BZrO1_VY.js ADDED
The diff for this file is too large to render. See raw diff
 
assets/transformers.web-DaZ4EEMB.js ADDED
The diff for this file is too large to render. See raw diff
 
coi-serviceworker.js ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! coi-serviceworker v0.1.7 - Guido Zuidhof and contributors, licensed under MIT */
2
+ let coepCredentialless = false;
3
+ if (typeof window === 'undefined') {
4
+ self.addEventListener("install", () => self.skipWaiting());
5
+ self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim()));
6
+
7
+ self.addEventListener("message", (ev) => {
8
+ if (!ev.data) {
9
+ return;
10
+ } else if (ev.data.type === "deregister") {
11
+ self.registration
12
+ .unregister()
13
+ .then(() => {
14
+ return self.clients.matchAll();
15
+ })
16
+ .then(clients => {
17
+ clients.forEach((client) => client.navigate(client.url));
18
+ });
19
+ } else if (ev.data.type === "coepCredentialless") {
20
+ coepCredentialless = ev.data.value;
21
+ }
22
+ });
23
+
24
+ self.addEventListener("fetch", function (event) {
25
+ const r = event.request;
26
+ if (r.cache === "only-if-cached" && r.mode !== "same-origin") {
27
+ return;
28
+ }
29
+
30
+ const request = (coepCredentialless && r.mode === "no-cors")
31
+ ? new Request(r, {
32
+ credentials: "omit",
33
+ })
34
+ : r;
35
+ event.respondWith(
36
+ fetch(request)
37
+ .then((response) => {
38
+ if (response.status === 0) {
39
+ return response;
40
+ }
41
+
42
+ const newHeaders = new Headers(response.headers);
43
+ newHeaders.set("Cross-Origin-Embedder-Policy",
44
+ coepCredentialless ? "credentialless" : "require-corp"
45
+ );
46
+ if (!coepCredentialless) {
47
+ newHeaders.set("Cross-Origin-Resource-Policy", "cross-origin");
48
+ }
49
+ newHeaders.set("Cross-Origin-Opener-Policy", "same-origin");
50
+
51
+ return new Response(response.body, {
52
+ status: response.status,
53
+ statusText: response.statusText,
54
+ headers: newHeaders,
55
+ });
56
+ })
57
+ .catch((e) => console.error(e))
58
+ );
59
+ });
60
+
61
+ } else {
62
+ (() => {
63
+ const reloadedBySelf = window.sessionStorage.getItem("coiReloadedBySelf");
64
+ window.sessionStorage.removeItem("coiReloadedBySelf");
65
+ const coepDegrading = (reloadedBySelf == "coepdegrade");
66
+
67
+ // You can customize the behavior of this script through a global `coi` variable.
68
+ const coi = {
69
+ shouldRegister: () => !reloadedBySelf,
70
+ shouldDeregister: () => false,
71
+ coepCredentialless: () => true,
72
+ coepDegrade: () => true,
73
+ doReload: () => window.location.reload(),
74
+ quiet: false,
75
+ ...window.coi
76
+ };
77
+
78
+ const n = navigator;
79
+ const controlling = n.serviceWorker && n.serviceWorker.controller;
80
+
81
+ // Record the failure if the page is served by serviceWorker.
82
+ if (controlling && !window.crossOriginIsolated) {
83
+ window.sessionStorage.setItem("coiCoepHasFailed", "true");
84
+ }
85
+ const coepHasFailed = window.sessionStorage.getItem("coiCoepHasFailed");
86
+
87
+ if (controlling) {
88
+ // Reload only on the first failure.
89
+ const reloadToDegrade = coi.coepDegrade() && !(
90
+ coepDegrading || window.crossOriginIsolated
91
+ );
92
+ n.serviceWorker.controller.postMessage({
93
+ type: "coepCredentialless",
94
+ value: (reloadToDegrade || coepHasFailed && coi.coepDegrade())
95
+ ? false
96
+ : coi.coepCredentialless(),
97
+ });
98
+ if (reloadToDegrade) {
99
+ !coi.quiet && console.log("Reloading page to degrade COEP.");
100
+ window.sessionStorage.setItem("coiReloadedBySelf", "coepdegrade");
101
+ coi.doReload("coepdegrade");
102
+ }
103
+
104
+ if (coi.shouldDeregister()) {
105
+ n.serviceWorker.controller.postMessage({ type: "deregister" });
106
+ }
107
+ }
108
+
109
+ // If we're already coi: do nothing. Perhaps it's due to this script doing its job, or COOP/COEP are
110
+ // already set from the origin server. Also if the browser has no notion of crossOriginIsolated, just give up here.
111
+ if (window.crossOriginIsolated !== false || !coi.shouldRegister()) return;
112
+
113
+ if (!window.isSecureContext) {
114
+ !coi.quiet && console.log("COOP/COEP Service Worker not registered, a secure context is required.");
115
+ return;
116
+ }
117
+
118
+ // In some environments (e.g. Firefox private mode) this won't be available
119
+ if (!n.serviceWorker) {
120
+ !coi.quiet && console.error("COOP/COEP Service Worker not registered, perhaps due to private mode.");
121
+ return;
122
+ }
123
+
124
+ n.serviceWorker.register(window.document.currentScript.src).then(
125
+ (registration) => {
126
+ !coi.quiet && console.log("COOP/COEP Service Worker registered", registration.scope);
127
+
128
+ registration.addEventListener("updatefound", () => {
129
+ !coi.quiet && console.log("Reloading page to make use of updated COOP/COEP Service Worker.");
130
+ window.sessionStorage.setItem("coiReloadedBySelf", "updatefound");
131
+ coi.doReload();
132
+ });
133
+
134
+ // If the registration is active, but it's not controlling the page
135
+ if (registration.active && !n.serviceWorker.controller) {
136
+ !coi.quiet && console.log("Reloading page to make use of COOP/COEP Service Worker.");
137
+ window.sessionStorage.setItem("coiReloadedBySelf", "notcontrolling");
138
+ coi.doReload();
139
+ }
140
+ },
141
+ (err) => {
142
+ !coi.quiet && console.error("COOP/COEP Service Worker failed to register:", err);
143
+ }
144
+ );
145
+ })();
146
+ }
examples/perception.jpg ADDED

Git LFS Details

  • SHA256: a25a745799ac3cf2967620af6936fa35cb3534b73ff93e42acd37adb67a03c34
  • Pointer size: 132 Bytes
  • Size of remote file: 1.48 MB
examples/sprinters.png ADDED

Git LFS Details

  • SHA256: 4c63d13f51ae3abe467eeeebd27aa31ab0356c773997028415bbe3531182931b
  • Pointer size: 132 Bytes
  • Size of remote file: 3.89 MB
favicon.svg ADDED
icons.svg ADDED
index.html CHANGED
@@ -1,19 +1,17 @@
1
  <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
  </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Falcon Perception In-Browser Vision AI</title>
8
+ <!-- Enables COOP/COEP headers on hosts that don't set them (HF Spaces
9
+ static SDK). Required for SharedArrayBuffer + multithreaded WASM. -->
10
+ <script src="/coi-serviceworker.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-C4_QYrm1.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-Irf6GGXu.css">
13
+ </head>
14
+ <body class="bg-gray-950 text-gray-100 antialiased">
15
+ <div id="root"></div>
16
+ </body>
 
 
17
  </html>