@dxo/vision 0.0.11 → 0.0.12

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,8 +1,10 @@
1
1
  # @dxo/vision
2
2
 
3
- **Developer preview — API unstable.** Not a closed vision-classify gate.
3
+ **Developer preview — API unstable.** Not a closed `vision-classify` gate.
4
4
 
5
- Composable vision surface: `Image` / `ImageBatch`, `ResNet` (backbone / features), `LinearHead` / `Classifier` / `compose` (logits), `defineLabelSpace` / `decodeClassification` (labels).
5
+ Composable vision surface: `ResNet` (backbone / features), `LinearHead` / `Classifier` / `compose` (logits), `defineLabelSpace` / `decodeClassification` (labels).
6
+
7
+ ResNet-18 uses **DXO-native** state keys (`stem.*`, `stage{n}.block{i}.*`). Preview `forward` supports `32×32` NCHW → `[N,512]` features.
6
8
 
7
9
  ```bash
8
10
  pnpm add @dxo/vision
@@ -15,4 +17,4 @@ const backbone = new ResNet({ depth: 18 });
15
17
  const model = compose(backbone, new LinearHead({ output: 10 }));
16
18
  ```
17
19
 
18
- Pretrained weight assets ship from the separate `@dxo/resnet` package (external repo). This package only defines networks and task adapters.
20
+ Pretrained weight assets / torch→DXO conversion live in the separate `@dxo/resnet` package.
@@ -0,0 +1,27 @@
1
+ import type { Tensor } from '@dxo/core';
2
+ import type { TensorStateSlice } from '@dxo/nn';
3
+ import { BatchNorm2d, Conv2d, Module, Relu } from '@dxo/nn';
4
+ /**
5
+ * DXO-native BasicBlock (not a torchvision key mirror).
6
+ * Keys: `{prefix}.conv1|bn1|conv2|bn2[.weight|.bias]` and optional `{prefix}.down.conv|bn`.
7
+ */
8
+ export declare class BasicBlock extends Module {
9
+ readonly conv1: Conv2d;
10
+ readonly bn1: BatchNorm2d;
11
+ readonly conv2: Conv2d;
12
+ readonly bn2: BatchNorm2d;
13
+ readonly relu: Relu;
14
+ readonly downConv: Conv2d | null;
15
+ readonly downBn: BatchNorm2d | null;
16
+ readonly prefix: string;
17
+ constructor(prefix: string, inChannels: number, outChannels: number, opts?: {
18
+ stride?: number;
19
+ requiresGrad?: boolean;
20
+ });
21
+ forward(x: Tensor): Tensor;
22
+ state(): Promise<Record<string, TensorStateSlice>>;
23
+ loadState(saved: Record<string, TensorStateSlice>, opts?: {
24
+ requiresGrad?: boolean;
25
+ }): void;
26
+ }
27
+ //# sourceMappingURL=basic-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-block.d.ts","sourceRoot":"","sources":["../src/basic-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5D;;;GAGG;AACH,qBAAa,UAAW,SAAQ,MAAM;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO;IAmB3H,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAUpB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IA2BxD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;CAiBlG"}
@@ -0,0 +1,88 @@
1
+ import { BatchNorm2d, Conv2d, Module, Relu } from '@dxo/nn';
2
+ /**
3
+ * DXO-native BasicBlock (not a torchvision key mirror).
4
+ * Keys: `{prefix}.conv1|bn1|conv2|bn2[.weight|.bias]` and optional `{prefix}.down.conv|bn`.
5
+ */
6
+ export class BasicBlock extends Module {
7
+ conv1;
8
+ bn1;
9
+ conv2;
10
+ bn2;
11
+ relu;
12
+ downConv;
13
+ downBn;
14
+ prefix;
15
+ constructor(prefix, inChannels, outChannels, opts = {}) {
16
+ super();
17
+ this.prefix = prefix;
18
+ const stride = opts.stride ?? 1;
19
+ const rg = opts.requiresGrad ?? true;
20
+ this.conv1 = new Conv2d(inChannels, outChannels, 3, { stride, padding: 1, requiresGrad: rg });
21
+ this.bn1 = new BatchNorm2d(outChannels, { requiresGrad: rg });
22
+ this.conv2 = new Conv2d(outChannels, outChannels, 3, { padding: 1, requiresGrad: rg });
23
+ this.bn2 = new BatchNorm2d(outChannels, { requiresGrad: rg });
24
+ this.relu = new Relu();
25
+ if (stride !== 1 || inChannels !== outChannels) {
26
+ this.downConv = new Conv2d(inChannels, outChannels, 1, { stride, requiresGrad: rg });
27
+ this.downBn = new BatchNorm2d(outChannels, { requiresGrad: rg });
28
+ }
29
+ else {
30
+ this.downConv = null;
31
+ this.downBn = null;
32
+ }
33
+ }
34
+ forward(x) {
35
+ let h = this.relu.forward(this.bn1.forward(this.conv1.forward(x)));
36
+ h = this.bn2.forward(this.conv2.forward(h));
37
+ let skip = x;
38
+ if (this.downConv && this.downBn) {
39
+ skip = this.downBn.forward(this.downConv.forward(x));
40
+ }
41
+ return this.relu.forward(h.add(skip));
42
+ }
43
+ async state() {
44
+ const p = this.prefix;
45
+ const c1 = await this.conv1.state();
46
+ const b1 = await this.bn1.state();
47
+ const c2 = await this.conv2.state();
48
+ const b2 = await this.bn2.state();
49
+ const out = {
50
+ [`${p}.conv1.weight`]: c1.weight,
51
+ [`${p}.conv1.bias`]: c1.bias,
52
+ [`${p}.bn1.weight`]: b1.weight,
53
+ [`${p}.bn1.bias`]: b1.bias,
54
+ [`${p}.conv2.weight`]: c2.weight,
55
+ [`${p}.conv2.bias`]: c2.bias,
56
+ [`${p}.bn2.weight`]: b2.weight,
57
+ [`${p}.bn2.bias`]: b2.bias,
58
+ };
59
+ if (this.downConv && this.downBn) {
60
+ const dc = await this.downConv.state();
61
+ const db = await this.downBn.state();
62
+ out[`${p}.down.conv.weight`] = dc.weight;
63
+ out[`${p}.down.conv.bias`] = dc.bias;
64
+ out[`${p}.down.bn.weight`] = db.weight;
65
+ out[`${p}.down.bn.bias`] = db.bias;
66
+ }
67
+ return out;
68
+ }
69
+ loadState(saved, opts = {}) {
70
+ const p = this.prefix;
71
+ const rg = opts.requiresGrad ?? true;
72
+ const need = (k) => {
73
+ const s = saved[k];
74
+ if (!s)
75
+ throw new Error(`BasicBlock.loadState: missing '${k}'`);
76
+ return s;
77
+ };
78
+ this.conv1.loadState({ weight: need(`${p}.conv1.weight`), bias: need(`${p}.conv1.bias`) }, { requiresGrad: rg });
79
+ this.bn1.loadState({ weight: need(`${p}.bn1.weight`), bias: need(`${p}.bn1.bias`) }, { requiresGrad: rg });
80
+ this.conv2.loadState({ weight: need(`${p}.conv2.weight`), bias: need(`${p}.conv2.bias`) }, { requiresGrad: rg });
81
+ this.bn2.loadState({ weight: need(`${p}.bn2.weight`), bias: need(`${p}.bn2.bias`) }, { requiresGrad: rg });
82
+ if (this.downConv && this.downBn) {
83
+ this.downConv.loadState({ weight: need(`${p}.down.conv.weight`), bias: need(`${p}.down.conv.bias`) }, { requiresGrad: rg });
84
+ this.downBn.loadState({ weight: need(`${p}.down.bn.weight`), bias: need(`${p}.down.bn.bias`) }, { requiresGrad: rg });
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=basic-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic-block.js","sourceRoot":"","sources":["../src/basic-block.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,9 +4,11 @@
4
4
  * Not a closed vision-classify gate. Weights live in external `@dxo/resnet`.
5
5
  */
6
6
  import type { ImageBuffer, Tensor } from '@dxo/core';
7
+ export type { TensorStateSlice } from '@dxo/nn';
7
8
  export { VisionError } from './errors.js';
8
9
  export { Classifier, type ClassifierOptions, compose, LinearHead, type LinearHeadOptions, } from './heads.js';
9
10
  export { type ClassificationDecode, type ClassificationTopK, type DecodeClassificationOptions, decodeClassification, defineLabelSpace, type LabelSpace, type LabelSpaceOptions, } from './labels.js';
11
+ export type { Neural, NeuralSignature } from './neural.js';
10
12
  export { defineResNet, ResNet } from './resnet.js';
11
13
  export type { Device, ResNetDepth, ResNetOptions, ResNetSignature, TensorPort, WeightSource, } from './types.js';
12
14
  export { resnetFeatureChannels } from './types.js';
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,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;AAErB,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,19 @@
1
+ import type { Tensor } from '@dxo/core';
2
+ import type { TensorStateSlice } from '@dxo/nn';
3
+ import type { TensorPort } from './types.js';
4
+ /** Soft ports for graph connectivity — no labels / language. */
5
+ export type NeuralSignature = {
6
+ input: Record<string, TensorPort>;
7
+ output: Record<string, TensorPort>;
8
+ };
9
+ /**
10
+ * Public DXO compute contract (Living `14`).
11
+ * `@dxo/nn` `Module` may remain as an implementation base; cross-package APIs use Neural.
12
+ */
13
+ export interface Neural<I = Tensor, O = Tensor> {
14
+ forward(input: I): O;
15
+ readonly signature: NeuralSignature;
16
+ parameters(): Iterable<Tensor>;
17
+ state(): Promise<Record<string, TensorStateSlice>>;
18
+ }
19
+ //# sourceMappingURL=neural.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural.d.ts","sourceRoot":"","sources":["../src/neural.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,gEAAgE;AAChE,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM;IAC1C,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;CACtD"}
package/dist/neural.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=neural.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neural.js","sourceRoot":"","sources":["../src/neural.ts"],"names":[],"mappings":""}
package/dist/resnet.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import type { Tensor } from '@dxo/core';
2
- import { Module } from '@dxo/nn';
2
+ import { BatchNorm2d, Conv2d, MaxPool2d, Module, Relu, type TensorStateSlice } from '@dxo/nn';
3
+ import { BasicBlock } from './basic-block.js';
4
+ import type { Neural } from './neural.js';
3
5
  import { type ResNetDepth, type ResNetOptions, type ResNetSignature, type TensorPort, type WeightSource } from './types.js';
4
6
  /**
5
- * ResNet backbone only — `forward` yields feature Tensor, never labels.
6
- * Numerical full forward waits on spatial pool / stage wiring; preview throws `UNSUPPORTED`.
7
+ * ResNet backbone Neural — `forward` yields feature Tensor, never labels.
8
+ * DXO-native parameter names (`stem.*` / `stageN.blockM.*`); not a torchvision key mirror.
9
+ * depth=18 is wired; other depths throw `UNSUPPORTED` on forward/state.
10
+ * Extends `@dxo/nn` Module for parameter walk; public contract is Neural.
7
11
  */
8
- export declare class ResNet extends Module {
12
+ export declare class ResNet extends Module implements Neural<Tensor, Tensor> {
9
13
  #private;
10
14
  readonly depth: ResNetDepth;
11
15
  readonly inChannels: number;
@@ -13,12 +17,24 @@ export declare class ResNet extends Module {
13
17
  readonly norm: 'batchnorm';
14
18
  readonly device: ResNetOptions['device'];
15
19
  readonly signature: ResNetSignature;
20
+ /** Present only when depth === 18. */
21
+ stemConv: Conv2d | null;
22
+ stemBn: BatchNorm2d | null;
23
+ stemRelu: Relu | null;
24
+ stemPool: MaxPool2d | null;
25
+ stages: BasicBlock[][] | null;
16
26
  constructor(options?: ResNetOptions);
17
27
  features(): TensorPort;
18
28
  freeze(): void;
19
29
  unfreeze(): void;
20
30
  get trainable(): boolean;
21
- forward(_image: Tensor): Tensor;
31
+ /** Flat DXO state keys (depth=18 only). */
32
+ parameterNames(): string[];
33
+ state(): Promise<Record<string, TensorStateSlice>>;
34
+ loadState(saved: Record<string, TensorStateSlice>, opts?: {
35
+ requiresGrad?: boolean;
36
+ }): void;
37
+ forward(image: Tensor): Tensor;
22
38
  load(_weights: WeightSource, _options?: {
23
39
  scope?: 'all' | 'backbone';
24
40
  }): Promise<void>;
@@ -1 +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"}
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,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EAEpB,KAAK,UAAU,EACf,KAAK,YAAY,EACpB,MAAM,YAAY,CAAC;AA0BpB;;;;;GAKG;AACH,qBAAa,MAAO,SAAQ,MAAO,YAAW,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;IAChE,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;IAIpC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAClC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAQ;IAC7B,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAQ;IAClC,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,IAAI,CAAQ;gBAEzB,OAAO,GAAE,aAAkB;IAuCvC,QAAQ,IAAI,UAAU;IAItB,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,2CAA2C;IAC3C,cAAc,IAAI,MAAM,EAAE;IA2BpB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAoBxD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;IAmB/F,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IA2BxB,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 CHANGED
@@ -1,6 +1,10 @@
1
- import { Module } from '@dxo/nn';
2
- import { unsupported } from './errors.js';
1
+ import { BatchNorm2d, Conv2d, MaxPool2d, Module, Relu } from '@dxo/nn';
2
+ import { BasicBlock } from './basic-block.js';
3
+ import { unsupported, VisionError } from './errors.js';
3
4
  import { resnetFeatureChannels, } from './types.js';
5
+ /** DXO-native ResNet-18 layout: stages [2,2,2,2], channels 64→512. No classification `fc`. */
6
+ const RESNET18_BLOCKS = [2, 2, 2, 2];
7
+ const RESNET18_CHANNELS = [64, 128, 256, 512];
4
8
  function buildSignature(depth, inChannels) {
5
9
  const features = resnetFeatureChannels(depth);
6
10
  return {
@@ -21,8 +25,10 @@ function buildSignature(depth, inChannels) {
21
25
  };
22
26
  }
23
27
  /**
24
- * ResNet backbone only — `forward` yields feature Tensor, never labels.
25
- * Numerical full forward waits on spatial pool / stage wiring; preview throws `UNSUPPORTED`.
28
+ * ResNet backbone Neural — `forward` yields feature Tensor, never labels.
29
+ * DXO-native parameter names (`stem.*` / `stageN.blockM.*`); not a torchvision key mirror.
30
+ * depth=18 is wired; other depths throw `UNSUPPORTED` on forward/state.
31
+ * Extends `@dxo/nn` Module for parameter walk; public contract is Neural.
26
32
  */
27
33
  export class ResNet extends Module {
28
34
  depth;
@@ -33,6 +39,12 @@ export class ResNet extends Module {
33
39
  signature;
34
40
  #trainable;
35
41
  #ready = true;
42
+ /** Present only when depth === 18. */
43
+ stemConv = null;
44
+ stemBn = null;
45
+ stemRelu = null;
46
+ stemPool = null;
47
+ stages = null;
36
48
  constructor(options = {}) {
37
49
  super();
38
50
  this.depth = options.depth ?? 18;
@@ -43,9 +55,32 @@ export class ResNet extends Module {
43
55
  this.#trainable = options.trainable ?? true;
44
56
  this.signature = buildSignature(this.depth, this.inChannels);
45
57
  if (options.weights && options.weights !== 'none') {
46
- // Weight materialization is hub/serialize work; keep ctor sync and constructible.
47
58
  this.#ready = false;
48
59
  }
60
+ if (this.depth === 18) {
61
+ this.#buildResNet18(options.trainable ?? true);
62
+ }
63
+ }
64
+ #buildResNet18(requiresGrad) {
65
+ const rg = requiresGrad;
66
+ this.stemConv = new Conv2d(this.inChannels, 64, 7, { stride: 2, padding: 3, requiresGrad: rg });
67
+ this.stemBn = new BatchNorm2d(64, { requiresGrad: rg });
68
+ this.stemRelu = new Relu();
69
+ this.stemPool = new MaxPool2d(3, { stride: 2, padding: 1 });
70
+ const stages = [];
71
+ let inCh = 64;
72
+ for (let s = 0; s < RESNET18_BLOCKS.length; s++) {
73
+ const outCh = RESNET18_CHANNELS[s];
74
+ const nBlocks = RESNET18_BLOCKS[s];
75
+ const stage = [];
76
+ for (let b = 0; b < nBlocks; b++) {
77
+ const stride = s > 0 && b === 0 ? 2 : 1;
78
+ stage.push(new BasicBlock(`stage${s + 1}.block${b}`, inCh, outCh, { stride, requiresGrad: rg }));
79
+ inCh = outCh;
80
+ }
81
+ stages.push(stage);
82
+ }
83
+ this.stages = stages;
49
84
  }
50
85
  features() {
51
86
  return this.signature.output.features;
@@ -59,11 +94,89 @@ export class ResNet extends Module {
59
94
  get trainable() {
60
95
  return this.#trainable;
61
96
  }
62
- forward(_image) {
63
- unsupported('ResNet.forward', `depth=${this.depth}; full stem/stages/GAP not wired on this preview surface`);
97
+ /** Flat DXO state keys (depth=18 only). */
98
+ parameterNames() {
99
+ if (this.depth !== 18 || !this.stages) {
100
+ return [];
101
+ }
102
+ // Synchronous name list without reading tensor data.
103
+ const names = ['stem.conv.weight', 'stem.conv.bias', 'stem.bn.weight', 'stem.bn.bias'];
104
+ for (const stage of this.stages) {
105
+ for (const block of stage) {
106
+ const p = block.prefix;
107
+ names.push(`${p}.conv1.weight`, `${p}.conv1.bias`, `${p}.bn1.weight`, `${p}.bn1.bias`, `${p}.conv2.weight`, `${p}.conv2.bias`, `${p}.bn2.weight`, `${p}.bn2.bias`);
108
+ if (block.downConv) {
109
+ names.push(`${p}.down.conv.weight`, `${p}.down.conv.bias`, `${p}.down.bn.weight`, `${p}.down.bn.bias`);
110
+ }
111
+ }
112
+ }
113
+ return names;
114
+ }
115
+ async state() {
116
+ if (this.depth !== 18 || !this.stemConv || !this.stemBn || !this.stages) {
117
+ unsupported('ResNet.state', `depth=${this.depth}; only depth=18 state schema is wired`);
118
+ }
119
+ const c = await this.stemConv.state();
120
+ const b = await this.stemBn.state();
121
+ const out = {
122
+ 'stem.conv.weight': c.weight,
123
+ 'stem.conv.bias': c.bias,
124
+ 'stem.bn.weight': b.weight,
125
+ 'stem.bn.bias': b.bias,
126
+ };
127
+ for (const stage of this.stages) {
128
+ for (const block of stage) {
129
+ Object.assign(out, await block.state());
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+ loadState(saved, opts = {}) {
135
+ if (this.depth !== 18 || !this.stemConv || !this.stemBn || !this.stages) {
136
+ unsupported('ResNet.loadState', `depth=${this.depth}; only depth=18 state schema is wired`);
137
+ }
138
+ const rg = opts.requiresGrad ?? true;
139
+ const need = (k) => {
140
+ const s = saved[k];
141
+ if (!s)
142
+ throw new VisionError('MISSING_STATE_KEY', `ResNet.loadState: missing '${k}'`);
143
+ return s;
144
+ };
145
+ this.stemConv.loadState({ weight: need('stem.conv.weight'), bias: need('stem.conv.bias') }, { requiresGrad: rg });
146
+ this.stemBn.loadState({ weight: need('stem.bn.weight'), bias: need('stem.bn.bias') }, { requiresGrad: rg });
147
+ for (const stage of this.stages) {
148
+ for (const block of stage) {
149
+ block.loadState(saved, { requiresGrad: rg });
150
+ }
151
+ }
152
+ }
153
+ forward(image) {
154
+ if (this.depth !== 18 || !this.stemConv || !this.stemBn || !this.stemRelu || !this.stemPool || !this.stages) {
155
+ unsupported('ResNet.forward', `depth=${this.depth}; only depth=18 forward is wired`);
156
+ }
157
+ if (image.shape.length !== 4) {
158
+ throw new VisionError('MODEL_INPUT_SHAPE_MISMATCH', `ResNet.forward expects NCHW rank 4, got [${image.shape.join(',')}]`);
159
+ }
160
+ if (image.shape[1] !== this.inChannels) {
161
+ throw new VisionError('MODEL_INPUT_SHAPE_MISMATCH', `ResNet.forward expected ${this.inChannels} channels, got ${image.shape[1]}`);
162
+ }
163
+ let h = this.stemRelu.forward(this.stemBn.forward(this.stemConv.forward(image)));
164
+ h = this.stemPool.forward(h);
165
+ for (const stage of this.stages) {
166
+ for (const block of stage) {
167
+ h = block.forward(h);
168
+ }
169
+ }
170
+ const n = h.shape[0];
171
+ const c = h.shape[1];
172
+ const spatial = (h.shape[2] ?? 1) * (h.shape[3] ?? 1);
173
+ if (spatial !== 1) {
174
+ unsupported('ResNet.forward', `final spatial ${h.shape[2]}x${h.shape[3]} != 1x1 (use 32x32 input for depth=18 without avgPool)`);
175
+ }
176
+ return h.reshape([n, c]);
64
177
  }
65
178
  async load(_weights, _options) {
66
- unsupported('ResNet.load', 'weight materialization lands with hub / serialize');
179
+ unsupported('ResNet.load', 'use loadWeights in a later preview; remote sources not wired');
67
180
  }
68
181
  async ready() {
69
182
  if (!this.#ready) {
@@ -1 +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"}
1
+ {"version":3,"file":"resnet.js","sourceRoot":"","sources":["../src/resnet.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Device } from '@dxo/core';
2
+ import type { NeuralSignature } from './neural.js';
2
3
  /** Soft graph port — connectivity only; no labels / language. */
3
4
  export type TensorPort = {
4
5
  name: string;
@@ -30,7 +31,7 @@ export type ResNetOptions = {
30
31
  device?: Device;
31
32
  trainable?: boolean;
32
33
  };
33
- export type ResNetSignature = {
34
+ export type ResNetSignature = NeuralSignature & {
34
35
  input: {
35
36
  image: TensorPort;
36
37
  };
@@ -1 +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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,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,eAAe,GAAG;IAC5C,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.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4CA,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,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxo/vision",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "type": "module",
5
5
  "description": "DXO vision models and task adapters (developer preview, API unstable)",
6
6
  "license": "Apache-2.0",
@@ -20,8 +20,8 @@
20
20
  "build": "tsc -p tsconfig.json"
21
21
  },
22
22
  "dependencies": {
23
- "@dxo/core": "0.0.11",
24
- "@dxo/nn": "0.0.11"
23
+ "@dxo/core": "0.0.12",
24
+ "@dxo/nn": "0.0.12"
25
25
  },
26
26
  "keywords": [
27
27
  "dxo",