Усовершенствованное решение для медицинских приложений включает в себя несколько процедур и расширенную обработку изображений, а также сложность чтения. В данной статье раскрывается возможное решение для загрузчика медицинских изображений с использованием технологий CornerstoneJS и Orthanc [1, 2].

Введение

В последней статье под названием Использование CornerstoneJS и Orthanc для поддержки проектов глубокого обучения мы объясняем важность таких инструментов, как CornerstoneJS [3, 4] и Orthanc [1, 2 ] для поддержки наших алгоритмов Искусственного интеллекта (ИИ). Вкратце, эти инструменты имеют первостепенное значение для наших проектов, позволяя нам дать нашим клиницистам возможность предоставлять нам наборы данных, взаимодействуя с этими инструментами [8]. В конце концов, наборы данных будут использоваться в наших моделях искусственного интеллекта, предоставляя нам автономные результаты, необходимые врачам [5, 6, 7]. Использование этих инструментов позволит применить Машинное обучение (ML) к полю Медицинская визуализация (MI). Об этом говорится в нашей статье Применение новых парадигм взаимодействия человека и компьютера к медицинской информатике ». Следующее описание будет технической, но исчерпывающей информацией для любого читателя.

Решение

Облачное решение, подобное представленной архитектуре, демонстрирует упрощенный способ извлечения и загрузки наборов медицинских изображений. В нашем решении облачная платформа для предложенной архитектуры была реализована и развернута в виде демонстрации для целей данной статьи. исходный код представлен на нашей странице GitHub. Наш исходный код находится под лицензией MIT. Для получения более подробной информации перейдите на вики-страницу репозитория.

инструкции

Из нашего репозитория, прежде всего, вам необходимо клонировать наш исходный код. Затем вам необходимо выполнить несколько этапов наших инструкций для достижения целей как статьи, так и репозитория. Инструкции просты для выполнения, однако, если у вас есть какие-либо вопросы, не стесняйтесь задавать их в разделе комментариев к этой статье или открывайте новый выпуск GitHub, чтобы мы могли помочь вам с этим.

Клонировать

Чтобы клонировать настоящий репозиторий, следуйте приведенным ниже инструкциям. Это просто.

1.1. Клонируйте репозиторий, введя команду:

git clone https://github.com/opprDev/medical-image-downloader.git

1.2. Попасть в каталог репозитория:

cd medical-image-downloader/

1.3. Чтобы установить и запустить исходный код, выполните следующие действия;

Установить

Инструкции по установке следующие. Пожалуйста, убедитесь, что вы их правильно соблюдаете.

2.1. Выполните следующую команду, чтобы установить набор библиотек с помощью pip:

pip3 install -r requirements.txt

2.2. Выполните следующий шаг;

Бегать

Руководящие принципы работы следующие. Пожалуйста, убедитесь, что вы его правильно соблюдаете.

3.1. Запустите образец, используя следующую команду:

python3 src/core/main.py

3.2. Наслаждайтесь нашим исходным кодом!

Зависимости

Наш загрузчик был написан на Python, который легко освоить, но при этом он является основным языком для быстрого прототипирования. В этой работе мы в основном использовали библиотеки pandas, json и urllib. Мы использовали панд, чтобы управлять обработкой и анализом наших данных. Чтобы прочитать несколько файлов JSON, которые управляют CornerstoneJS связью с Orthanc, мы использовали библиотеку json. Наконец, чтобы получить соединение между URL-адресами (унифицированные указатели ресурсов), мы использовали библиотеку urllib.

Исходный код

Как мы говорили в нашей предыдущей статье, при взаимодействии клиент-сервер клиентская сторона CornerstoneJS ищет исследования (кейсы) или серии (цифровые слайды) ресурсов (см. Рисунок) с предоставлением параметров запроса для фильтрации объектов DICOM на основе заданных значений атрибутов. Чтобы прочитать набор значений, библиотека urllib извлекает URL-адрес, чтобы мы могли интерпретировать структуры медицинских изображений. Схемы в формате JSON. Поэтому для интерпретации схем мы использовали библиотеку json.

Структура папки

В нашем проекте будут следующие папки:

src/
├── core/
├── methods/
├── notebooks/
├── tests/
└── variables/

Полный исходный код находится внутри папки src /. В папке есть несколько других подпапок, в которых наш код организован по разделам. Первый раздел - это подпапка core /, в которой находится файл main.py. . Файл main.py является основным файлом, работающим в качестве координатора. Подпапка methods / - это то место, где у нас есть набор методов для загрузки медицинских изображений или для поддержки процесса. Поскольку мы используем Jupyter Notebook, мы создали подпапку notebooks / для их размещения. Каждый проект должен иметь свой собственный набор тестов, чтобы мы может гарантировать действительность нашего исходного кода. В подпапке tests / мы разместили наши тесты для проекта и в переменных / подпапка, у нас есть используемые переменные и константы.

Методы

Внутри папки src / » и внутри подпапки methods / у нас есть accessing.py файл. Этот файл имеет основной метод загрузки медицинских изображений, которые отображаются в программе просмотра CornerstoneJS и хранятся на сервере Orthanc.

Но сначала давайте объясним, как достичь каждой функциональной цели. Первая часть - запросить URL с помощью библиотеки urllib.

dataStudyList = urllib.request.urlopen(mainServer).read()

Во-вторых, нам нужно интерпретировать данные (см. Рисунок), поступающие из запроса. Для этого мы использовали библиотеку json, которая считывает ответ, приходящий с сервера Orthanc, загружая его в объект JavaScript.

outputStudyList = json.loads(dataStudyList)

Теперь мы находимся на пути к запуску схем медицинских изображений. Глядя на наши примеры Demo и Prototype Cornerstone, можно увидеть две важные конечные точки: (1) файл studyList.json; и (2) папка Studies /. В файле studyList.json у нас хранится список пациентов. А в папке Studies / у нас есть сведения о каждом пациенте.

В качестве примера файла studyList.json у нас есть следующее:

{
    "studyList": [
        {
            "patientName": "MR/BRAIN/GRASE/1024",
            "patientId": "7",
            "internalId": "8f14e4",
            "studyDate": "19950330",
            "modality": "BRAIN",
            "studyDescription": "BRAIN",
            "numImages": 1,
            "studyId": "7"
        },
        {
            "patientName": "Anonymized",
            "patientId": "0",
            "internalId": "cfcd20",
            "studyDate": "20070101",
            "modality": "Knee (R)",
            "studyDescription": "Knee (R)",
            "numImages": 71,
            "studyId": "0"
        },
        {
            "patientName": "Case1",
            "patientId": "Case1",
            "internalId": "a294f5",
            "studyDate": "20080408",
            "modality": "BREAST IMAGING TOMOSYNTHESIS",
            "studyDescription": "BREAST IMAGING TOMOSYNTHESIS",
            "numImages": 6,
            "studyId": "Case1"
        }
    ]
}

В качестве примера папки Studies / и, в частности, случая пациента из Case1.json Файл имеем:

{
    "patientName": "Case1",
    "patientId": "Case1",
    "internalId": "a294f5",
    "studyDate": "20080408",
    "modality": "BREAST IMAGING TOMOSYNTHESIS",
    "studyDescription": "BREAST IMAGING TOMOSYNTHESIS",
    "numImages": 1,
    "studyId": "dec7949e-a99467d6-305d0d64-424bfd75-8a1579ab",
    "seriesList": [
        {
            "seriesDescription": "MG",
            "seriesNumber": "72100000",
            "instanceList": [
                {
                    "instanceNumber": 29,
                    "imageId": "dd03786b-6cc667d1-a65fa0e9-34101126-6f82ca59/file"
                }
            ]
        },
        {
            "seriesDescription": "MG",
            "seriesNumber": "72100000",
            "instanceList": [
                {
                    "instanceNumber": 15,
                    "imageId": "ae407aac-af2c66a3-5801a6c9-ffff4ae9-06496953/file"
                }
            ]
        },
        {
            "seriesDescription": "MG",
            "seriesNumber": "73100000",
            "instanceList": [
                {
                    "instanceNumber": 16,
                    "imageId": "062ce5a8-0d015abb-73f65ae3-f95d55e8-9cbdfcb6/file"
                }
            ]
        },
        {
            "seriesDescription": "MG",
            "seriesNumber": "73100000",
            "instanceList": [
                {
                    "instanceNumber": 30,
                    "imageId": "6f6f0dc7-db7a6fa0-f3e46a80-8bcda478-194bcf11/file"
                }
            ]
        },
        {
            "seriesDescription": "MG",
            "seriesNumber": "73200000",
            "instanceList": [
                {
                    "instanceNumber": 30,
                    "imageId": "e0551a96-ccf93766-a2d57ddf-361c8462-46b8b196/file"
                }
            ]
        },
        {
            "seriesDescription": "MG",
            "seriesNumber": "73200000",
            "instanceList": [
                {
                    "instanceNumber": 16,
                    "imageId": "88653231-d6fba822-1af594af-e6f5b30d-dd1ab7f2/file"
                }
            ]
        }
    ]
}

Чтобы лучше понять структуру схемы, очень важно прочитать нашу последнюю статью, о которой говорилось ранее. Если вы уже не знакомы с этой структурой PACS. Для краткого описания вышеуказанных структур массив seriesList (см. Рисунок) содержит список серий. Каждая из серий имеет seriesDescription, seriesNumber и список instanceList в виде массивов с несколькими экземплярами картинки.

Теперь для каждого пациента нам нужно прочитать соответствующую информацию об объекте. Для этого мы просто просматриваем studyList файла studyList.json и извлекаем PatientId в извлеките исследование пациента из папки исследования /. В нашем примере мы используем имя пациента: Case1 для получения Case1.json файл.

for ptnt in range(len(outputStudyList['studyList'])):
    patientIdToCompare = outputStudyList['studyList'][ptnt]['patientId']
    pntFileOnServer = lnk004 + patientIdToCompare + ext003
    dataStudies = urllib.request.urlopen(pntFileOnServer).read()
    outputStudies = json.loads(dataStudies)

Оттуда мы можем прочитать информацию внутри файла Case1.json, также как объект JavaScript. Теперь мы хотим проанализировать seriesList, пройдя через instanceList, чтобы получить imageId. С помощью imageId мы можем получить и загрузить каждое изображение.

for study in range(len(outputStudies)):
      seriesList = outputStudies['seriesList']
      for serie in range(len(seriesList)):
        seriesNumber = seriesList[serie]['seriesNumber']
        instanceList = seriesList[serie]['instanceList']
        for instance in range(len(instanceList)):
          image_counter = image_counter + 1
          imageId = instanceList[instance]['imageId']
          dcmUrl = dicomServer + imageId
          dcmFileName = folderToSave + str(image_counter) + ext002
          urllib.request.urlretrieve(dcmUrl, dcmFileName)

Последний метод исходный код загрузки медицинских изображений:

def dwnldMainServImgStorOnDicomServ(folderToSave, mainServer, dicomServer):
  '''
  Downloading all medical images from your main server
  that are stored on a DICOM server.
  '''
  image_counter = 10000000
  dataStudyList = urllib.request.urlopen(mainServer).read()
  outputStudyList = json.loads(dataStudyList)
  for ptnt in range(len(outputStudyList['studyList'])):
    print(c010)
    patientIdToCompare = outputStudyList['studyList'][ptnt]['patientId']
    pntFileOnServer = lnk004 + patientIdToCompare + ext003
    dataStudies = urllib.request.urlopen(pntFileOnServer).read()
    outputStudies = json.loads(dataStudies)
    print(outputStudies)
    for study in range(len(outputStudies)):
      seriesList = outputStudies['seriesList']
      for serie in range(len(seriesList)):
        seriesNumber = seriesList[serie]['seriesNumber']
        instanceList = seriesList[serie]['instanceList']
        for instance in range(len(instanceList)):
          image_counter = image_counter + 1
          imageId = instanceList[instance]['imageId']
          print(msg004, imageId, msg005, seriesNumber)
          dcmUrl = dicomServer + imageId
          dcmFileName = folderToSave + str(image_counter) + ext002
          urllib.request.urlretrieve(dcmUrl, dcmFileName)
    print(c010)

Выводы

В этой статье мы предлагаем решение для получения и загрузки наборов медицинских изображений, которые отображаются в программе просмотра CornerstoneJS и хранятся на сервере Orthanc. Мы предоставляем понятный и простой исходный код, хорошо описанный и задокументированный в этой статье, а также на вики-странице репозитория. Кроме того, мы покажем, как это решение позволяет применять методы ML к полю MI и как продвигать такие исследовательские проекты.

Благодарности

Этот пост поддерживается тематическими исследованиями проектов MIMBCD-UI, MIDA и BreastScreening в IST от ULisboa. Эти три проекта активно спонсируются FCT, португальским государственным агентством, которое продвигает науку, технологии и инновации во всех научных областях. Проект BreastScreening - это Проект открытия ARC (DP140102794) в сотрудничестве с IST, Adelaide и UQueensland. Эта статья возникла в результате исследовательской работы между ISR-Lisboa и ITI, обеими ассоциированными лабораториями LARSyS. От этих учреждений я хотел бы выразить особую благодарность профессору Jacinto C. Nascimento и профессору Nuno Nunes за советы во время моей исследовательской работы. И последнее, но не менее важное: я хотел бы поблагодарить нескольких важных людей из этой благородной организации под названием oppr. Особая благодарность Густаву Пассосу де Гувейя, Бруно Оливейре, Жоао Кампосу, Карлоте Гальван де Мело и Жоао Крузу за рецензирование этой статьи, сделавшее мне отличный вклад. И последнее, но не менее важное, особая благодарность Крису Хэфи, движущей силе CornerstoneJS, который также разработал cornerstoneDemo. Не говоря уже о трех сторонниках библиотеки CornerstoneJS: Алоис Дрейфус, Дэнни Браун и Эрик Зиглер. Отдельно хотим поблагодарить Эрика Циглера, который поддержал несколько проблем на этом пути. В конце концов, большое спасибо всей команде проекта Orthanc, но особенно Себастьяну Йодонь.

Сторонники

Наша организация - некоммерческая организация. Однако в рамках нашей деятельности у нас много расходов. От инфраструктуры до расходов на обслуживание, нам нужны деньги, а также помощь для поддержки нашей команды и проектов. За свои деньги мы создали несколько каналов, которые позволят решить эту проблему. Во-первых, вы можете поддержать нас, став одним из наших Патреонов. Во-вторых, вы можете поддержать нас на странице Открытый коллектив. В-третьих, вы можете купить нам один кофе (или больше). В-четвертых, вы также можете поддержать нас на нашей странице Liberapay. И последнее, но не менее важное: вы можете напрямую поддержать нас на PayPal. С другой стороны, нам тоже нужна помощь в развитии наших проектов. Поэтому, если у вас есть знания, мы приглашаем вас поддержать наши проекты (например, GitHub). Просто следите за нашими каналами и репозиториями.

Социальное

Мы в топовых социальных сетях. Ссылки следующие. Также вы можете поговорить с нами в чате. Просто подпишитесь на нас, чтобы узнавать о нашей работе и новостях.

Список наших социальных сетей и каналов чатов:

Facebook | Твиттер | LinkedIn | Гиттер | "YouTube"

использованная литература

[1] Йодонь, С., Бернар, К., Девиллерс, М., Ленертс, Э. и Кук, П., 2013 г., апрель. Orthanc - легкий, спокойный сервер DICOM для здравоохранения и медицинских исследований. В 2013 году 10-й Международный симпозиум IEEE по биомедицинской визуализации (стр. 190–193). IEEE.

[2] Йодонь, С., 2018. Экосистема Orthanc для медицинской визуализации. Журнал цифровой обработки изображений, 31 (3), стр.341–352.

[3] Хостеттер, Дж., Ханна, Н. и Манделл, Дж. К., 2018. Интеграция облачной системы архивации изображений и обмена данными с нулевым следом загрязнения с настраиваемыми формами для радиологических исследований и образования. Академическая радиология, 25 (6), стр.811–818.

[4] Седги, А., Хамиди, С., Мехрташ, А., Циглер, Э., Темпани, К., Пипер, С., Капур, Т. и Мусави, П., 2019 г., март. Tesseract-medical imaging: браузерная платформа с открытым исходным кодом для развертывания искусственного интеллекта в медицинской визуализации. В журнале Medical Imaging 2019: процедуры с визуальным контролем, роботизированные вмешательства и моделирование (том 10951, стр. 109511R). Международное общество оптики и фотоники.

[5] Калисто, Ф.М., Ленкастр, Х., Нуньес, Нью-Джерси, и Насименто, Дж. К., Помощник по диагностике с помощью медицинской визуализации: проверка пользователей системы радиомики с помощью искусственного интеллекта.

[6] Калисто, Ф.М., Ленкастр, Х., Нуньес, Нью-Джерси, и Насименто, Дж. К., Помощник по диагностике с помощью медицинских изображений: проверка пользователей системы радиомики с помощью искусственного интеллекта.

[7] Калисто, Ф.М., Миральдо, П., Нунес, Н. и Насименто, Дж. К. Скрининг груди: помощник по мультимодальной диагностике.

[8] Калисто, Ф.М., Феррейра, А., Насименто, Дж. К. и Гонсалвес, Д., 2017 г., октябрь. К аннотации для диагностики медицинских изображений с помощью сенсорного экрана. В материалах Международной конференции ACM по интерактивным поверхностям и пространствам 2017 г. (стр. 390–395). ACM.