@talmolab/sleap-io.js 0.1.0 → 0.1.3
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 +34 -0
- package/dist/chunk-CDU5QGU6.js +590 -0
- package/dist/index.d.ts +242 -125
- package/dist/index.js +879 -436
- package/dist/instance-D_5PPN1y.d.ts +126 -0
- package/dist/lite.d.ts +209 -0
- package/dist/lite.js +178 -0
- package/package.json +16 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,127 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
constructor(name: string);
|
|
4
|
-
}
|
|
5
|
-
declare class Edge {
|
|
6
|
-
source: Node;
|
|
7
|
-
destination: Node;
|
|
8
|
-
constructor(source: Node, destination: Node);
|
|
9
|
-
at(index: number): Node;
|
|
10
|
-
}
|
|
11
|
-
declare class Symmetry {
|
|
12
|
-
nodes: Set<Node>;
|
|
13
|
-
constructor(nodes: Iterable<Node>);
|
|
14
|
-
at(index: number): Node;
|
|
15
|
-
}
|
|
16
|
-
type NodeOrIndex = Node | string | number;
|
|
17
|
-
declare class Skeleton {
|
|
18
|
-
nodes: Node[];
|
|
19
|
-
edges: Edge[];
|
|
20
|
-
symmetries: Symmetry[];
|
|
21
|
-
name?: string;
|
|
22
|
-
private nameToNode;
|
|
23
|
-
private nodeToIndex;
|
|
24
|
-
constructor(options: {
|
|
25
|
-
nodes: Array<Node | string>;
|
|
26
|
-
edges?: Array<Edge | [NodeOrIndex, NodeOrIndex]>;
|
|
27
|
-
symmetries?: Array<Symmetry | [NodeOrIndex, NodeOrIndex]>;
|
|
28
|
-
name?: string;
|
|
29
|
-
} | Array<Node | string>);
|
|
30
|
-
rebuildCache(nodes?: Node[]): void;
|
|
31
|
-
get nodeNames(): string[];
|
|
32
|
-
index(node: NodeOrIndex): number;
|
|
33
|
-
node(node: NodeOrIndex): Node;
|
|
34
|
-
get edgeIndices(): Array<[number, number]>;
|
|
35
|
-
get symmetryNames(): Array<[string, string]>;
|
|
36
|
-
matches(other: Skeleton): boolean;
|
|
37
|
-
addEdge(source: NodeOrIndex, destination: NodeOrIndex): void;
|
|
38
|
-
addSymmetry(left: NodeOrIndex, right: NodeOrIndex): void;
|
|
39
|
-
private edgeFrom;
|
|
40
|
-
private symmetryFrom;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
declare class Track {
|
|
44
|
-
name: string;
|
|
45
|
-
constructor(name: string);
|
|
46
|
-
}
|
|
47
|
-
type Point = {
|
|
48
|
-
xy: [number, number];
|
|
49
|
-
visible: boolean;
|
|
50
|
-
complete: boolean;
|
|
51
|
-
name?: string;
|
|
52
|
-
};
|
|
53
|
-
type PredictedPoint = Point & {
|
|
54
|
-
score: number;
|
|
55
|
-
};
|
|
56
|
-
type PointsArray = Point[];
|
|
57
|
-
type PredictedPointsArray = PredictedPoint[];
|
|
58
|
-
declare function pointsEmpty(length: number, names?: string[]): PointsArray;
|
|
59
|
-
declare function predictedPointsEmpty(length: number, names?: string[]): PredictedPointsArray;
|
|
60
|
-
declare function pointsFromArray(array: number[][], names?: string[]): PointsArray;
|
|
61
|
-
declare function predictedPointsFromArray(array: number[][], names?: string[]): PredictedPointsArray;
|
|
62
|
-
declare class Instance {
|
|
63
|
-
points: PointsArray;
|
|
64
|
-
skeleton: Skeleton;
|
|
65
|
-
track?: Track | null;
|
|
66
|
-
fromPredicted?: PredictedInstance | null;
|
|
67
|
-
trackingScore: number;
|
|
68
|
-
constructor(options: {
|
|
69
|
-
points: PointsArray | Record<string, number[]>;
|
|
70
|
-
skeleton: Skeleton;
|
|
71
|
-
track?: Track | null;
|
|
72
|
-
fromPredicted?: PredictedInstance | null;
|
|
73
|
-
trackingScore?: number;
|
|
74
|
-
});
|
|
75
|
-
static fromArray(points: number[][], skeleton: Skeleton): Instance;
|
|
76
|
-
static fromNumpy(options: {
|
|
77
|
-
pointsData: number[][];
|
|
78
|
-
skeleton: Skeleton;
|
|
79
|
-
track?: Track | null;
|
|
80
|
-
fromPredicted?: PredictedInstance | null;
|
|
81
|
-
trackingScore?: number;
|
|
82
|
-
}): Instance;
|
|
83
|
-
static empty(options: {
|
|
84
|
-
skeleton: Skeleton;
|
|
85
|
-
}): Instance;
|
|
86
|
-
get length(): number;
|
|
87
|
-
get nVisible(): number;
|
|
88
|
-
getPoint(target: number | string | Node): Point;
|
|
89
|
-
numpy(options?: {
|
|
90
|
-
invisibleAsNaN?: boolean;
|
|
91
|
-
}): number[][];
|
|
92
|
-
toString(): string;
|
|
93
|
-
get isEmpty(): boolean;
|
|
94
|
-
overlapsWith(other: Instance, iouThreshold?: number): boolean;
|
|
95
|
-
boundingBox(): [number, number, number, number] | null;
|
|
96
|
-
}
|
|
97
|
-
declare class PredictedInstance extends Instance {
|
|
98
|
-
score: number;
|
|
99
|
-
constructor(options: {
|
|
100
|
-
points: PredictedPointsArray | Record<string, number[]>;
|
|
101
|
-
skeleton: Skeleton;
|
|
102
|
-
track?: Track | null;
|
|
103
|
-
score?: number;
|
|
104
|
-
trackingScore?: number;
|
|
105
|
-
});
|
|
106
|
-
static fromArray(points: number[][], skeleton: Skeleton, score?: number): PredictedInstance;
|
|
107
|
-
static fromNumpy(options: {
|
|
108
|
-
pointsData: number[][];
|
|
109
|
-
skeleton: Skeleton;
|
|
110
|
-
track?: Track | null;
|
|
111
|
-
score?: number;
|
|
112
|
-
trackingScore?: number;
|
|
113
|
-
}): PredictedInstance;
|
|
114
|
-
static empty(options: {
|
|
115
|
-
skeleton: Skeleton;
|
|
116
|
-
}): PredictedInstance;
|
|
117
|
-
numpy(options?: {
|
|
118
|
-
scores?: boolean;
|
|
119
|
-
invisibleAsNaN?: boolean;
|
|
120
|
-
}): number[][];
|
|
121
|
-
toString(): string;
|
|
122
|
-
}
|
|
123
|
-
declare function pointsFromDict(pointsDict: Record<string, number[]>, skeleton: Skeleton): PointsArray;
|
|
124
|
-
declare function predictedPointsFromDict(pointsDict: Record<string, number[]>, skeleton: Skeleton): PredictedPointsArray;
|
|
1
|
+
import { I as Instance, P as PredictedInstance, S as Skeleton, T as Track } from './instance-D_5PPN1y.js';
|
|
2
|
+
export { E as Edge, N as Node, k as NodeOrIndex, a as Point, c as PointsArray, b as PredictedPoint, d as PredictedPointsArray, j as Symmetry, p as pointsEmpty, f as pointsFromArray, h as pointsFromDict, e as predictedPointsEmpty, g as predictedPointsFromArray, i as predictedPointsFromDict } from './instance-D_5PPN1y.js';
|
|
125
3
|
|
|
126
4
|
type VideoFrame = ImageData | ImageBitmap | Uint8Array | ArrayBuffer;
|
|
127
5
|
interface VideoBackend {
|
|
@@ -433,4 +311,243 @@ declare function labelsFromNumpy(data: number[][][][], options: {
|
|
|
433
311
|
returnConfidence?: boolean;
|
|
434
312
|
}): Labels;
|
|
435
313
|
|
|
436
|
-
|
|
314
|
+
declare function decodeYamlSkeleton(yamlData: string): Skeleton | Skeleton[];
|
|
315
|
+
declare function encodeYamlSkeleton(skeletons: Skeleton | Skeleton[]): string;
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Context passed to pre/post render callbacks.
|
|
319
|
+
*/
|
|
320
|
+
declare class RenderContext {
|
|
321
|
+
/** The 2D canvas rendering context */
|
|
322
|
+
readonly canvas: CanvasRenderingContext2D;
|
|
323
|
+
/** Current frame index (0 for single images) */
|
|
324
|
+
readonly frameIdx: number;
|
|
325
|
+
/** Original frame size [width, height] */
|
|
326
|
+
readonly frameSize: [number, number];
|
|
327
|
+
/** Instances in this frame */
|
|
328
|
+
readonly instances: (Instance | PredictedInstance)[];
|
|
329
|
+
/** Skeleton edge connectivity as [srcIdx, dstIdx] pairs */
|
|
330
|
+
readonly skeletonEdges: [number, number][];
|
|
331
|
+
/** Node names from skeleton */
|
|
332
|
+
readonly nodeNames: string[];
|
|
333
|
+
/** Current scale factor */
|
|
334
|
+
readonly scale: number;
|
|
335
|
+
/** Offset for cropped views [x, y] */
|
|
336
|
+
readonly offset: [number, number];
|
|
337
|
+
constructor(
|
|
338
|
+
/** The 2D canvas rendering context */
|
|
339
|
+
canvas: CanvasRenderingContext2D,
|
|
340
|
+
/** Current frame index (0 for single images) */
|
|
341
|
+
frameIdx: number,
|
|
342
|
+
/** Original frame size [width, height] */
|
|
343
|
+
frameSize: [number, number],
|
|
344
|
+
/** Instances in this frame */
|
|
345
|
+
instances: (Instance | PredictedInstance)[],
|
|
346
|
+
/** Skeleton edge connectivity as [srcIdx, dstIdx] pairs */
|
|
347
|
+
skeletonEdges: [number, number][],
|
|
348
|
+
/** Node names from skeleton */
|
|
349
|
+
nodeNames: string[],
|
|
350
|
+
/** Current scale factor */
|
|
351
|
+
scale?: number,
|
|
352
|
+
/** Offset for cropped views [x, y] */
|
|
353
|
+
offset?: [number, number]);
|
|
354
|
+
/**
|
|
355
|
+
* Transform world coordinates to canvas coordinates.
|
|
356
|
+
*/
|
|
357
|
+
worldToCanvas(x: number, y: number): [number, number];
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Context passed to per-instance callbacks.
|
|
361
|
+
*/
|
|
362
|
+
declare class InstanceContext {
|
|
363
|
+
/** The 2D canvas rendering context */
|
|
364
|
+
readonly canvas: CanvasRenderingContext2D;
|
|
365
|
+
/** Index of this instance within the frame */
|
|
366
|
+
readonly instanceIdx: number;
|
|
367
|
+
/** Keypoint coordinates as [[x0, y0], [x1, y1], ...] */
|
|
368
|
+
readonly points: number[][];
|
|
369
|
+
/** Skeleton edge connectivity */
|
|
370
|
+
readonly skeletonEdges: [number, number][];
|
|
371
|
+
/** Node names */
|
|
372
|
+
readonly nodeNames: string[];
|
|
373
|
+
/** Track ID (index in tracks array) */
|
|
374
|
+
readonly trackIdx: number | null;
|
|
375
|
+
/** Track name if available */
|
|
376
|
+
readonly trackName: string | null;
|
|
377
|
+
/** Instance confidence score */
|
|
378
|
+
readonly confidence: number | null;
|
|
379
|
+
/** Current scale factor */
|
|
380
|
+
readonly scale: number;
|
|
381
|
+
/** Offset for cropped views */
|
|
382
|
+
readonly offset: [number, number];
|
|
383
|
+
constructor(
|
|
384
|
+
/** The 2D canvas rendering context */
|
|
385
|
+
canvas: CanvasRenderingContext2D,
|
|
386
|
+
/** Index of this instance within the frame */
|
|
387
|
+
instanceIdx: number,
|
|
388
|
+
/** Keypoint coordinates as [[x0, y0], [x1, y1], ...] */
|
|
389
|
+
points: number[][],
|
|
390
|
+
/** Skeleton edge connectivity */
|
|
391
|
+
skeletonEdges: [number, number][],
|
|
392
|
+
/** Node names */
|
|
393
|
+
nodeNames: string[],
|
|
394
|
+
/** Track ID (index in tracks array) */
|
|
395
|
+
trackIdx?: number | null,
|
|
396
|
+
/** Track name if available */
|
|
397
|
+
trackName?: string | null,
|
|
398
|
+
/** Instance confidence score */
|
|
399
|
+
confidence?: number | null,
|
|
400
|
+
/** Current scale factor */
|
|
401
|
+
scale?: number,
|
|
402
|
+
/** Offset for cropped views */
|
|
403
|
+
offset?: [number, number]);
|
|
404
|
+
/**
|
|
405
|
+
* Transform world coordinates to canvas coordinates.
|
|
406
|
+
*/
|
|
407
|
+
worldToCanvas(x: number, y: number): [number, number];
|
|
408
|
+
/**
|
|
409
|
+
* Get centroid of valid (non-NaN) points.
|
|
410
|
+
*/
|
|
411
|
+
getCentroid(): [number, number] | null;
|
|
412
|
+
/**
|
|
413
|
+
* Get bounding box of valid points.
|
|
414
|
+
* Returns [x1, y1, x2, y2] or null if no valid points.
|
|
415
|
+
*/
|
|
416
|
+
getBbox(): [number, number, number, number] | null;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/** RGB color as [r, g, b] with values 0-255 */
|
|
420
|
+
type RGB = [number, number, number];
|
|
421
|
+
/** RGBA color as [r, g, b, a] with values 0-255 */
|
|
422
|
+
type RGBA = [number, number, number, number];
|
|
423
|
+
/** Flexible color specification */
|
|
424
|
+
type ColorSpec = RGB | RGBA | string | number;
|
|
425
|
+
/** Available color schemes */
|
|
426
|
+
type ColorScheme = "track" | "instance" | "node" | "auto";
|
|
427
|
+
/** Built-in palette names */
|
|
428
|
+
type PaletteName = "standard" | "distinct" | "tableau10" | "viridis" | "rainbow" | "warm" | "cool" | "pastel" | "seaborn";
|
|
429
|
+
/** Marker shape types */
|
|
430
|
+
type MarkerShape = "circle" | "square" | "diamond" | "triangle" | "cross";
|
|
431
|
+
/** Render options for renderImage() */
|
|
432
|
+
interface RenderOptions {
|
|
433
|
+
colorBy?: ColorScheme;
|
|
434
|
+
palette?: PaletteName | string;
|
|
435
|
+
markerShape?: MarkerShape;
|
|
436
|
+
markerSize?: number;
|
|
437
|
+
lineWidth?: number;
|
|
438
|
+
alpha?: number;
|
|
439
|
+
showNodes?: boolean;
|
|
440
|
+
showEdges?: boolean;
|
|
441
|
+
scale?: number;
|
|
442
|
+
background?: "transparent" | ColorSpec;
|
|
443
|
+
image?: ImageData | null;
|
|
444
|
+
width?: number;
|
|
445
|
+
height?: number;
|
|
446
|
+
preRenderCallback?: (ctx: RenderContext) => void;
|
|
447
|
+
postRenderCallback?: (ctx: RenderContext) => void;
|
|
448
|
+
perInstanceCallback?: (ctx: InstanceContext) => void;
|
|
449
|
+
}
|
|
450
|
+
/** Video rendering options (extends RenderOptions) */
|
|
451
|
+
interface VideoOptions extends RenderOptions {
|
|
452
|
+
frameInds?: number[];
|
|
453
|
+
start?: number;
|
|
454
|
+
end?: number;
|
|
455
|
+
fps?: number;
|
|
456
|
+
codec?: string;
|
|
457
|
+
crf?: number;
|
|
458
|
+
preset?: string;
|
|
459
|
+
onProgress?: (current: number, total: number) => void;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/** Named CSS colors */
|
|
463
|
+
declare const NAMED_COLORS: Record<string, RGB>;
|
|
464
|
+
/** Built-in color palettes (port from Python sleap_io/rendering/colors.py) */
|
|
465
|
+
declare const PALETTES: Record<PaletteName, RGB[]>;
|
|
466
|
+
/**
|
|
467
|
+
* Get n colors from a named palette, cycling if needed.
|
|
468
|
+
*/
|
|
469
|
+
declare function getPalette(name: PaletteName | string, n: number): RGB[];
|
|
470
|
+
/**
|
|
471
|
+
* Resolve flexible color specification to RGB tuple.
|
|
472
|
+
*/
|
|
473
|
+
declare function resolveColor(color: ColorSpec): RGB;
|
|
474
|
+
/**
|
|
475
|
+
* Convert RGB to CSS color string.
|
|
476
|
+
*/
|
|
477
|
+
declare function rgbToCSS(rgb: RGB, alpha?: number): string;
|
|
478
|
+
/**
|
|
479
|
+
* Determine color scheme based on context.
|
|
480
|
+
* - If tracks available: 'track'
|
|
481
|
+
* - Else if single image: 'instance'
|
|
482
|
+
* - Else: 'node' (prevents flicker in video)
|
|
483
|
+
*/
|
|
484
|
+
declare function determineColorScheme(scheme: ColorScheme, hasTracks: boolean, isSingleImage: boolean): ColorScheme;
|
|
485
|
+
|
|
486
|
+
type DrawMarkerFn = (ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, edgeColor?: string, edgeWidth?: number) => void;
|
|
487
|
+
/**
|
|
488
|
+
* Draw a circle marker.
|
|
489
|
+
*/
|
|
490
|
+
declare function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, edgeColor?: string, edgeWidth?: number): void;
|
|
491
|
+
/**
|
|
492
|
+
* Draw a square marker.
|
|
493
|
+
*/
|
|
494
|
+
declare function drawSquare(ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, edgeColor?: string, edgeWidth?: number): void;
|
|
495
|
+
/**
|
|
496
|
+
* Draw a diamond marker (rotated square).
|
|
497
|
+
*/
|
|
498
|
+
declare function drawDiamond(ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, edgeColor?: string, edgeWidth?: number): void;
|
|
499
|
+
/**
|
|
500
|
+
* Draw a triangle marker (pointing up).
|
|
501
|
+
*/
|
|
502
|
+
declare function drawTriangle(ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, edgeColor?: string, edgeWidth?: number): void;
|
|
503
|
+
/**
|
|
504
|
+
* Draw a cross/plus marker.
|
|
505
|
+
*/
|
|
506
|
+
declare function drawCross(ctx: CanvasRenderingContext2D, x: number, y: number, size: number, fillColor: string, _edgeColor?: string, edgeWidth?: number): void;
|
|
507
|
+
/** Map of marker shape names to drawing functions */
|
|
508
|
+
declare const MARKER_FUNCTIONS: Record<MarkerShape, DrawMarkerFn>;
|
|
509
|
+
/**
|
|
510
|
+
* Get the drawing function for a marker shape.
|
|
511
|
+
*/
|
|
512
|
+
declare function getMarkerFunction(shape: MarkerShape): DrawMarkerFn;
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Render poses on a single frame.
|
|
516
|
+
*
|
|
517
|
+
* @param source - Labels, LabeledFrame, or array of Instances to render
|
|
518
|
+
* @param options - Rendering options
|
|
519
|
+
* @returns ImageData with rendered poses
|
|
520
|
+
*/
|
|
521
|
+
declare function renderImage(source: Labels | LabeledFrame | (Instance | PredictedInstance)[], options?: RenderOptions): Promise<ImageData>;
|
|
522
|
+
/**
|
|
523
|
+
* Convert ImageData to PNG buffer (Node.js only).
|
|
524
|
+
*/
|
|
525
|
+
declare function toPNG(imageData: ImageData): Promise<Buffer>;
|
|
526
|
+
/**
|
|
527
|
+
* Convert ImageData to JPEG buffer (Node.js only).
|
|
528
|
+
*/
|
|
529
|
+
declare function toJPEG(imageData: ImageData, quality?: number): Promise<Buffer>;
|
|
530
|
+
/**
|
|
531
|
+
* Convert ImageData to data URL.
|
|
532
|
+
*/
|
|
533
|
+
declare function toDataURL(imageData: ImageData, format?: "png" | "jpeg"): string;
|
|
534
|
+
/**
|
|
535
|
+
* Save ImageData to a file.
|
|
536
|
+
*/
|
|
537
|
+
declare function saveImage(imageData: ImageData, path: string): Promise<void>;
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Check if ffmpeg is available in PATH.
|
|
541
|
+
*/
|
|
542
|
+
declare function checkFfmpeg(): Promise<boolean>;
|
|
543
|
+
/**
|
|
544
|
+
* Render video with pose overlays.
|
|
545
|
+
* Requires ffmpeg to be installed and in PATH.
|
|
546
|
+
*
|
|
547
|
+
* @param source - Labels or array of LabeledFrames to render
|
|
548
|
+
* @param outputPath - Path to save the output video
|
|
549
|
+
* @param options - Video rendering options
|
|
550
|
+
*/
|
|
551
|
+
declare function renderVideo(source: Labels | LabeledFrame[], outputPath: string, options?: VideoOptions): Promise<void>;
|
|
552
|
+
|
|
553
|
+
export { Camera, CameraGroup, type ColorScheme, type ColorSpec, FrameGroup, Instance, InstanceContext, InstanceGroup, LabeledFrame, Labels, type LabelsDict, LabelsSet, MARKER_FUNCTIONS, type MarkerShape, Mp4BoxVideoBackend, NAMED_COLORS, PALETTES, type PaletteName, PredictedInstance, type RGB, type RGBA, RecordingSession, RenderContext, type RenderOptions, Skeleton, SuggestionFrame, Track, Video, type VideoBackend, type VideoFrame, type VideoOptions, checkFfmpeg, decodeYamlSkeleton, determineColorScheme, drawCircle, drawCross, drawDiamond, drawSquare, drawTriangle, encodeYamlSkeleton, fromDict, fromNumpy, getMarkerFunction, getPalette, labelsFromNumpy, loadSlp, loadVideo, makeCameraFromDict, renderImage, renderVideo, resolveColor, rgbToCSS, rodriguesTransformation, saveImage, saveSlp, toDataURL, toDict, toJPEG, toNumpy, toPNG };
|