11 KiB
11 KiB
Cell:
[Cell type raw - unsupported, skipped]
In [ ]:
%pip install pydicom matplotlib nibabel gdown medmnist PillowIn [ ]:
#!/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-libjpegIn [ ]:
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 [ ]: