Files
ai-med-edu/labs/lab#4.tex
T

868 lines
37 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
% ============================================================================
% ЛАБОРАТОРНАЯ РАБОТА №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}
<class_id> <x_center> <y_center> <width> <height>
\end{verbatim}
где все координаты нормализованы от 0 до 1 относительно размеров изображения.
\textbf{Пример:}
\begin{verbatim}
8 0.354492 0.541992 0.017578 0.021484
\end{verbatim}
\subsubsection{Формат YOLO для сегментации}
Каждая строка в файле полигонов:
\begin{verbatim}
<class_id> <x1> <y1> <x2> <y2> ... <xn> <yn>
\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}