Files
ai-med-edu/seminars/Тема 1.2/Т1.ipynb
T

11 KiB
Raw Blame History

Cell:
[Cell type raw - unsupported, skipped]
In [ ]:
%pip install pydicom matplotlib nibabel gdown medmnist Pillow
In [ ]:
#!/usr/bin/env python3
# Download the 56 zip files in Images_png in batches
import urllib.request

# URLs for the zip files
links = [
    'https://nihcc.box.com/shared/static/vfk49d74nhbxq3nqjg0900w5nvkorp5c.gz',
    'https://nihcc.box.com/shared/static/i28rlmbvmfjbl8p2n3ril0pptcmcu9d1.gz',
    'https://nihcc.box.com/shared/static/f1t00wrtdk94satdfb9olcolqx20z2jp.gz',
	'https://nihcc.box.com/shared/static/0aowwzs5lhjrceb3qp67ahp0rd1l1etg.gz',
    'https://nihcc.box.com/shared/static/v5e3goj22zr6h8tzualxfsqlqaygfbsn.gz',
	'https://nihcc.box.com/shared/static/asi7ikud9jwnkrnkj99jnpfkjdes7l6l.gz',
	'https://nihcc.box.com/shared/static/jn1b4mw4n6lnh74ovmcjb8y48h8xj07n.gz',
    'https://nihcc.box.com/shared/static/tvpxmn7qyrgl0w8wfh9kqfjskv6nmm1j.gz',
	'https://nihcc.box.com/shared/static/upyy3ml7qdumlgk2rfcvlb9k6gvqq2pj.gz',
	'https://nihcc.box.com/shared/static/l6nilvfa9cg3s28tqv1qc1olm3gnz54p.gz',
	'https://nihcc.box.com/shared/static/hhq8fkdgvcari67vfhs7ppg2w6ni4jze.gz',
	'https://nihcc.box.com/shared/static/ioqwiy20ihqwyr8pf4c24eazhh281pbu.gz'
]

for idx, link in enumerate(links):
    fn = 'images_%02d.tar.gz' % (idx+1)
    print('downloading'+fn+'...')
    urllib.request.urlretrieve(link, fn)  # download the zip file

print("Download complete. Please check the checksums")
In [ ]:
import tarfile
import os

# Распаковка
with tarfile.open('images_02.tar.gz', 'r:gz') as tar:
    tar.extractall(path='images_01')
print("✅ Распаковано в папку 'images_01'")
print("Количество файлов в папке:", len(os.listdir('images_01')))
In [ ]:
import matplotlib.pyplot as plt
from PIL import Image
import random
import os

image_folder = 'images_01/images'
all_images = [f for f in os.listdir(image_folder) if f.endswith('.png')]
print(f"Всего PNG-файлов: {len(all_images)}")

# Покажем 5 случайных
sample = random.sample(all_images, min(5, len(all_images)))
plt.figure(figsize=(15, 10))
for i, img_name in enumerate(sample):
    img = Image.open(os.path.join(image_folder, img_name))
    plt.subplot(1, 5, i+1)
    plt.imshow(img, cmap='gray')
    plt.title(img_name[:15])
    plt.axis('off')
plt.show()
In [ ]:
!wget -O dataset.zip 'https://storage.yandexcloud.net/aie20.selftest/production/Dataset_for_self-testing_of_AI_services_%28AIE20_SELFTEST%29.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=J0yLHxYnLMK5SrRghejm%2F20260222%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Date=20260222T111520Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b135a1c05ed66ade15b59a73bc29aef7380f9da179abd74267c4ec235462992a'
In [ ]:
%pip install pylibjpeg pylibjpeg-libjpeg
In [ ]:
import os
import random
import pydicom
import matplotlib.pyplot as plt

# ------------------------------------------------------------
# 1. Настройки
# ------------------------------------------------------------
# Путь к корневой папке с данными CT (измените, если структура иная)
ct_root = 'Dataset_for_self-testing_of_AI_services_(AIE20_SELFTEST)/AIE20_SELFTEST/FLG'

# Количество случайных исследований для показа
num_samples = 5

# ------------------------------------------------------------
# 2. Функция для рекурсивного поиска всех DICOM-файлов в папке
# ------------------------------------------------------------
def find_dicom_files(folder):
    """Возвращает список путей ко всем файлам (не папкам) внутри folder."""
    all_files = []
    for root, dirs, files in os.walk(folder):
        for f in files:
            if not f.startswith('.'):   # игнорируем скрытые файлы
                all_files.append(os.path.join(root, f))
    return all_files

# ------------------------------------------------------------
# 3. Собираем все папки исследований (производитель/исследование)
# ------------------------------------------------------------
if not os.path.exists(ct_root):
    print(f"Ошибка: папка {ct_root} не найдена.")
else:
    # Получаем список производителей
    manufacturers = [m for m in os.listdir(ct_root) 
                     if os.path.isdir(os.path.join(ct_root, m))]
    if not manufacturers:
        print("Нет папок производителей.")
    else:
        # Список всех полных путей к папкам исследований
        study_folders = []
        for man in manufacturers:
            man_path = os.path.join(ct_root, man)
            studies = [s for s in os.listdir(man_path) 
                       if os.path.isdir(os.path.join(man_path, s))]
            for study in studies:
                study_folders.append(os.path.join(man_path, study))

        print(f"Всего найдено папок исследований: {len(study_folders)}")

        if not study_folders:
            print("Нет доступных исследований.")
        else:
            # Выбираем случайные папки (не больше, чем есть)
            selected = random.sample(study_folders, min(num_samples, len(study_folders)))

            # ------------------------------------------------------------
            # 4. Для каждой выбранной папки показываем случайное изображение
            # ------------------------------------------------------------
            plt.figure(figsize=(15, 10))
            for i, folder in enumerate(selected):
                # Рекурсивно ищем все файлы в этой папке
                dicom_files = find_dicom_files(folder)
                if not dicom_files:
                    print(f"В папке {folder} нет файлов, пропускаем.")
                    continue

                # Выбираем случайный файл
                chosen = random.choice(dicom_files)

                try:
                    ds = pydicom.dcmread(chosen)
                    # Проверяем, есть ли массив пикселей
                    if not hasattr(ds, 'pixel_array'):
                        print(f"Файл {chosen} не содержит изображения, пропускаем.")
                        continue

                    # Извлекаем метаданные для подписи
                    manufacturer = ds.get('Manufacturer', 'Unknown')
                    modality = ds.get('Modality', 'Unknown')
                    patient_id = ds.get('PatientID', 'Unknown')
                    study_desc = ds.get('StudyDescription', 'No description')
                    series_desc = ds.get('SeriesDescription', '')

                    # Формируем подпись
                    title = (f"{manufacturer}\n"
                             f"Modality: {modality}\n"
                             f"Patient: {patient_id}\n"
                             f"Study: {study_desc[:30]}\n"
                             f"Series: {series_desc[:20]}\n"
                             f"File: {os.path.basename(chosen)}")

                    # Отображаем
                    plt.subplot(1, num_samples, i+1)
                    plt.imshow(ds.pixel_array, cmap='gray')
                    plt.title(title, fontsize=8)
                    plt.axis('off')

                except Exception as e:
                    print(f"Ошибка при обработке файла {chosen}: {e}")
                    continue

            plt.tight_layout()
            plt.show()
In [ ]: