@dxo/vision 0.0.0 → 0.0.11

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 CHANGED
@@ -1,3 +1,18 @@
1
1
  # @dxo/vision
2
2
 
3
- Placeholder package (0.0.0). Reserved for the DXO project.
3
+ **Developer preview API unstable.** Not a closed vision-classify gate.
4
+
5
+ Composable vision surface: `Image` / `ImageBatch`, `ResNet` (backbone / features), `LinearHead` / `Classifier` / `compose` (logits), `defineLabelSpace` / `decodeClassification` (labels).
6
+
7
+ ```bash
8
+ pnpm add @dxo/vision
9
+ ```
10
+
11
+ ```ts
12
+ import { ResNet, LinearHead, compose } from '@dxo/vision';
13
+
14
+ const backbone = new ResNet({ depth: 18 });
15
+ const model = compose(backbone, new LinearHead({ output: 10 }));
16
+ ```
17
+
18
+ Pretrained weight assets ship from the separate `@dxo/resnet` package (external repo). This package only defines networks and task adapters.
@@ -0,0 +1,7 @@
1
+ /** Structured vision error with stable `code` for callers / verify. */
2
+ export declare class VisionError extends Error {
3
+ readonly code: string;
4
+ constructor(code: string, message: string);
5
+ }
6
+ export declare function unsupported(op: string, detail?: string): never;
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,qBAAa,WAAY,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAG9D"}
package/dist/errors.js ADDED
@@ -0,0 +1,14 @@
1
+ /** Structured vision error with stable `code` for callers / verify. */
2
+ export class VisionError extends Error {
3
+ code;
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = 'VisionError';
7
+ this.code = code;
8
+ }
9
+ }
10
+ export function unsupported(op, detail) {
11
+ const suffix = detail ? `: ${detail}` : '';
12
+ throw new VisionError('UNSUPPORTED', `@dxo/vision ${op} is not implemented yet${suffix}`);
13
+ }
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,MAAM,OAAO,WAAY,SAAQ,KAAK;IACzB,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ;AAED,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,MAAe;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,MAAM,IAAI,WAAW,CAAC,aAAa,EAAE,eAAe,EAAE,0BAA0B,MAAM,EAAE,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Tensor } from '@dxo/core';
2
+ import { Module } from '@dxo/nn';
3
+ import type { ResNet } from './resnet.js';
4
+ import type { TensorPort } from './types.js';
5
+ export type LinearHeadOptions = {
6
+ /** Feature dim; inferred from `input` port or by `compose` when omitted. */
7
+ input?: number | TensorPort;
8
+ /** Logits dim — class count for the head only, not ResNet. */
9
+ output: number;
10
+ bias?: boolean;
11
+ };
12
+ /** Feature → logits only; no label names / language. */
13
+ export declare class LinearHead extends Module {
14
+ #private;
15
+ readonly outFeatures: number;
16
+ constructor(options: LinearHeadOptions);
17
+ get inFeatures(): number | undefined;
18
+ /** Wire feature size (used by `compose` when ctor omitted `input`). */
19
+ bindInput(inFeatures: number): void;
20
+ forward(features: Tensor): Tensor;
21
+ parameters(): Tensor[];
22
+ }
23
+ export type ClassifierOptions = {
24
+ backbone: ResNet;
25
+ head: LinearHead;
26
+ };
27
+ /** Backbone + head; `forward` returns logits Tensor. */
28
+ export declare class Classifier extends Module {
29
+ readonly backbone: ResNet;
30
+ readonly head: LinearHead;
31
+ constructor(options: ClassifierOptions);
32
+ forward(image: Tensor): Tensor;
33
+ }
34
+ /** Compose ResNet + LinearHead into a Classifier. */
35
+ export declare function compose(backbone: ResNet, head: LinearHead): Classifier;
36
+ //# sourceMappingURL=heads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heads.d.ts","sourceRoot":"","sources":["../src/heads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAU,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC5B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC5B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AASF,wDAAwD;AACxD,qBAAa,UAAW,SAAQ,MAAM;;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAIjB,OAAO,EAAE,iBAAiB;IAQtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,uEAAuE;IACvE,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASnC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAWxB,UAAU,IAAI,MAAM,EAAE;CAGlC;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,wDAAwD;AACxD,qBAAa,UAAW,SAAQ,MAAM;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;gBAEd,OAAO,EAAE,iBAAiB;IAMtC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAIjC;AAED,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAWtE"}
package/dist/heads.js ADDED
@@ -0,0 +1,77 @@
1
+ import { Linear, Module } from '@dxo/nn';
2
+ import { VisionError } from './errors.js';
3
+ function resolveInFeatures(input) {
4
+ if (typeof input === 'number')
5
+ return input;
6
+ const last = input.shape[input.shape.length - 1];
7
+ if (typeof last === 'number')
8
+ return last;
9
+ throw new VisionError('INVALID_HEAD_INPUT', 'LinearHead input port must end with a fixed feature dimension');
10
+ }
11
+ /** Feature → logits only; no label names / language. */
12
+ export class LinearHead extends Module {
13
+ outFeatures;
14
+ #inFeatures;
15
+ #linear;
16
+ constructor(options) {
17
+ super();
18
+ this.outFeatures = options.output;
19
+ if (options.input !== undefined) {
20
+ this.bindInput(resolveInFeatures(options.input));
21
+ }
22
+ }
23
+ get inFeatures() {
24
+ return this.#inFeatures;
25
+ }
26
+ /** Wire feature size (used by `compose` when ctor omitted `input`). */
27
+ bindInput(inFeatures) {
28
+ if (this.#inFeatures !== undefined && this.#inFeatures !== inFeatures) {
29
+ throw new VisionError('HEAD_FEATURE_MISMATCH', `LinearHead already bound to inFeatures=${this.#inFeatures}, got ${inFeatures}`);
30
+ }
31
+ if (this.#linear && this.#inFeatures === inFeatures)
32
+ return;
33
+ this.#inFeatures = inFeatures;
34
+ this.#linear = new Linear(inFeatures, this.outFeatures);
35
+ }
36
+ forward(features) {
37
+ if (!this.#linear) {
38
+ const last = features.shape[features.shape.length - 1];
39
+ if (typeof last !== 'number') {
40
+ throw new VisionError('INVALID_HEAD_INPUT', 'cannot infer LinearHead input from features');
41
+ }
42
+ this.bindInput(last);
43
+ }
44
+ return this.#linear.forward(features);
45
+ }
46
+ parameters() {
47
+ return this.#linear ? this.#linear.parameters() : [];
48
+ }
49
+ }
50
+ /** Backbone + head; `forward` returns logits Tensor. */
51
+ export class Classifier extends Module {
52
+ backbone;
53
+ head;
54
+ constructor(options) {
55
+ super();
56
+ this.backbone = options.backbone;
57
+ this.head = options.head;
58
+ }
59
+ forward(image) {
60
+ const features = this.backbone.forward(image);
61
+ return this.head.forward(features);
62
+ }
63
+ }
64
+ /** Compose ResNet + LinearHead into a Classifier. */
65
+ export function compose(backbone, head) {
66
+ const expected = backbone.features();
67
+ const last = expected.shape[expected.shape.length - 1];
68
+ if (typeof last !== 'number') {
69
+ throw new VisionError('INVALID_BACKBONE', 'backbone features port must end with a fixed dim');
70
+ }
71
+ if (head.inFeatures !== undefined && head.inFeatures !== last) {
72
+ throw new VisionError('HEAD_FEATURE_MISMATCH', `LinearHead inFeatures=${head.inFeatures} does not match backbone features=${last}`);
73
+ }
74
+ head.bindInput(last);
75
+ return new Classifier({ backbone, head });
76
+ }
77
+ //# sourceMappingURL=heads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heads.js","sourceRoot":"","sources":["../src/heads.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C,SAAS,iBAAiB,CAAC,KAA0B;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,WAAW,CAAC,oBAAoB,EAAE,+DAA+D,CAAC,CAAC;AACjH,CAAC;AAED,wDAAwD;AACxD,MAAM,OAAO,UAAW,SAAQ,MAAM;IACzB,WAAW,CAAS;IAC7B,WAAW,CAAqB;IAChC,OAAO,CAAqB;IAE5B,YAAY,OAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,CAAC;IACL,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,uEAAuE;IACvE,SAAS,CAAC,UAAkB;QACxB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YACpE,MAAM,IAAI,WAAW,CAAC,uBAAuB,EAAE,0CAA0C,IAAI,CAAC,WAAW,SAAS,UAAU,EAAE,CAAC,CAAC;QACpI,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU;YAAE,OAAO;QAC5D,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,QAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,WAAW,CAAC,oBAAoB,EAAE,6CAA6C,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC,OAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEQ,UAAU;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;CACJ;AAOD,wDAAwD;AACxD,MAAM,OAAO,UAAW,SAAQ,MAAM;IACzB,QAAQ,CAAS;IACjB,IAAI,CAAa;IAE1B,YAAY,OAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,KAAa;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;CACJ;AAED,qDAAqD;AACrD,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,IAAgB;IACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,kDAAkD,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,IAAI,WAAW,CAAC,uBAAuB,EAAE,yBAAyB,IAAI,CAAC,UAAU,qCAAqC,IAAI,EAAE,CAAC,CAAC;IACxI,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrB,OAAO,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @dxo/vision — developer preview (API unstable).
3
+ * Image types + ResNet backbone / heads / label decode.
4
+ * Not a closed vision-classify gate. Weights live in external `@dxo/resnet`.
5
+ */
6
+ import type { ImageBuffer, Tensor } from '@dxo/core';
7
+ export { VisionError } from './errors.js';
8
+ export { Classifier, type ClassifierOptions, compose, LinearHead, type LinearHeadOptions, } from './heads.js';
9
+ export { type ClassificationDecode, type ClassificationTopK, type DecodeClassificationOptions, decodeClassification, defineLabelSpace, type LabelSpace, type LabelSpaceOptions, } from './labels.js';
10
+ export { defineResNet, ResNet } from './resnet.js';
11
+ export type { Device, ResNetDepth, ResNetOptions, ResNetSignature, TensorPort, WeightSource, } from './types.js';
12
+ export { resnetFeatureChannels } from './types.js';
13
+ export type ColorSpace = 'rgb' | 'rgba' | 'gray' | 'bgr';
14
+ export type ImageLayout = 'HWC' | 'CHW' | 'nchw' | 'nhwc';
15
+ export type ImageDtype = 'u8' | 'u16' | 'f32';
16
+ export type ImageTensorSpec = {
17
+ layout: 'nchw' | 'nhwc';
18
+ dtype: 'f32';
19
+ channels: 1 | 3 | 4;
20
+ };
21
+ export type ImageToTensorOptions = {
22
+ device?: 'cpu' | 'cuda' | 'metal';
23
+ copy?: boolean;
24
+ /** Target model layout; vision may transpose/cast before buffer view. */
25
+ layout?: 'nchw' | 'nhwc';
26
+ };
27
+ /**
28
+ * User-facing image with vision metadata. Does not own a parallel native engine.
29
+ * Pixel carrier is `@dxo/core` ImageBuffer (colorSpace/alphaMode on the buffer).
30
+ */
31
+ export interface Image {
32
+ readonly width: number;
33
+ readonly height: number;
34
+ readonly channels: number;
35
+ readonly colorSpace: ColorSpace;
36
+ readonly layout: ImageLayout;
37
+ readonly dtype: ImageDtype;
38
+ readonly alpha: boolean;
39
+ readonly source?: {
40
+ kind: string;
41
+ uri?: string;
42
+ };
43
+ /** Underlying typed host buffer when available (no domain semantics). */
44
+ buffer(): ImageBuffer | undefined;
45
+ toTensor(options?: ImageToTensorOptions): Tensor;
46
+ dispose(): void;
47
+ ready(): Promise<void>;
48
+ }
49
+ export interface ImageBatch {
50
+ readonly size: number;
51
+ readonly images: readonly Image[];
52
+ toTensor(options?: ImageToTensorOptions): Tensor;
53
+ dispose(): void;
54
+ }
55
+ /** @deprecated Prefer {@link ImageTensorSpec} + {@link Image}. */
56
+ export type LegacyImageTensorSpec = ImageTensorSpec;
57
+ export declare function visionVersion(): string;
58
+ export declare function unsupportedVisionApi(name: string): never;
59
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACH,UAAU,EACV,KAAK,iBAAiB,EACtB,OAAO,EACP,UAAU,EACV,KAAK,iBAAiB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAChC,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACR,MAAM,EACN,WAAW,EACX,aAAa,EACb,eAAe,EACf,UAAU,EACV,YAAY,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC1D,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,KAAK;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAEjD,yEAAyE;IACzE,MAAM,IAAI,WAAW,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,kEAAkE;AAClE,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAEpD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAExD"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @dxo/vision — developer preview (API unstable).
3
+ * Image types + ResNet backbone / heads / label decode.
4
+ * Not a closed vision-classify gate. Weights live in external `@dxo/resnet`.
5
+ */
6
+ export { VisionError } from './errors.js';
7
+ export { Classifier, compose, LinearHead, } from './heads.js';
8
+ export { decodeClassification, defineLabelSpace, } from './labels.js';
9
+ export { defineResNet, ResNet } from './resnet.js';
10
+ export { resnetFeatureChannels } from './types.js';
11
+ export function visionVersion() {
12
+ return 'dxo-vision@developer-preview';
13
+ }
14
+ export function unsupportedVisionApi(name) {
15
+ throw new Error(`@dxo/vision ${name} is not wired yet on this developer preview surface`);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACH,UAAU,EAEV,OAAO,EACP,UAAU,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAIH,oBAAoB,EACpB,gBAAgB,GAGnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAkDnD,MAAM,UAAU,aAAa;IACzB,OAAO,8BAA8B,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC7C,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,qDAAqD,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Tensor } from '@dxo/core';
2
+ export type LabelSpace = {
3
+ id: string;
4
+ labels: readonly string[];
5
+ size: number;
6
+ };
7
+ export type LabelSpaceOptions = {
8
+ id: string;
9
+ labels: readonly string[];
10
+ };
11
+ export declare function defineLabelSpace(options: LabelSpaceOptions): LabelSpace;
12
+ export type ClassificationTopK = {
13
+ index: number;
14
+ score: number;
15
+ label: string;
16
+ };
17
+ export type ClassificationDecode = {
18
+ labelSpaceId: string;
19
+ topK: ClassificationTopK[];
20
+ };
21
+ export type DecodeClassificationOptions = {
22
+ labels: LabelSpace;
23
+ topK?: number;
24
+ };
25
+ /**
26
+ * Decode logits with an external label space.
27
+ * Same logits may be decoded with different LabelSpaces (e.g. EN vs ZH).
28
+ */
29
+ export declare function decodeClassification(logits: Tensor, options: DecodeClassificationOptions): Promise<ClassificationDecode>;
30
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,MAAM,UAAU,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAYvE;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,kBAAkB,EAAE,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACtC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B9H"}
package/dist/labels.js ADDED
@@ -0,0 +1,47 @@
1
+ import { VisionError } from './errors.js';
2
+ export function defineLabelSpace(options) {
3
+ if (!options.id) {
4
+ throw new VisionError('INVALID_LABEL_SPACE', 'defineLabelSpace requires a non-empty id');
5
+ }
6
+ if (!Array.isArray(options.labels) || options.labels.length === 0) {
7
+ throw new VisionError('INVALID_LABEL_SPACE', 'defineLabelSpace requires a non-empty labels array');
8
+ }
9
+ return {
10
+ id: options.id,
11
+ labels: Object.freeze([...options.labels]),
12
+ size: options.labels.length,
13
+ };
14
+ }
15
+ /**
16
+ * Decode logits with an external label space.
17
+ * Same logits may be decoded with different LabelSpaces (e.g. EN vs ZH).
18
+ */
19
+ export async function decodeClassification(logits, options) {
20
+ const { labels } = options;
21
+ const k = Math.max(1, Math.min(options.topK ?? 5, labels.size));
22
+ const shape = logits.shape;
23
+ if (shape.length < 1) {
24
+ throw new VisionError('INVALID_LOGITS', 'logits must be at least rank 1');
25
+ }
26
+ const classDim = shape[shape.length - 1];
27
+ if (classDim !== labels.size) {
28
+ throw new VisionError('LABEL_SIZE_MISMATCH', `logits class dim=${classDim} does not match labelSpace size=${labels.size}`);
29
+ }
30
+ const data = await logits.toArray();
31
+ // Use last row for batched [N, C]; full vector for [C].
32
+ const offset = shape.length === 1 ? 0 : (shape[0] - 1) * classDim;
33
+ const scores = data.slice(offset, offset + classDim);
34
+ const order = scores
35
+ .map((score, index) => ({ score, index }))
36
+ .sort((a, b) => b.score - a.score)
37
+ .slice(0, k);
38
+ return {
39
+ labelSpaceId: labels.id,
40
+ topK: order.map(({ score, index }) => ({
41
+ index,
42
+ score,
43
+ label: labels.labels[index],
44
+ })),
45
+ };
46
+ }
47
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa1C,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACvD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,oDAAoD,CAAC,CAAC;IACvG,CAAC;IACD,OAAO;QACH,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM;KAC9B,CAAC;AACN,CAAC;AAkBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,OAAoC;IAC3F,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAC1C,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,oBAAoB,QAAQ,mCAAmC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,wDAAwD;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjB,OAAO;QACH,YAAY,EAAE,MAAM,CAAC,EAAE;QACvB,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACnC,KAAK;YACL,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAE;SAC/B,CAAC,CAAC;KACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Tensor } from '@dxo/core';
2
+ import { Module } from '@dxo/nn';
3
+ import { type ResNetDepth, type ResNetOptions, type ResNetSignature, type TensorPort, type WeightSource } from './types.js';
4
+ /**
5
+ * ResNet backbone only — `forward` yields feature Tensor, never labels.
6
+ * Numerical full forward waits on spatial pool / stage wiring; preview throws `UNSUPPORTED`.
7
+ */
8
+ export declare class ResNet extends Module {
9
+ #private;
10
+ readonly depth: ResNetDepth;
11
+ readonly inChannels: number;
12
+ readonly zeroInitResidual: boolean;
13
+ readonly norm: 'batchnorm';
14
+ readonly device: ResNetOptions['device'];
15
+ readonly signature: ResNetSignature;
16
+ constructor(options?: ResNetOptions);
17
+ features(): TensorPort;
18
+ freeze(): void;
19
+ unfreeze(): void;
20
+ get trainable(): boolean;
21
+ forward(_image: Tensor): Tensor;
22
+ load(_weights: WeightSource, _options?: {
23
+ scope?: 'all' | 'backbone';
24
+ }): Promise<void>;
25
+ ready(): Promise<void>;
26
+ }
27
+ export declare function defineResNet(options?: ResNetOptions): ResNet;
28
+ //# sourceMappingURL=resnet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resnet.d.ts","sourceRoot":"","sources":["../src/resnet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,YAAY,EACpB,MAAM,YAAY,CAAC;AAsBpB;;;GAGG;AACH,qBAAa,MAAO,SAAQ,MAAM;;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;gBAIxB,OAAO,GAAE,aAAkB;IAevC,QAAQ,IAAI,UAAU;IAItB,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzB,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,KAAK,GAAG,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAItF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAE5D"}
package/dist/resnet.js ADDED
@@ -0,0 +1,77 @@
1
+ import { Module } from '@dxo/nn';
2
+ import { unsupported } from './errors.js';
3
+ import { resnetFeatureChannels, } from './types.js';
4
+ function buildSignature(depth, inChannels) {
5
+ const features = resnetFeatureChannels(depth);
6
+ return {
7
+ input: {
8
+ image: {
9
+ name: 'image',
10
+ dtype: 'f32',
11
+ shape: ['batch', inChannels, 'height', 'width'],
12
+ },
13
+ },
14
+ output: {
15
+ features: {
16
+ name: 'features',
17
+ dtype: 'f32',
18
+ shape: ['batch', features],
19
+ },
20
+ },
21
+ };
22
+ }
23
+ /**
24
+ * ResNet backbone only — `forward` yields feature Tensor, never labels.
25
+ * Numerical full forward waits on spatial pool / stage wiring; preview throws `UNSUPPORTED`.
26
+ */
27
+ export class ResNet extends Module {
28
+ depth;
29
+ inChannels;
30
+ zeroInitResidual;
31
+ norm;
32
+ device;
33
+ signature;
34
+ #trainable;
35
+ #ready = true;
36
+ constructor(options = {}) {
37
+ super();
38
+ this.depth = options.depth ?? 18;
39
+ this.inChannels = options.inChannels ?? 3;
40
+ this.zeroInitResidual = options.zeroInitResidual ?? false;
41
+ this.norm = options.norm ?? 'batchnorm';
42
+ this.device = options.device ?? 'cpu';
43
+ this.#trainable = options.trainable ?? true;
44
+ this.signature = buildSignature(this.depth, this.inChannels);
45
+ if (options.weights && options.weights !== 'none') {
46
+ // Weight materialization is hub/serialize work; keep ctor sync and constructible.
47
+ this.#ready = false;
48
+ }
49
+ }
50
+ features() {
51
+ return this.signature.output.features;
52
+ }
53
+ freeze() {
54
+ this.#trainable = false;
55
+ }
56
+ unfreeze() {
57
+ this.#trainable = true;
58
+ }
59
+ get trainable() {
60
+ return this.#trainable;
61
+ }
62
+ forward(_image) {
63
+ unsupported('ResNet.forward', `depth=${this.depth}; full stem/stages/GAP not wired on this preview surface`);
64
+ }
65
+ async load(_weights, _options) {
66
+ unsupported('ResNet.load', 'weight materialization lands with hub / serialize');
67
+ }
68
+ async ready() {
69
+ if (!this.#ready) {
70
+ unsupported('ResNet.ready', 'deferred weight load not wired');
71
+ }
72
+ }
73
+ }
74
+ export function defineResNet(options) {
75
+ return new ResNet(options);
76
+ }
77
+ //# sourceMappingURL=resnet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resnet.js","sourceRoot":"","sources":["../src/resnet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAIH,qBAAqB,GAGxB,MAAM,YAAY,CAAC;AAEpB,SAAS,cAAc,CAAC,KAAkB,EAAE,UAAkB;IAC1D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO;QACH,KAAK,EAAE;YACH,KAAK,EAAE;gBACH,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC;aAClD;SACJ;QACD,MAAM,EAAE;YACJ,QAAQ,EAAE;gBACN,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;aAC7B;SACJ;KACJ,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,MAAO,SAAQ,MAAM;IACrB,KAAK,CAAc;IACnB,UAAU,CAAS;IACnB,gBAAgB,CAAU;IAC1B,IAAI,CAAc;IAClB,MAAM,CAA0B;IAChC,SAAS,CAAkB;IACpC,UAAU,CAAU;IACpB,MAAM,GAAG,IAAI,CAAC;IAEd,YAAY,UAAyB,EAAE;QACnC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAChD,kFAAkF;YAClF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACxB,CAAC;IACL,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC1C,CAAC;IAED,MAAM;QACF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,QAAQ;QACJ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,MAAc;QAClB,WAAW,CAAC,gBAAgB,EAAE,SAAS,IAAI,CAAC,KAAK,0DAA0D,CAAC,CAAC;IACjH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,QAAyC;QACxE,WAAW,CAAC,aAAa,EAAE,mDAAmD,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,WAAW,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;QAClE,CAAC;IACL,CAAC;CACJ;AAED,MAAM,UAAU,YAAY,CAAC,OAAuB;IAChD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { Device } from '@dxo/core';
2
+ /** Soft graph port — connectivity only; no labels / language. */
3
+ export type TensorPort = {
4
+ name: string;
5
+ dtype: 'f32';
6
+ /** Symbolic dims; numbers are fixed, strings are dynamic axes. */
7
+ shape: ReadonlyArray<number | string>;
8
+ };
9
+ /** External weight locator (resolved by hub / external `@dxo/resnet` later). */
10
+ export type WeightSource = {
11
+ provider: string;
12
+ repo: string;
13
+ revision?: string;
14
+ path: string;
15
+ } | {
16
+ path: string;
17
+ };
18
+ export type { Device };
19
+ export type ResNetDepth = 18 | 34 | 50 | 101 | 152;
20
+ /**
21
+ * ResNet constructor options.
22
+ * Intentionally has **no** `classes` / `numClasses` / label fields.
23
+ */
24
+ export type ResNetOptions = {
25
+ depth?: ResNetDepth;
26
+ inChannels?: number;
27
+ zeroInitResidual?: boolean;
28
+ norm?: 'batchnorm';
29
+ weights?: WeightSource | 'none';
30
+ device?: Device;
31
+ trainable?: boolean;
32
+ };
33
+ export type ResNetSignature = {
34
+ input: {
35
+ image: TensorPort;
36
+ };
37
+ output: {
38
+ features: TensorPort;
39
+ };
40
+ };
41
+ /** Feature channel count after GAP for classic ResNet depths. */
42
+ export declare function resnetFeatureChannels(depth: ResNetDepth): number;
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,kEAAkE;IAClE,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACzC,CAAC;AAEF,gFAAgF;AAChF,MAAM,MAAM,YAAY,GAClB;IACI,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB,GACD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvB,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,MAAM,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAC7B,MAAM,EAAE;QAAE,QAAQ,EAAE,UAAU,CAAA;KAAE,CAAC;CACpC,CAAC;AAEF,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAchE"}
package/dist/types.js ADDED
@@ -0,0 +1,17 @@
1
+ /** Feature channel count after GAP for classic ResNet depths. */
2
+ export function resnetFeatureChannels(depth) {
3
+ switch (depth) {
4
+ case 18:
5
+ case 34:
6
+ return 512;
7
+ case 50:
8
+ case 101:
9
+ case 152:
10
+ return 2048;
11
+ default: {
12
+ const _exhaustive = depth;
13
+ return _exhaustive;
14
+ }
15
+ }
16
+ }
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA2CA,iEAAiE;AACjE,MAAM,UAAU,qBAAqB,CAAC,KAAkB;IACpD,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;QACR,KAAK,EAAE;YACH,OAAO,GAAG,CAAC;QACf,KAAK,EAAE,CAAC;QACR,KAAK,GAAG,CAAC;QACT,KAAK,GAAG;YACJ,OAAO,IAAI,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC;YACN,MAAM,WAAW,GAAU,KAAK,CAAC;YACjC,OAAO,WAAW,CAAC;QACvB,CAAC;IACL,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,47 @@
1
1
  {
2
- "name": "@dxo/vision",
3
- "version": "0.0.0",
4
- "description": "DXO placeholder — not for production use.",
5
- "license": "MIT",
6
- "private": false,
7
- "files": [
8
- "README.md"
9
- ]
2
+ "name": "@dxo/vision",
3
+ "version": "0.0.11",
4
+ "type": "module",
5
+ "description": "DXO vision models and task adapters (developer preview, API unstable)",
6
+ "license": "Apache-2.0",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json"
21
+ },
22
+ "dependencies": {
23
+ "@dxo/core": "0.0.11",
24
+ "@dxo/nn": "0.0.11"
25
+ },
26
+ "keywords": [
27
+ "dxo",
28
+ "vision",
29
+ "resnet",
30
+ "image",
31
+ "typescript",
32
+ "deep-learning",
33
+ "developer-preview"
34
+ ],
35
+ "homepage": "https://github.com/ai4waifu/dxo-framework#readme",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/ai4waifu/dxo-framework.git",
39
+ "directory": "projects/runtimes/dxo-vision"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/ai4waifu/dxo-framework/issues"
43
+ },
44
+ "publishConfig": {
45
+ "access": "public"
46
+ }
10
47
  }