Edit this page

NA-MIC Project Weeks

Back to Projects List

Review of segmentation results quality across various multi-organ segmentation models

Key Investigators

Project Description

When initially released, TotalSegmentator was perceived to produce superior results, in comparison to the state-of-the-art at the time, anyway.

Over time, some of the deficiencies in the segmentations produced by TotalSegmentator have been identified. Further, new multi-organ segmentation models have been introduced.

Objective

  1. Review segmentation results for a sample of images from IDC NLST collection, documenting the problems, across the publicly available multi-organ segmentation models.

Approach and Plan

  1. Identify set of cases to review.
  2. Collect results from various methods (currently have for MOOSE and TotalSegmentator).
  3. Review cases with Ron and David (using SegmentationVerificationModule
  4. Identify more cases with failures, prepare interface/instructions how to help in identifying those.
  5. Summarize the results of the review in a publicly available document.

Progress and Next Steps

  1. Instructions for downloading initial sample of images:

pip install --upgrade idc-index

test_series = \
['1.2.840.113654.2.55.195946682403058845904768502826466194287', \
 '1.2.840.113654.2.55.221581533879834196356530174246594024639', \
 '1.2.840.113654.2.55.71263399928421039572326605504649736531', \
 '1.2.840.113654.2.55.79318439085250760439172236218713769408', \
 '1.2.840.113654.2.55.191661316001774647835097522264785668378', \
 '1.2.840.113654.2.55.304075689731327662774315497031574106725', \
 '1.2.840.113654.2.55.283399418711252976131557177419186072875', \
 '1.2.840.113654.2.55.21461438679308812574178613217680405233', \
 '1.2.840.113654.2.55.97114726565566537928831413367474015470', \
 '1.2.840.113654.2.55.122344168497038128022524906545138736420', \
 '1.2.840.113654.2.55.229650531101716203536241646069123704792', \
 '1.2.840.113654.2.55.257926562693607663865369179341285235858', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.135383252566920035150987356231', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.315696884435641630605419115484', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.230644512623268816899910856967', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.330739122093904668699523188451', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.690272753571338193252806012518', \
 '1.3.6.1.4.1.14519.5.2.1.7009.9004.310718458447911706151879406927']

from idc_index import IDCClient

c= IDCClient()

c.download_from_selection(downloadDir=".",seriesInstanceUID=test_series)
  1. 1 session with Ron looking at the initial result for just one case. Issues identified: 1) unrealistic anatomy and large gap between ribs and and erector spinae; 2) incorrect segmentation of some vertebrae; 3) large gaps between the structure; 4) segmentation is too coarse.
  2. Collected results from Auto3DSeg and OMAS, in addition to TotalSegmentator v1 and MOOSE for the test sample.
  3. Finished SNOMED mapping for OMAS.
  4. Harmonized mapping from model-specific labels to SNOMED-CT codes and consistent colors for Auto3DSeg and MOOSE (see CSV files here) - Google Sheet with current mapping. Didn’t finish this for OMAS! Notebook for this harmonization here.
  5. Explored Slicer capabilities for joint visualization of the segmentation results, identified relevant features thanks to Steve!
  6. Received Multitalent model segmentation results from Klaus Maier-Hein.
  7. Co-authored with Perplexity a Google Apps script for coloring Google Sheets cells based on the RGB string - helpful for quickly evaluating color selection.
  8. Brainstormed ideas for how to approach and scale up this comparison with Bjoern.

function colorCellsFromRGB() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var dataRange = sheet.getDataRange();
  var values = dataRange.getValues();

  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {
      var cell = values[i][j];
      if (typeof cell === 'string' && cell.match(/^\[\d{1,3}, \d{1,3}, \d{1,3}\]$/)) {
        var rgb = JSON.parse(cell);
        var color = rgbToHex(rgb[0], rgb[1], rgb[2]);
        sheet.getRange(i + 1, j + 1).setBackground(color);
      }
    }
  }
}

function rgbToHex(r, g, b) {
  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

Feedback/features:

Illustrations

Image

No response

Background and References