@cornerstonejs/ai 5.11.6 → 5.12.0

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.
@@ -65,6 +65,7 @@ export default class ONNXSegmentationController {
65
65
  private _searchBreadth;
66
66
  private loadingAI;
67
67
  protected viewport: any;
68
+ private viewportGeneration;
68
69
  protected excludeTool: string;
69
70
  protected currentImage: any;
70
71
  private listeners;
@@ -122,6 +123,7 @@ export default class ONNXSegmentationController {
122
123
  interpolateScroll(viewport?: any, dir?: number): Promise<void>;
123
124
  protected log(logger: Loggers, ...args: unknown[]): void;
124
125
  protected getPromptAnnotations: (viewport?: any) => cornerstoneTools.Types.Annotations;
126
+ protected getActiveSegmentation(viewport?: any): cornerstoneTools.Types.Segmentation;
125
127
  protected viewportRenderedListener: (_event: any) => void;
126
128
  protected annotationModifiedListener: Function;
127
129
  disconnectViewport(viewport: any): void;
@@ -86,6 +86,7 @@ class ONNXSegmentationController {
86
86
  this.labels = [];
87
87
  this.worldPoints = new Array();
88
88
  this._searchBreadth = 3;
89
+ this.viewportGeneration = 0;
89
90
  this.excludeTool = ONNXSegmentationController.MarkerExclude;
90
91
  this.listeners = [
91
92
  (message, ...args) => cs3dLogger.info(message, ...args),
@@ -138,16 +139,19 @@ class ONNXSegmentationController {
138
139
  else {
139
140
  desiredImage.sampleImageId = desiredImage.imageId;
140
141
  }
142
+ const segmentation = this.getActiveSegmentation();
143
+ if (!segmentation) {
144
+ this.randomPoints = [];
145
+ }
141
146
  if (desiredImage.imageId === currentImage?.imageId) {
142
147
  return;
143
148
  }
144
- if (this._enabled && this._autoSegmentMode) {
149
+ if (segmentation && this._enabled && this._autoSegmentMode) {
145
150
  if ('isInAcquisitionPlane' in viewport &&
146
151
  !viewport.isInAcquisitionPlane()) {
147
152
  cs3dLogger.warn('Non acquisition plane viewports and auto segment mode is not yet supported');
148
153
  return;
149
154
  }
150
- const segmentation = cornerstoneTools.segmentation.activeSegmentation.getActiveSegmentation(viewport.id);
151
155
  const segmentIndex = cornerstoneTools.segmentation.segmentIndex.getActiveSegmentIndex(segmentation.segmentationId);
152
156
  const imageIds = viewport.getImageIds();
153
157
  const currentImageIdIndex = viewport.getCurrentImageIdIndex();
@@ -275,11 +279,13 @@ class ONNXSegmentationController {
275
279
  this.tryLoad();
276
280
  }
277
281
  initViewport(viewport) {
282
+ this.viewportGeneration++;
278
283
  const { desiredImage } = this;
279
284
  if (this.viewport) {
280
285
  this.disconnectViewport(this.viewport);
281
286
  }
282
287
  this.currentImage = null;
288
+ this.randomPoints = [];
283
289
  this.viewport = viewport;
284
290
  const brushInstance = new LabelmapBaseTool({}, {
285
291
  configuration: {
@@ -398,9 +404,16 @@ class ONNXSegmentationController {
398
404
  listener(logger, ...args);
399
405
  }
400
406
  }
407
+ getActiveSegmentation(viewport = this.viewport) {
408
+ if (!viewport) {
409
+ return;
410
+ }
411
+ return cornerstoneTools.segmentation.activeSegmentation.getActiveSegmentation(viewport.id);
412
+ }
401
413
  disconnectViewport(viewport) {
402
414
  viewport.element.removeEventListener(Events.IMAGE_RENDERED, this.viewportRenderedListener);
403
415
  const boundListener = this.annotationModifiedListener;
416
+ eventTarget.removeEventListener(toolsEvents.ANNOTATION_ADDED, boundListener);
404
417
  eventTarget.removeEventListener(toolsEvents.ANNOTATION_MODIFIED, boundListener);
405
418
  eventTarget.removeEventListener(toolsEvents.ANNOTATION_COMPLETED, boundListener);
406
419
  }
@@ -558,7 +571,9 @@ class ONNXSegmentationController {
558
571
  }
559
572
  async runDecode() {
560
573
  const { canvas } = this;
561
- if (this.isGpuInUse || !this.currentImage?.imageEmbeddings) {
574
+ if (this.isGpuInUse ||
575
+ !this.currentImage?.imageEmbeddings ||
576
+ !this.getActiveSegmentation()) {
562
577
  return;
563
578
  }
564
579
  this.isGpuInUse = true;
@@ -707,6 +722,9 @@ class ONNXSegmentationController {
707
722
  createLabelmap(mask, canvasPosition, _points, _labels) {
708
723
  const { canvas, viewport } = this;
709
724
  const preview = this.tool.addPreview(viewport.element);
725
+ if (!preview) {
726
+ return;
727
+ }
710
728
  const { previewSegmentIndex, memo, segmentationId, segmentIndex, segmentationVoxelManager, } = preview;
711
729
  const previewVoxelManager = memo?.voxelManager;
712
730
  const { dimensions } = previewVoxelManager;
@@ -758,7 +776,7 @@ class ONNXSegmentationController {
758
776
  triggerSegmentationDataModified(segmentationId);
759
777
  }
760
778
  async decode(points, labels, useSession = this.currentImage) {
761
- const { canvas, canvasMask, imageImageData, desiredImage, boxRadius } = this;
779
+ const { canvas, canvasMask, imageImageData, desiredImage, boxRadius, viewport, viewportGeneration, } = this;
762
780
  const ctx = canvas.getContext('2d', { willReadFrequently: true });
763
781
  ctx.clearRect(0, 0, canvas.width, canvas.height);
764
782
  canvas.width = imageImageData.width;
@@ -778,6 +796,10 @@ class ONNXSegmentationController {
778
796
  const session = useSession.decoder;
779
797
  const feed = feedForSam(emb, points, labels);
780
798
  const res = await session.run(feed);
799
+ if (viewport !== this.viewport ||
800
+ viewportGeneration !== this.viewportGeneration) {
801
+ return;
802
+ }
781
803
  for (let i = 0; i < points.length; i += 2) {
782
804
  const label = labels[i / 2];
783
805
  ctx.fillStyle = label ? 'blue' : 'pink';
@@ -1 +1 @@
1
- export declare const version = "5.11.6";
1
+ export declare const version = "5.12.0";
@@ -1 +1 @@
1
- export const version = '5.11.6';
1
+ export const version = '5.12.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/ai",
3
- "version": "5.11.6",
3
+ "version": "5.12.0",
4
4
  "description": "AI and ML Interfaces for Cornerstone3D",
5
5
  "files": [
6
6
  "dist"
@@ -63,11 +63,11 @@
63
63
  "onnxruntime-web": "1.17.1"
64
64
  },
65
65
  "devDependencies": {
66
- "@cornerstonejs/core": "5.11.6",
67
- "@cornerstonejs/tools": "5.11.6"
66
+ "@cornerstonejs/core": "5.12.0",
67
+ "@cornerstonejs/tools": "5.12.0"
68
68
  },
69
69
  "peerDependencies": {
70
- "@cornerstonejs/core": "5.11.6",
71
- "@cornerstonejs/tools": "5.11.6"
70
+ "@cornerstonejs/core": "5.12.0",
71
+ "@cornerstonejs/tools": "5.12.0"
72
72
  }
73
73
  }