Усовершенствованное решение для медицинских приложений включает в себя несколько процедур и расширенную обработку изображений, а также сложность чтения. В данной статье раскрывается возможное решение для загрузчика медицинских изображений с использованием технологий 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.