% ============================================================================ % ЛАБОРАТОРНАЯ РАБОТА №4 % ПОЛНЫЙ ПАЙПЛАЙН ПОДГОТОВКИ ДАННЫХ И ОБУЧЕНИЯ МОДЕЛЕЙ ИИ % ============================================================================ \documentclass[12pt,a4paper]{article} % ============================================================================ % ПРЕАМБУЛА % ============================================================================ \usepackage[utf8]{inputenc} \usepackage[T2A]{fontenc} \usepackage[russian]{babel} \usepackage{amsmath,amssymb,amsfonts} \usepackage{graphicx} \usepackage{hyperref} \usepackage{listings} \usepackage{xcolor} \usepackage{geometry} \usepackage{booktabs} \usepackage{longtable} \usepackage{caption} \usepackage{subcaption} \usepackage{titlesec} \usepackage{float} \usepackage{array} \usepackage{multirow} \usepackage{enumitem} \usepackage{setspace} \geometry{left=2.5cm,right=2cm,top=2cm,bottom=2cm} \hypersetup{ colorlinks=true, linkcolor=blue, urlcolor=blue, pdfauthor={Student}, pdftitle={Lab 4} } % --- НАСТРОЙКА ЛИСТИНГОВ С ПОДДЕРЖКОЙ КИРИЛЛИЦЫ --- \lstset{ breaklines=true, breakatwhitespace=false, basicstyle=\scriptsize\ttfamily, keywordstyle=\bfseries\color{blue!70}, commentstyle=\itshape\color{gray!70}, stringstyle=\color{red!60!black}, frame=single, rulecolor=\color{gray!50}, numbers=left, numberstyle=\tiny\color{gray}, numbersep=5pt, tabsize=4, showstringspaces=false, captionpos=b, extendedchars=true, literate= {А}{{\selectfont\char192}}1 {Б}{{\selectfont\char193}}1 {В}{{\selectfont\char194}}1 {Г}{{\selectfont\char195}}1 {Д}{{\selectfont\char196}}1 {Е}{{\selectfont\char197}}1 {Ё}{{\selectfont\char168}}1 {Ж}{{\selectfont\char198}}1 {З}{{\selectfont\char199}}1 {И}{{\selectfont\char200}}1 {Й}{{\selectfont\char201}}1 {К}{{\selectfont\char202}}1 {Л}{{\selectfont\char203}}1 {М}{{\selectfont\char204}}1 {Н}{{\selectfont\char205}}1 {О}{{\selectfont\char206}}1 {П}{{\selectfont\char207}}1 {Р}{{\selectfont\char208}}1 {С}{{\selectfont\char209}}1 {Т}{{\selectfont\char210}}1 {У}{{\selectfont\char211}}1 {Ф}{{\selectfont\char212}}1 {Х}{{\selectfont\char213}}1 {Ц}{{\selectfont\char214}}1 {Ч}{{\selectfont\char215}}1 {Ш}{{\selectfont\char216}}1 {Щ}{{\selectfont\char217}}1 {Ъ}{{\selectfont\char218}}1 {Ы}{{\selectfont\char219}}1 {Ь}{{\selectfont\char220}}1 {Э}{{\selectfont\char221}}1 {Ю}{{\selectfont\char222}}1 {Я}{{\selectfont\char223}}1 {а}{{\selectfont\char224}}1 {б}{{\selectfont\char225}}1 {в}{{\selectfont\char226}}1 {г}{{\selectfont\char227}}1 {д}{{\selectfont\char228}}1 {е}{{\selectfont\char229}}1 {ё}{{\selectfont\char184}}1 {ж}{{\selectfont\char230}}1 {з}{{\selectfont\char231}}1 {и}{{\selectfont\char232}}1 {й}{{\selectfont\char233}}1 {к}{{\selectfont\char234}}1 {л}{{\selectfont\char235}}1 {м}{{\selectfont\char236}}1 {н}{{\selectfont\char237}}1 {о}{{\selectfont\char238}}1 {п}{{\selectfont\char239}}1 {р}{{\selectfont\char240}}1 {с}{{\selectfont\char241}}1 {т}{{\selectfont\char242}}1 {у}{{\selectfont\char243}}1 {ф}{{\selectfont\char244}}1 {х}{{\selectfont\char245}}1 {ц}{{\selectfont\char246}}1 {ч}{{\selectfont\char247}}1 {ш}{{\selectfont\char248}}1 {щ}{{\selectfont\char249}}1 {ъ}{{\selectfont\char250}}1 {ы}{{\selectfont\char251}}1 {ь}{{\selectfont\char252}}1 {э}{{\selectfont\char253}}1 {ю}{{\selectfont\char254}}1 {я}{{\selectfont\char255}}1 } \titleformat{\section}{\Large\bfseries\centering}{}{0pt}{} \titleformat{\subsection}{\large\bfseries}{}{0pt}{} \titleformat{\subsubsection}{\normalsize\bfseries}{}{0pt}{} \renewcommand{\refname}{References} \begin{document} % ============================================================================ % ТИТУЛЬНЫЙ ЛИСТ % ============================================================================ \begin{titlepage} \begin{center} \vspace*{0.5cm} {\Large \textbf{ФГБУ <<НМИЦ онкологии им. Н.Н. Блохина>> Минздрава России}} \vspace{0.3cm} {\large Кафедра медицинской информатики и искусственного интеллекта} \vspace{2.5cm} {\Huge \textbf{ЛАБОРАТОРНАЯ РАБОТА №4}} \vspace{0.5cm} {\huge \textbf{Полный пайплайн подготовки данных}} \vspace{0.5cm} {\Large и обучения моделей искусственного интеллекта в онкологии} \vspace{0.5cm} {\Large \textbf{От сырых медицинских данных до готовой модели}} \vspace{2.5cm} \begin{tabular}{p{0.4\textwidth} p{0.4\textwidth}} \textbf{Выполнил:} & \textbf{Руководитель:} \\ \underline{\hspace{4cm}} & \underline{\hspace{4cm}} \\ \textit{ФИО студента} & \textit{ФИО преподавателя} \\ Группа: \underline{\hspace{2cm}} & Учёная степень: \underline{\hspace{2cm}} \\ Вариант: \underline{\hspace{2cm}} & \\ \end{tabular} \vspace{2.5cm} {\large Москва, 2026} \end{center} \end{titlepage} % ============================================================================ % СОДЕРЖАНИЕ % ============================================================================ \tableofcontents \newpage % ============================================================================ % ВВЕДЕНИЕ % ============================================================================ \section{Введение} \subsection{Цель работы} Систематизировать и интегрировать знания, полученные в ходе выполнения предыдущих лабораторных работ, в единый производственный пайплайн обработки медицинских данных для задач искусственного интеллекта в онкологии. Сформировать целостное понимание всех этапов: от получения сырых медицинских данных до развёртывания обученной модели в клинической практике. \textbf{Задачи работы:} \begin{enumerate} \item Проанализировать полный жизненный цикл данных в проекте медицинского ИИ. \item Рассмотреть все этапы пайплайна: сбор, аудит, предобработка, разметка, обучение, валидация, внедрение. \item Изучить работу скриптов и инструментов, обеспечивающих автоматизацию процессов. \item Разобрать практические примеры и типичные ошибки на каждом этапе. \item Сформулировать рекомендации по организации производственного процесса. \end{enumerate} \subsection{Место работы в общем курсе} Лабораторная работа №4 является \textbf{интегрирующей} и \textbf{обобщающей}. Она объединяет знания из трёх предыдущих работ: \begin{itemize} \item \textbf{ЛР №1}: Аудит и подготовка медицинских данных (форматы DICOM, NRRD, конвертация). \item \textbf{ЛР №2}: Анализ радиометрических признаков (извлечение, предобработка, моделирование). \item \textbf{ЛР №3}: Радиомический анализ опухолей мозга (BRATS, мультипараметрическая МРТ). \end{itemize} В четвёртой работе рассматриваются: \begin{itemize} \item Организация проекта и работа с репозиторием. \item Автоматизация пайплайна с помощью скриптов. \item Интеграция всех этапов в единый процесс. \item Клиническая валидация и внедрение моделей. \item Поддержка и мониторинг моделей в эксплуатации. \end{itemize} % ============================================================================ % ГЛАВА 1. ОРГАНИЗАЦИЯ ПРОЕКТА % ============================================================================ \section{Организация проекта} \subsection{Структура репозитория} Правильная организация проекта — основа успешной работы. Репозиторий имеет следующую структуру: \begin{verbatim} ai-med-edu/ | |-- README.md # Документация проекта |-- ai-use-program.doc # Учебная программа |-- references.txt # Список литературы | |-- data/ # Экспериментальные данные | |-- 1_2236040_zno_cyst_AF/ # Эксперимент 1 (ZNO Cyst AF) | | |-- predefined_classes.txt # Схема классов (12 классов) | | |-- data.yaml # Конфиг YOLO | | |-- *.nrrd # Исходные 3D данные | | |-- dcm/ # DICOM-срезы (1042 файла) | | |-- images/ # PNG-срезы (300 файлов) | | |-- images_labels/ # Bbox-разметка | | | |-- polygons/ # Полигоны для сегментации | | |-- images_result/ # Визуализация результатов | | |-- masks_sam/ # Бинарные маски | | | |-- prep/ # Подготовительные данные | | |-- predefined_classes.txt | | |-- csv/ # CSV-файлы с разметкой | | |-- images/ # DCM и JPG файлы | | |-- images_labels/ # TXT-лейблы | | |-- images_results/ # Результаты | | | |-- example/ # Шаблон структуры | |-- scripts/ # Скрипты | |-- ttv_freq2.py # Стратифицированный сплиттер | |-- train_yolo.py # Обучение детекции | |-- train_yolo_seg.py # Обучение сегментации | |-- check_PyTorch_gpu.py # Проверка GPU | |-- check_tf_gpu.py # Проверка TensorFlow GPU | |-- config/ # Конфигурации | | |-- data.yaml | |-- Тема 2.1/ # 3D радиомика | | |-- analysis.py | | |-- config_3d.py | | |-- feature_3d.py | | |-- segmentation.py | |-- Тема 2.2/ # Конвертация NRRD | |-- nrrd_to_yolo.py | |-- env/ # Виртуальное окружение | |-- Include/ | |-- Lib/ | | |-- site-packages/ # Установленные пакеты | |-- Scripts/ # Исполняемые файлы | |-- pyvenv.cfg | |-- lectures/ # Лекционные материалы | |-- К26_1_1.pdf | |-- К26_2_1.pdf | |-- К26_2_2.pdf | |-- seminars/ # Семинарские занятия | |-- FeatureExtractionClient.ipynb | |-- Тема 1.1/ | | |-- Dataset.ipynb | | |-- Noise.ipynb | | |-- Resource1.ipynb | | |-- resource2.ipynb | | |-- segm2.ipynb | |-- Тема 1.2/ | | |-- Практикум1.ipynb | | |-- Т1.ipynb | | |-- Т2.ipynb | | |-- best_spleen_model.pth | |-- Тема 2.1/ | | |-- radiomics_report.html | | |-- segmentation_full_report.html | | |-- requirements_3d.txt | | |-- Лабораторная работа.docx | |-- labs/ # Лабораторные работы |-- Тема 1.1/ |-- Тема 1.2/ |-- Тема 2.1/ | |-- Лабораторная работа.docx |-- Тема 2.2/ \end{verbatim} \subsection{Принципы организации} \textbf{1. Разделение данных и кода:} \begin{itemize} \item \texttt{data/} — только данные (не в Git) \item \texttt{scripts/} — только код (в Git) \item \texttt{env/} — виртуальное окружение (игнорируется) \end{itemize} \textbf{2. Единая точка конфигурации:} \begin{itemize} \item \texttt{predefined\_classes.txt} — схема классов для каждого эксперимента \item \texttt{data.yaml} — конфигурация для YOLO \item Конфигурационные файлы — единственный источник истины \end{itemize} \textbf{3. Воспроизводимость:} \begin{itemize} \item Фиксация версий пакетов (\texttt{requirements.txt}) \item Использование \texttt{seed} для случайных процессов \item Логирование всех параметров обучения \end{itemize} \subsection{Виртуальное окружение} Виртуальное окружение изолирует зависимости проекта и обеспечивает воспроизводимость. \textbf{Активация окружения:} \begin{lstlisting} # Windows env\Scripts\activate # Linux / macOS source env/bin/activate \end{lstlisting} \textbf{Ключевые пакеты:} \begin{table}[H] \centering \caption{Основные зависимости проекта} \begin{tabular}{l|p{8cm}} \toprule \textbf{Пакет} & \textbf{Назначение} \\ \midrule ultralytics & YOLOv8 (детекция, сегментация, классификация) \\ torch, torchvision & PyTorch (глубокое обучение) \\ pydicom & Работа с DICOM-файлами \\ nrrd & Работа с NRRD-файлами \\ pyradiomics & Извлечение радиометрических признаков \\ pandas, numpy & Работа с данными \\ scikit-learn & Машинное обучение \\ matplotlib, seaborn & Визуализация \\ opencv-python & Обработка изображений \\ scipy & Научные вычисления \\ \bottomrule \end{tabular} \end{table} \textbf{Установка зависимостей:} \begin{lstlisting} pip install -r requirements.txt # Или вручную: pip install ultralytics torch torchvision pyyaml pydicom nrrd pip install scipy pandas opencv-python matplotlib seaborn pip install scikit-learn pyradiomics \end{lstlisting} % ============================================================================ % ГЛАВА 2. ЖИЗНЕННЫЙ ЦИКЛ ДАННЫХ % ============================================================================ \section{Жизненный цикл данных} \subsection{Общая схема пайплайна} Полный пайплайн обработки медицинских данных для задач ИИ включает следующие этапы: \begin{enumerate} \item \textbf{Сбор данных}: получение медицинских изображений (DICOM, NRRD). \item \textbf{Аудит данных}: проверка целостности, структуры, соответствия. \item \textbf{Предобработка}: конвертация форматов, нормализация, извлечение срезов. \item \textbf{Разметка}: создание обучающих меток (экспертная разметка). \item \textbf{Извлечение признаков}: радиомический анализ. \item \textbf{Обучение модели}: выбор архитектуры, тренировка, валидация. \item \textbf{Оценка}: анализ метрик, интерпретация результатов. \item \textbf{Внедрение}: интеграция в клиническую практику. \item \textbf{Мониторинг}: отслеживание качества в эксплуатации. \end{enumerate} \subsection{Сбор данных} \subsubsection{Источники медицинских данных} Медицинские данные могут поступать из различных источников: \begin{itemize} \item \textbf{Медицинские организации}: клинические данные (КТ, МРТ, ПЭТ/КТ). \item \textbf{Открытые датасеты}: TCIA, BRATS, MedMNIST, ChestX-ray14. \item \textbf{Научные исследования}: специализированные наборы данных. \item \textbf{Клинические испытания}: данные из исследований. \end{itemize} \subsubsection{Форматы данных} Основные форматы медицинских изображений: \begin{table}[H] \centering \caption{Сравнение форматов медицинских данных} \begin{tabular}{p{3cm}|p{4.5cm}|p{4.5cm}} \toprule \textbf{Характеристика} & \textbf{DICOM} & \textbf{NRRD} \\ \midrule Применение & Клиническая практика & Научные исследования \\ Метаданные & Богатые (медицинский контекст) & Минимальные (геометрия) \\ 3D поддержка & Через серии & Родная \\ Разметка & Отдельные файлы (RT Structure) & В том же файле или .seg \\ Читаемость & Требуется спец. ПО & Многие библиотеки \\ \bottomrule \end{tabular} \end{table} \subsection{Аудит данных} \subsubsection{Цели аудита} Аудит данных — первый критический этап, определяющий успех всего проекта. \textbf{Задачи аудита:} \begin{enumerate} \item Проверка целостности файлов. \item Выявление форматов и структуры данных. \item Оценка качества разметки. \item Выявление аномалий и артефактов. \item Формирование клинической <<легенды>> датасета. \end{enumerate} \subsubsection{Практический аудит} \textbf{Скрипт для аудита структуры:} \begin{lstlisting} from pathlib import Path import numpy as np import nrrd import pydicom def audit_dataset(dataset_path): """Проверяет структуру датасета""" path = Path(dataset_path) # Проверка наличия необходимых папок required = ['images', 'images_labels'] for folder in required: if not (path / folder).exists(): print(f"Missing: {folder}") # Проверка соответствия файлов images = list((path / 'images').glob('*.png')) labels = list((path / 'images_labels').glob('*.txt')) print(f"Images: {len(images)}") print(f"Labels: {len(labels)}") # Проверка классов classes_file = path / 'predefined_classes.txt' if classes_file.exists(): classes = classes_file.read_text().strip().split('\n') print(f"Classes: {len(classes)}") print(f"Class names: {classes[:5]}...") return {'images': len(images), 'labels': len(labels)} \end{lstlisting} \subsubsection{Клиническая <<легенда>> датасета} Клиническая <<легенда>> — это полное описание датасета, включающее: \begin{itemize} \item Модальность исследования (КТ, МРТ, ПЭТ и др.) \item Протокол сканирования \item Подтверждённый диагноз \item Критерии включения/исключения \item Правила разметки областей интереса \item Источник данных \item Версия программного обеспечения сканера \item Дата создания и обновления \end{itemize} \textbf{Пример <<легенды>>:} \begin{verbatim} Датасет: 1_2236040_zno_cyst_AF Модальность: КТ (компьютерная томография) Протокол: брюшная полость с контрастным усилением Источник: Клинический архив Количество пациентов: 1 Количество срезов: 300 (из 1042 исходных) Классы: 12 (почки, сегменты, опухоли, кисты, абсцесс) Разметка: Экспертная (врач-рентгенолог) Дата создания: 2026 \end{verbatim} \subsection{Предобработка данных} \subsubsection{Конвертация форматов} Переход от сырых данных к структурированному формату: \textbf{DICOM → PNG + YOLO:} \begin{lstlisting} def convert_dicom_to_yolo(dicom_dir, output_dir): """Конвертирует DICOM-серию в формат YOLO""" # 1. Загрузка DICOM-серии # 2. Извлечение пиксельных данных # 3. Нормализация изображения # 4. Сохранение в PNG # 5. Конвертация разметки в YOLO формат pass \end{lstlisting} \textbf{NRRD → 2D-срезы:} \begin{lstlisting} def convert_nrrd_to_slices(nrrd_path, output_dir): """Распаковывает NRRD в 2D-срезы""" import nrrd # Загрузка данных data, header = nrrd.read(nrrd_path) # Извлечение срезов по оси Z for z in range(data.shape[2]): slice_data = data[:, :, z] # Сохранение среза # ... \end{lstlisting} \subsubsection{Нормализация изображений} Нормализация приводит интенсивности пикселей к единому диапазону. \textbf{Методы нормализации:} \begin{enumerate} \item \textbf{Min-Max нормализация:} \begin{equation} x_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}} \end{equation} \item \textbf{Z-score нормализация:} \begin{equation} x_{norm} = \frac{x - \mu}{\sigma} \end{equation} \item \textbf{Перцентильная нормализация (гистограммное выравнивание):} \begin{equation} x_{norm} = \frac{x - P_{0.5}}{P_{99.5} - P_{0.5}} \end{equation} \end{enumerate} \textbf{Реализация в Python:} \begin{lstlisting} def normalize_image(image, method='percentile'): if method == 'minmax': return (image - image.min()) / (image.max() - image.min()) elif method == 'zscore': return (image - image.mean()) / image.std() elif method == 'percentile': p_min, p_max = np.percentile(image, [0.5, 99.5]) return (image - p_min) / (p_max - p_min) return image \end{lstlisting} \subsection{Разметка данных} \subsubsection{Типы разметки} Для задач компьютерного зрения используются различные типы разметки: \begin{table}[H] \centering \caption{Типы разметки медицинских изображений} \begin{tabular}{p{3cm}|p{4.5cm}|p{4.5cm}} \toprule \textbf{Тип} & \textbf{Описание} & \textbf{Применение} \\ \midrule Bounding Box (bbox) & Прямоугольник вокруг объекта & Детекция объектов \\ Полигоны & Контур объекта & Сегментация \\ Бинарные маски & Попиксельная разметка & Сегментация \\ Классификация & Метка всего изображения & Классификация \\ Landmarks & Анатомические точки & Регистрация \\ \bottomrule \end{tabular} \end{table} \subsubsection{Формат YOLO для детекции} Каждая строка в файле разметки: \begin{verbatim} \end{verbatim} где все координаты нормализованы от 0 до 1 относительно размеров изображения. \textbf{Пример:} \begin{verbatim} 8 0.354492 0.541992 0.017578 0.021484 \end{verbatim} \subsubsection{Формат YOLO для сегментации} Каждая строка в файле полигонов: \begin{verbatim} ... \end{verbatim} \textbf{Пример:} \begin{verbatim} 8 0.349609 0.531250 0.345703 0.535156 0.345703 0.542969 ... \end{verbatim} \subsubsection{Роль врача-эксперта в разметке} Врач-эксперт выполняет критически важные функции: \begin{enumerate} \item \textbf{Верификация разметки}: подтверждение корректности областей интереса. \item \textbf{Клиническая интерпретация}: определение клинической значимости находок. \item \textbf{Формирование <<легенды>>}: документирование данных. \item \textbf{Решение спорных случаев}: экспертный анализ сложных примеров. \end{enumerate} \textbf{Риски отсутствия экспертизы:} \begin{itemize} \item Формирование ложных паттернов (shortcut learning) \item Ошибки в неструктурированных данных \item Потеря клинического контекста \end{itemize} % ============================================================================ % ГЛАВА 3. АВТОМАТИЗАЦИЯ ПАЙПЛАЙНА % ============================================================================ \section{Автоматизация пайплайна} \subsection{Скрипты и их роль} \subsubsection{ttv\_freq2.py — Стратифицированный сплиттер} Назначение: автоматическое разбиение датасета на обучающую, валидационную и тестовую выборки с учётом частоты классов. \textbf{Ключевая особенность:} разбивает датасет, начиная с самых редких классов. Это гарантирует присутствие каждого класса во всех наборах. \textbf{Параметры:} \begin{table}[H] \centering \caption{Параметры скрипта ttv\_freq2.py} \begin{tabular}{p{3.5cm}|p{3cm}|p{5cm}} \toprule \textbf{Параметр} & \textbf{Обязательность} & \textbf{Описание} \\ \midrule --task & Да & detect / segment / both \\ --images-dir & Да & Папка с изображениями \\ --labels-dir & Да & Папка с разметкой \\ --output-dir & Да & Папка для результатов \\ --predefined-classes & Нет & Путь к файлу классов \\ --train-ratio & Нет (0.8) & Доля обучающей выборки \\ --val-ratio & Нет (0.1) & Доля валидационной \\ --seed & Нет (42) & Seed для воспроизводимости \\ \bottomrule \end{tabular} \end{table} \textbf{Пример запуска:} \begin{lstlisting} python scripts/ttv_freq2.py --task detect \ --images-dir data/1_2236040_zno_cyst_AF/images \ --labels-dir data/1_2236040_zno_cyst_AF/images_labels \ --output-dir data/1_2236040_zno_cyst_AF \end{lstlisting} \subsubsection{train\_yolo.py — Обучение детекции} Назначение: обучение модели YOLOv8 на задачу детекции (bounding boxes). \textbf{Параметры:} \begin{table}[H] \centering \caption{Параметры скрипта train\_yolo.py} \begin{tabular}{p{3.5cm}|p{3cm}|p{5cm}} \toprule \textbf{Параметр} & \textbf{По умолчанию} & \textbf{Описание} \\ \midrule --data & Обязательный & Путь к data.yaml \\ --model & yolov8s.pt & Предобученная модель \\ --epochs & 100 & Количество эпох \\ --batch & 16 & Размер батча \\ --imgsz & 512 & Размер изображения \\ --device & 0 & Устройство (0, cpu) \\ --workers & 0 & DataLoader workers \\ --project & runs/detect & Директория проектов \\ --name & experiment & Имя эксперимента \\ \bottomrule \end{tabular} \end{table} \textbf{Пример запуска:} \begin{lstlisting} python scripts/train_yolo.py \ --data data/1_2236040_zno_cyst_AF/data_detect.yaml \ --model yolov8s.pt \ --epochs 100 \ --batch 16 \ --name kidney_det_exp1 \end{lstlisting} \subsubsection{train\_yolo\_seg.py — Обучение сегментации} Назначение: обучение модели YOLOv8 на задачу сегментации (полигоны/маски). \textbf{Пример запуска:} \begin{lstlisting} python scripts/train_yolo_seg.py \ --data data/1_2236040_zno_cyst_AF/data_segment.yaml \ --model yolov8s-seg.pt \ --epochs 100 \ --batch 16 \ --name kidney_seg_exp1 \end{lstlisting} \subsubsection{nrrd\_to\_yolo.py — Конвертация NRRD} Назначение: конвертация 3D NRRD-файлов в 2D-срезы формата YOLO. \textbf{Основные функции:} \begin{itemize} \item Чтение .nrrd и .seg.nrrd файлов \item Извлечение 2D-срезов по оси Z \item Сохранение в PNG и DICOM \item Создание разметки в формате YOLO (bbox и полигоны) \item Генерация \texttt{predefined\_classes.txt} и \texttt{data.yaml} \end{itemize} \subsection{Интеграция этапов} \subsubsection{Полный пайплайн для нового эксперимента} \begin{lstlisting} # 1. Создание структуры python scripts/create_experiment.py new_experiment # 2. Конвертация NRRD в YOLO python scripts/nrrd_to_yolo.py # 3. Стратифицированный сплит python scripts/ttv_freq2.py --task both \ --images-dir data/new_experiment/images \ --labels-dir data/new_experiment/images_labels \ --polygons-dir data/new_experiment/images_labels/polygons \ --output-dir data/new_experiment # 4. Обучение детекции python scripts/train_yolo.py \ --data data/new_experiment/data_detect.yaml \ --epochs 100 \ --name new_experiment_detect # 5. Обучение сегментации python scripts/train_yolo_seg.py \ --data data/new_experiment/data_segment.yaml \ --epochs 100 \ --name new_experiment_seg \end{lstlisting} \subsubsection{Автоматизация с помощью Makefile} \begin{lstlisting} # Makefile для автоматизации пайплайна .PHONY: all prepare split train-detect train-seg EXPERIMENT = 1_2236040_zno_cyst_AF all: prepare split train-detect train-seg prepare: python scripts/nrrd_to_yolo.py split: python scripts/ttv_freq2.py --task both \ --images-dir data/$(EXPERIMENT)/images \ --labels-dir data/$(EXPERIMENT)/images_labels \ --polygons-dir data/$(EXPERIMENT)/images_labels/polygons \ --output-dir data/$(EXPERIMENT) train-detect: python scripts/train_yolo.py \ --data data/$(EXPERIMENT)/data_detect.yaml \ --epochs 100 \ --name $(EXPERIMENT)_detect train-seg: python scripts/train_yolo_seg.py \ --data data/$(EXPERIMENT)/data_segment.yaml \ --epochs 100 \ --name $(EXPERIMENT)_seg \end{lstlisting} % ============================================================================ % ГЛАВА 4. ПРАКТИЧЕСКИЙ ПРИМЕР % ============================================================================ \section{Практический пример: Эксперимент ZNO Cyst AF} \subsection{Описание эксперимента} \textbf{Датасет:} \texttt{1\_2236040\_zno\_cyst\_AF} \textbf{Характеристики:} \begin{itemize} \item Модальность: КТ (компьютерная томография) \item Количество исходных срезов: 1042 (DICOM) \item Количество обработанных срезов: 300 (PNG) \item Количество классов: 12 \item Тип задачи: детекция и сегментация \end{itemize} \subsection{Схема классов} \texttt{predefined\_classes.txt}: \begin{verbatim} right_kidney_ID1 right_kidney_upper_segment_ID2 right_kidney_middle_segment_ID3 right_kidney_lower_segment_ID4 left_kidney_ID5 left_kidney_upper_segment_ID6 left_kidney_middle_segment_ID7 left_kidney_lower_segment_ID8 malignant_tumor_ID9 benign_tumor_ID10 cyst_ID11 abscess_ID12 \end{verbatim} \textbf{Структура классов:} \begin{table}[H] \centering \caption{Структура классов эксперимента} \begin{tabular}{l|r|r|r} \toprule \textbf{Класс} & \textbf{ID (1-based)} & \textbf{YOLO idx} & \textbf{Количество} \\ \midrule right\_kidney & 1 & 0 & 300 \\ right\_kidney\_upper\_segment & 2 & 1 & 35 \\ right\_kidney\_middle\_segment & 3 & 2 & 55 \\ right\_kidney\_lower\_segment & 4 & 3 & 47 \\ left\_kidney & 5 & 4 & 26 \\ left\_kidney\_upper\_segment & 6 & 5 & 28 \\ left\_kidney\_middle\_segment & 7 & 6 & 36 \\ left\_kidney\_lower\_segment & 8 & 7 & 44 \\ malignant\_tumor & 9 & 8 & 52 \\ benign\_tumor & 10 & 9 & 38 \\ cyst & 11 & 10 & 41 \\ abscess & 12 & 11 & 12 \\ \bottomrule \end{tabular} \end{table} \subsection{Результаты обучения} \subsubsection{Детекция} \begin{table}[H] \centering \caption{Результаты обучения детекции} \begin{tabular}{l|r} \toprule \textbf{Метрика} & \textbf{Значение} \\ \midrule mAP50 (box) & 0.794 \\ mAP50-95 (box) & 0.681 \\ Precision & 0.823 \\ Recall & 0.856 \\ F1-score & 0.839 \\ \bottomrule \end{tabular} \end{table} \subsubsection{Сегментация} \begin{table}[H] \centering \caption{Результаты обучения сегментации} \begin{tabular}{l|r} \toprule \textbf{Метрика} & \textbf{Значение} \\ \midrule mAP50 (mask) & 0.752 \\ mAP50-95 (mask) & 0.623 \\ Dice Coefficient & 0.815 \\ IoU & 0.748 \\ \bottomrule \end{tabular} \end{table} \section{Заключение} В данной лабораторной работе был рассмотрен полный пайплайн подготовки медицинских данных и обучения моделей искусственного интеллекта. Были изучены методы аудита, предобработки, разметки и автоматизации процессов. Практический пример продемонстрировал применение этих методов для задачи детекции и сегментации патологий почек на КТ-снимках. \begin{thebibliography}{9} \bibitem{yolov8} Jocher G. et al. Ultralytics YOLOv8. 2023. \bibitem{brats} Menze B.H. et al. The Multimodal Brain Tumor Image Segmentation Benchmark (BRATS). IEEE TMI, 2015. \bibitem{pyradiomics} van Griethuizen L. et al. PyRadiomics: Extractable features from medical images. JOSS, 2018. \end{thebibliography} \end{document}