868 lines
37 KiB
TeX
868 lines
37 KiB
TeX
% ============================================================================
|
||
% ЛАБОРАТОРНАЯ РАБОТА №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} |