Initial commit: project structure, scripts and documentation

This commit is contained in:
2026-08-22 13:17:29 +03:00
commit 5042305df0
54 changed files with 14166 additions and 0 deletions
+868
View File
@@ -0,0 +1,868 @@
% ============================================================================
% ЛАБОРАТОРНАЯ РАБОТА №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}