# Детализированный план эксперимента E01 ## 1. Назначение документа Этот документ является рабочим планом первого экспериментального проекта по итогам обзорной статьи о текстурных признаках. Его задача — перевести обзорные выводы статьи в последовательность конкретных программных шагов, артефактов и проверяемых гипотез. План специально разделен на две части: - часть A — то, что можно и нужно делать на доступном локальном наборе данных; - часть B — то, что сохраняется в общем исследовательском замысле, но требует дополнительных данных или дополнительной экспертной разметки. ## 2. Связь с исходным планом статьи Исходный общий план сохранен в [plan/source_article_plan/experiment_plan.md](../../plan/source_article_plan/experiment_plan.md). После анализа реального корпуса данных и структуры разметки уточняется следующая матрица соответствия. | Направление исходного плана | Статус на текущих данных | Что именно можно делать сейчас | Что переносится на будущее | |---|---|---|---| | Интерпретируемый morpho-texture baseline | Полностью применимо | `blast / non-blast`, сравнение `bbox` и `mask`, patient-level оценка, интерпретация признаков | `lymphoblast / myeloblast` | | Гибридная модель для малого объема данных и доменного сдвига | Частично применимо | внутреннее сравнение признаковых и легких deep-моделей, low-data режимы внутри одного корпуса | полноценный cross-dataset transfer и внешняя валидация | | Интерпретируемые deep и transformer-подобные модели | Частично применимо | ограниченные object-level deep baselines на текущем корпусе | подтипизация бластов, MIL с case-level метками, сильная интерпретация по экспертным ROI | | Анализаторно-ориентированная slide-level схема | Частично применимо | image-level агрегирование как приближение к задаче анализатора | истинный slide-level и case-level workflow | ## 3. Главная научная цель текущего этапа На текущем корпусе нужно строго проверить следующую гипотезу: Компактный и интерпретируемый набор морфометрических, цветовых и текстурных признаков, извлеченных из объектов detection-разметки и сегментационных масок, способен обеспечить устойчивое различение `blast / non-blast` на данных разных пациентов и дать практически полезный уровень image-level агрегирования для задач автоматического анализатора. ## 4. Ограничения текущих данных Перед реализацией кода нужно принять следующие ограничения как часть постановки, а не как технические мелочи: 1. В разметке отсутствует разделение `lymphoblast` и `myeloblast`; следовательно, текущий эксперимент не может служить доказательством для подтипизации бластов. 2. Основной надежный уровень оценки — пациент, а не объект и не изображение. 3. В разметке присутствуют классы качества и артефактов (`Bad cells`, `artifacts`, `gumpricht shadows`), которые нельзя механически смешивать с морфологически корректными клетками без отдельного протокола. 4. Маски покрывают почти весь корпус, но не полностью; нужна двухветочная логика `mask-aware` и `bbox-only fallback`. 5. Часть label-файлов содержит class id в формате `float`, следовательно, парсер должен явно использовать преобразование `int(float(raw_class_id))`. 6. В сыром каталоге присутствует специальная директория `part-1`, не соответствующая формату patient id; до уточнения ее происхождения она должна быть исключена из основного patient-level протокола и рассматриваться только как возможный вспомогательный корпус. ## 5. Рабочая схема проекта Рекомендуется реализовать эксперимент не как один скрипт, а как последовательность самостоятельных этапов с фиксированными артефактами: 1. Индексация и аудит данных. 2. Формирование канонических разбиений по пациентам. 3. Извлечение объектов и ROI. 4. Вычисление признаков. 5. Обучение признаковых моделей. 6. Ограниченные deep baselines. 7. Image-level агрегирование. 8. Подготовка таблиц, графиков и воспроизводимых отчетов. ## 6. Часть A. Эксперименты, которые можно сделать на текущих данных ### A0. Подготовка проектного контракта данных #### Цель Зафиксировать единый источник истины по пациентам, изображениям, объектам, маскам и классам. #### Входы - `data` - `data_masks` Для первой фазы основным корпусом считаются только `122` каталогов, которые имеют формат patient id. Директория `part-1` должна индексироваться отдельно и не должна автоматически попадать в основное разбиение. #### Что нужно реализовать 1. Парсер patient-каталогов. 2. Парсер `predefined_classes.txt`. 3. Парсер detection-разметки с нормализацией `int(float(class_id))`. 4. Парсер масок `*_class__obj_.png`. 5. Проверку, что `obj_` совпадает с порядком строк в label-файле. #### Выходные артефакты - `outputs/dataset_index/patient_inventory.csv` - `outputs/dataset_index/image_index.parquet` - `outputs/dataset_index/object_index.parquet` - `outputs/dataset_index/class_mapping.json` - `outputs/dataset_index/mask_coverage_report.csv` - `outputs/reports/data_audit_runtime.md` #### Требования к `object_index` Каждая строка должна содержать как минимум: - `patient_id` - `image_id` - `image_path` - `label_path` - `mask_path` или `null` - `object_id_within_image` - `class_id` - `class_name` - `x_center_norm` - `y_center_norm` - `width_norm` - `height_norm` - `has_mask` - `is_blast` - `is_quality_or_artifact` #### Критерий завершения этапа Артефакт `object_index.parquet` воспроизводимо пересобирается и полностью описывает весь текущий корпус. #### Проверяемые результаты этапа - построен единый индекс пациентов, изображений и объектов для основного patient-level корпуса; - для каждого объекта однозначно определены `class_id`, `class_name`, координаты bbox, признак `is_blast` и наличие маски; - построен отчет о покрытии масками и обо всех найденных несоответствиях между `data` и `data_masks`; - зафиксирована отдельная запись о специальном каталоге `part-1`, который не смешивается с основным patient-level корпусом. #### Как оценить качество результата - число пациентских каталогов, изображений, label-файлов и объектов совпадает с зафиксированными значениями из [docs/data_audit.md](../../docs/data_audit.md); - доля объектов без `class_name`, bbox-координат или `patient_id` равна `0`; - все пути `image_path`, `label_path`, `mask_path` валидны на файловой системе; - нет дубликатов по ключу `patient_id + image_id + object_id_within_image`; - отчет `mask_coverage_report.csv` позволяет отдельно проверить случаи без масок, пустые label-файлы и исключенный каталог `part-1`. #### Предлагаемые модули кода - `src/dataset/build_index.py` - `src/dataset/parse_detection_labels.py` - `src/dataset/parse_masks.py` - `src/dataset/class_mapping.py` - `tests/test_dataset_index.py` ### A1. Формирование аналитических подмножеств #### Цель Развести разные исследовательские режимы, чтобы не смешивать клинически осмысленную задачу распознавания клеток и задачу устойчивости к плохому качеству и артефактам. #### Подмножества, которые нужно сформировать 1. `full_realistic_set` Используются все объекты, включая `Bad cells`, `artifacts` и `gumpricht shadows`. 2. `clean_cell_set` Исключаются только `Bad cells` и `artifacts`. Объем по текущей оценке для основного patient-level корпуса: `78 517` объектов. 3. `strict_morphology_set` Исключаются `Bad cells`, `artifacts` и `gumpricht shadows`. Объем по текущей оценке для основного patient-level корпуса: `74 917` объектов. 4. `mask_ready_set` Объекты, у которых есть валидная маска. #### Почему это важно - `full_realistic_set` нужен для анализаторно-ориентированной постановки. - `clean_cell_set` нужен для более честной оценки распознавания клеток. - `strict_morphology_set` нужен для сравнения текстурных и морфометрических признаков без сильного влияния шумовых классов. #### Выходные артефакты - `outputs/dataset_index/subset_full_realistic.parquet` - `outputs/dataset_index/subset_clean_cell.parquet` - `outputs/dataset_index/subset_strict_morphology.parquet` - `outputs/dataset_index/subset_mask_ready.parquet` #### Критерий завершения этапа Для каждого подмножества автоматически строится таблица распределения классов по пациентам и объектам. #### Проверяемые результаты этапа - сформированы четыре формальные версии корпуса с прозрачными правилами включения и исключения объектов; - для каждого подмножества рассчитаны размеры, class distribution и patient coverage; - зафиксировано, какие именно классы и в каком объеме исключаются при переходе от `full_realistic_set` к `clean_cell_set` и `strict_morphology_set`. #### Как оценить качество результата - в `clean_cell_set` отсутствуют классы `Bad cells` и `artifacts`; - в `strict_morphology_set` дополнительно отсутствует класс `gumpricht shadows`; - число объектов в подмножествах строго совпадает с фильтрационными правилами; - построенная таблица распределения позволяет проверить, что ни одно подмножество не потеряло пациентов или изображения неожиданным образом; - для `mask_ready_set` отдельно оценивается доля покрытия масками и список исключенных объектов. ### A2. Построение patient-level разбиений #### Цель Исключить утечку информации между выборками и подготовить единый протокол оценки для всех моделей. #### Основные правила 1. Один пациент может входить только в один из наборов `train`, `validation`, `test`. 2. Все модели должны использовать одни и те же финальные разбиения. 3. Внутренняя настройка гиперпараметров должна происходить только внутри train-части. 4. В базовом протоколе участвуют только `122` patient-идентифицированных каталога; `part-1` в это разбиение не входит. #### Рекомендуемый протокол 1. Финальный внешний hold-out по пациентам: - `70%` пациентов — train; - `15%` пациентов — validation; - `15%` пациентов — test. 2. Внутри train: - `StratifiedGroupKFold` или собственная стратификация по доле `blast` у пациента; - минимум `5` повторов для признаковых моделей. #### Дополнительные таблицы для стратификации Нужно посчитать для каждого пациента: - число объектов; - число `blast`; - долю `blast`; - число изображений; - число изображений с `blast`; - долю объектов без масок. #### Выходные артефакты - `outputs/splits/patient_summary.csv` - `outputs/splits/split_v1.json` - `outputs/splits/split_v1_train_patients.txt` - `outputs/splits/split_v1_val_patients.txt` - `outputs/splits/split_v1_test_patients.txt` - `outputs/tables/class_distribution_by_split.csv` #### Критерий завершения этапа Разбиение стабильно, воспроизводимо и используется далее без ручных корректировок. #### Проверяемые результаты этапа - сформирован единый `split_v1`, используемый всеми последующими моделями; - для каждого пациента определена принадлежность к `train`, `validation` или `test`; - рассчитана таблица стратификации по числу объектов, числу `blast`, доле `blast` и числу изображений; - сохранены текстовые списки пациентов и JSON-описание разбиения. #### Как оценить качество результата - пересечение множеств пациентов между `train`, `validation` и `test` равно `0`; - распределение класса `blast` и размера выборки между частями разбиения не содержит грубых перекосов; - при повторной сборке с тем же `random_state` получается идентичный `split_v1`; - `part-1` отсутствует во всех split-файлах; - таблица `class_distribution_by_split.csv` позволяет отдельно проверить баланс по объектам и по пациентам. #### Предлагаемые модули кода - `src/dataset/build_patient_summary.py` - `src/dataset/make_group_splits.py` - `tests/test_group_split_no_leakage.py` ### A3. Извлечение object-level кропов и областей интереса #### Цель Подготовить единое представление объекта для разных семейств признаков и моделей. #### Нужно реализовать три режима ROI 1. `bbox_crop` Прямоугольный кроп по YOLO-рамке. 2. `mask_crop` Кроп по bounding box объекта, внутри которого пиксели вне маски зануляются или заменяются фоном. 3. `mask_tight_crop` Плотный кроп по минимальному прямоугольнику маски. #### Дополнительные решения 1. Зафиксировать размер выходного изображения для deep baselines, например `224x224`. 2. Для признаковых моделей хранить и исходный масштаб, и нормализованную версию. 3. Сохранять метаданные о масштабировании и паддинге. #### Выходные артефакты - `outputs/crops/bbox///__obj_.png` - `outputs/crops/mask///__obj_.png` - `outputs/crops/mask_tight///__obj_.png` - `outputs/crops/roi_manifest.parquet` #### Контроль качества Нужно автоматически проверять: - что число экспортированных объектов совпадает с ожидаемым числом строк индекса; - что геометрия кропа не выходит за пределы исходного изображения; - что объект с маской действительно имеет ненулевую площадь маски. #### Проверяемые результаты этапа - экспортированы три согласованные версии ROI: `bbox_crop`, `mask_crop`, `mask_tight_crop`; - построен единый `roi_manifest.parquet`, связывающий исходный объект, пути к кропам, размеры ROI и режим подготовки; - сформирован отчет о неэкспортированных или проблемных ROI. #### Как оценить качество результата - число `bbox_crop` совпадает с числом объектов выбранного подмножества; - число `mask_crop` и `mask_tight_crop` совпадает с числом объектов, у которых есть валидная маска; - доля кропов с выходом за границы, нулевой площадью маски или битыми изображениями равна `0`; - по визуальной выборке можно проверить, что bbox- и mask-кропы действительно содержат нужный объект, а не соседние клетки; - `roi_manifest.parquet` позволяет автоматически сравнивать количество исходных объектов и количество реально экспортированных ROI. #### Предлагаемые модули кода - `src/preprocessing/extract_bbox_crops.py` - `src/preprocessing/extract_mask_crops.py` - `src/preprocessing/image_io.py` - `tests/test_crop_extraction.py` ### A4. Базовая объектная постановка `blast / non-blast` #### Цель Получить строгий и воспроизводимый baseline, который напрямую отвечает на главный вопрос статьи: полезны ли текстурные признаки в условиях реальных данных и patient-level оценки. #### Основная целевая переменная - `target_binary = 1`, если `class_id == 7`; - `target_binary = 0` для остальных объектов выбранного подмножества. #### Какие версии задачи нужно решить 1. `Task A4.1` `blast / non-blast` на `clean_cell_set`. 2. `Task A4.2` `blast / non-blast` на `strict_morphology_set`. 3. `Task A4.3` `blast / everything_else` на `full_realistic_set`. Последняя постановка особенно важна для автоматического анализатора, потому что она показывает устойчивость модели к артефактам и классам плохого качества. #### Артефакты - `outputs/dataset_index/task_a41_clean_binary.parquet` - `outputs/dataset_index/task_a42_strict_binary.parquet` - `outputs/dataset_index/task_a43_full_realistic_binary.parquet` - `outputs/tables/task_prevalence_summary.csv` - `outputs/reports/task_definition_report.md` #### Проверяемые результаты этапа - подготовлены три бинарные постановки с явно определенной целевой переменной; - для каждой постановки рассчитаны числа `blast`, `non-blast`, доля положительного класса и список hard-negative классов; - зафиксировано, какие именно задачи используются для дальнейшего сравнения моделей. #### Как оценить качество результата - во всех трех файлах задача `blast / non-blast` формируется строго по правилу `class_id == 7`; - `task_prevalence_summary.csv` позволяет проверить дисбаланс классов и сложность каждой постановки; - во всех постановках сохраняется patient-level совместимость со `split_v1`; - по отчету `task_definition_report.md` можно проверить, какие классы формируют трудные отрицательные примеры и насколько различаются режимы `clean`, `strict` и `full_realistic`. ### A5. Вычисление признаков #### Семейства признаков, которые нужно реализовать 1. Морфометрические признаки: - площадь bbox; - площадь маски; - периметр маски; - круглотность; - эксцентриситет; - отношение площади маски к площади bbox; - характеристики контура. 2. Цветовые признаки: - средние и стандартные отклонения по каналам RGB; - признаки в HSV и Lab; - цветовые квантили; - показатели цветовой неоднородности. 3. Текстурные признаки: - GLCM и признаки Харалика; - LBP; - статистики градиента; - признаки Лапласиана; - фрактальные или мульти-масштабные показатели; - вейвлет-признаки; - спектральные признаки Фурье при необходимости. #### Режимы расчета признаков 1. по `bbox_crop`; 2. по `mask_crop`; 3. комбинированно `bbox + mask features`. #### Выходные артефакты - `outputs/features/features_bbox.parquet` - `outputs/features/features_mask.parquet` - `outputs/features/features_combined.parquet` - `outputs/features/feature_dictionary.md` - `outputs/tables/feature_missingness.csv` - `outputs/reports/feature_extraction_qc.md` #### Проверяемые результаты этапа - для каждого объекта вычислены формальные морфометрические, цветовые и текстурные признаки; - построены три согласованные матрицы признаков: `bbox`, `mask`, `combined`; - сформирован словарь признаков с их определениями и зоной вычисления; - построен отчет о пропусках, константных признаках и аномальных значениях. #### Как оценить качество результата - число строк в матрицах признаков совпадает с числом объектов соответствующего режима; - доля пропусков по каждому признаку рассчитана и явно зафиксирована; - константные и вырожденные признаки отделены от рабочих признаков; - можно проверить диапазоны значений, число признаков каждого семейства и различия между `bbox`, `mask` и `combined`; - `feature_extraction_qc.md` должен позволять быстро увидеть, какие признаки нужно удалить или стандартизовать до обучения моделей. #### Предлагаемые модули кода - `src/features/extract_morphology.py` - `src/features/extract_color.py` - `src/features/extract_texture_glcm.py` - `src/features/extract_texture_lbp.py` - `src/features/extract_texture_wavelet.py` - `src/features/feature_registry.py` - `tests/test_feature_shapes.py` ### A6. Признаковые baseline-модели #### Цель Сравнить информативность разных наборов признаков до подключения сложных нейросетевых архитектур. #### Последовательность моделей 1. Logistic Regression 2. Linear SVM 3. RBF SVM 4. Random Forest 5. XGBoost или LightGBM #### Для каждой модели нужно сравнить 1. только морфометрию; 2. только цвет; 3. только текстуру; 4. морфометрия + цвет; 5. морфометрия + текстура; 6. цвет + текстура; 7. полный набор признаков. #### Метрики Основные: - PR-AUC; - ROC-AUC; - balanced accuracy; - macro-F1; - recall для класса `blast`; - specificity; - Matthews correlation coefficient. Дополнительные: - calibration error; - Brier score; - доверительные интервалы по повторам разбиения. #### Артефакты - `outputs/tables/object_level_metrics_baselines.csv` - `outputs/tables/feature_group_ablation.csv` - `outputs/predictions/object_level_baseline_predictions.parquet` - `outputs/figures/pr_curves_baselines.png` - `outputs/figures/roc_curves_baselines.png` - `outputs/tables/baseline_model_leaderboard.csv` - `outputs/figures/confusion_matrix_best_baseline.png` #### Проверяемые результаты этапа - обучены все запланированные признаковые baseline-модели на одинаковом `split_v1`; - получена таблица метрик по каждой модели и каждому режиму признаков; - построен лидерборд лучших моделей и лучший baseline для дальнейших абляций; - сохранены object-level вероятности и классовые предсказания для последующего image-level агрегирования. #### Как оценить качество результата - в `object_level_metrics_baselines.csv` присутствуют все основные метрики и доверительные интервалы; - `baseline_model_leaderboard.csv` позволяет проверить, какая комбинация `модель + режим признаков + subset` действительно лучшая; - по confusion matrix и PR/ROC-кривым можно проверить не только среднее качество, но и характер ошибок; - отдельно оценивается recall класса `blast`, так как именно он является клинически критичным. ### A7. Отбор признаков и интерпретация #### Цель Показать не только качество, но и морфологический смысл решения. #### Что нужно проверить 1. Устойчивость ranking признаков между разными фолдами. 2. Согласованность ranking между моделями. 3. Какие именно признаки стабильно усиливают разделение `blast / non-blast`. #### Рекомендуемые методы - permutation importance; - SHAP для деревьев и бустинга; - регуляризованные линейные модели; - повторяемый отбор признаков с подсчетом частоты выбора. #### Артефакты - `outputs/tables/top_features_stability.csv` - `outputs/figures/shap_summary_top_model.png` - `outputs/figures/feature_importance_stability.png` - `reports/feature_interpretation_notes.md` #### Проверяемые результаты этапа - получен устойчивый ranking наиболее информативных признаков; - зафиксирована повторяемость top-признаков между фолдами и между моделями; - для лучшей модели построены интерпретационные диаграммы и текстовые пояснения. #### Как оценить качество результата - `top_features_stability.csv` позволяет проверить частоту появления признака в top-N списках разных запусков; - по SHAP и permutation importance можно сравнить, совпадает ли ранжирование между разными методами интерпретации; - в `feature_interpretation_notes.md` должно быть указано, какие признаки имеют ясный морфологический смысл и какие остаются только статистически значимыми; - результат считается сильным, если ключевые признаки не меняются хаотично от фолда к фолду. #### Практический результат Этот этап должен дать содержательные формулировки для статьи и диссертации: какие текстурные и морфометрические свойства чаще всего ассоциированы с бластными объектами в данном корпусе. ### A8. Абляции по роли маски и шумовых классов #### Цель Отдельно проверить, дают ли маски и разные режимы очистки корпуса заметный прирост качества. #### Обязательные абляции 1. `bbox-only` против `mask-only`. 2. `mask-only` против `bbox + mask`. 3. `clean_cell_set` против `strict_morphology_set`. 4. `strict_morphology_set` против `full_realistic_set`. 5. обучение на полном дисбалансном наборе против обучения с class weights. 6. обучение на полном признаковом наборе против отбора признаков. #### Артефакты - `outputs/tables/ablation_mask_usage.csv` - `outputs/tables/ablation_dataset_regimes.csv` - `outputs/figures/ablation_summary.png` #### Проверяемые результаты этапа - измерен вклад масок в качество модели; - измерено влияние очистки корпуса и включения шумовых классов; - зафиксированы различия между полным набором признаков и урезанными вариантами; - отдельно проверено влияние class weights и feature selection. #### Как оценить качество результата - `ablation_mask_usage.csv` должен показывать прирост или потерю качества при переходе между `bbox`, `mask` и `bbox+mask`; - `ablation_dataset_regimes.csv` должен показывать, насколько ухудшается качество в более реалистичном `full_realistic_set`; - итоговая фигура `ablation_summary.png` должна позволять быстро увидеть самые важные факторы изменения качества; - результат считается убедительным, если различия интерпретируемы и воспроизводимы, а не случайны в пределах погрешности. ### A9. Ограниченные deep baselines на текущем корпусе #### Цель Не строить сразу сложную нейросетевую историю, а получить честную точку сравнения для признаковых моделей на том же split и тех же данных. #### Что можно делать уже сейчас 1. Легкая CNN на `bbox_crop`. 2. Та же CNN на `mask_crop`. 3. CNN + tabular late fusion на объединенных признаках. #### Что нельзя обещать на этом этапе - убедительное сравнение с сильными трансформерными моделями из литературы; - выводы о подтипизации бластов; - выводы о переносимости на другие лаборатории. #### Артефакты - `outputs/tables/deep_vs_handcrafted.csv` - `outputs/predictions/object_level_deep_predictions.parquet` - `outputs/checkpoints/cnn_bbox_best.pt` - `outputs/checkpoints/cnn_mask_best.pt` - `outputs/logs/cnn_training_history.json` - `outputs/figures/deep_training_curves.png` #### Проверяемые результаты этапа - обучены ограниченные deep baselines на тех же patient-level split, что и признаковые модели; - получено прямое сравнение `handcrafted`, `deep` и `late fusion`; - сохранены лучшие checkpoint-файлы и история обучения. #### Как оценить качество результата - `deep_vs_handcrafted.csv` позволяет сравнить качество deep-подходов с лучшим признаковым baseline на одних и тех же данных; - по `deep_training_curves.png` можно проверить переобучение, недообучение и устойчивость обучения; - по `cnn_training_history.json` можно оценить число эпох до сходимости, лучшую эпоху и разрыв между train и validation; - deep-этап считается полезным, если он дает либо измеримый прирост качества, либо честно показывает, что в текущем low-complexity режиме интерпретируемые признаки не уступают легкой CNN. ### A10. Анализаторно-ориентированное image-level агрегирование #### Цель Сделать переход от классификации отдельного объекта к постановке, более близкой к автоматическому анализатору: содержит ли изображение хотя бы один вероятный бласт и насколько высоко модель ранжирует такие изображения. #### Доступные сейчас постановки 1. `image_contains_blast` Изображение считается положительным, если среди его объектов есть хотя бы один `blast`. 2. `top_k_image_ranking` Изображения сортируются по максимальному или агрегированному blast-score объектов. 3. `patient_risk_score` Для пациента агрегируется статистика по всем изображениям: - максимум blast-score; - доля изображений с blast-score выше порога; - средний score по top-K объектам. #### Способы агрегирования, которые нужно сравнить 1. `max object score`; 2. `mean top-3 scores`; 3. `count of objects above threshold`; 4. `soft noisy-or`. #### Метрики - image-level PR-AUC; - image-level recall при фиксированной доле ложных тревог; - patient-level sensitivity; - top-K recall для изображений с бластами. #### Почему это важно Этот этап лучше всего связывает текущие данные со статьей и будущей диссертацией: даже не имея настоящих slide-level меток, мы уже можем проверить, насколько object-level модель пригодна как подсистема отбора подозрительных изображений для анализатора. #### Артефакты - `outputs/tables/image_level_metrics.csv` - `outputs/tables/patient_level_ranking_metrics.csv` - `outputs/predictions/image_level_scores.parquet` - `outputs/predictions/patient_level_scores.parquet` - `outputs/figures/image_ranking_recall_curve.png` - `outputs/figures/patient_ranking_curve.png` #### Проверяемые результаты этапа - object-level модель переведена в image-level и patient-level постановку; - рассчитаны image-level и patient-level score для всех объектов наблюдения; - определен лучший способ агрегирования object scores для анализаторно-ориентированного сценария. #### Как оценить качество результата - `image_level_metrics.csv` позволяет сравнить разные способы агрегирования по PR-AUC и recall при ограниченной ложной тревоге; - `patient_level_ranking_metrics.csv` позволяет оценить, насколько хорошо пациент с бластами поднимается в верх ранжированного списка; - `image_ranking_recall_curve.png` и `patient_ranking_curve.png` позволяют визуально проверить пригодность модели для предварительного отбора подозрительных изображений и пациентов; - этап считается особенно успешным, если даже простой object-level baseline обеспечивает высокое top-K покрытие изображений и пациентов с бластами. ### A11. Минимальный набор визуализаций для статьи и диссертации #### Нужно подготовить 1. Схему пайплайна обработки данных. 2. Таблицу классов и объема корпуса. 3. Примеры `bbox_crop` и `mask_crop`. 4. График покрытия масками. 5. Таблицы baseline-метрик. 6. График устойчивости top-признаков. 7. Схему image-level агрегирования. #### Артефакты - `outputs/figures/pipeline_overview.png` - `outputs/figures/example_rois.png` - `outputs/figures/mask_coverage.png` - `outputs/tables/dataset_summary.csv` - `outputs/tables/figure_manifest.csv` - `outputs/tables/table_manifest.csv` #### Проверяемые результаты этапа - подготовлен минимально достаточный комплект иллюстраций и таблиц для статьи и диссертации; - каждая фигура и таблица привязана к конкретному этапу эксперимента и конкретному исходному файлу; - оформлен список всех визуальных артефактов, которые можно использовать при написании текста работы. #### Как оценить качество результата - по `figure_manifest.csv` и `table_manifest.csv` можно проверить полноту пакета визуализаций; - каждая таблица должна совпадать по числам с соответствующими CSV-артефактами модели и данных; - каждая фигура должна строиться воспроизводимо из проектных данных, а не вручную; - итоговый комплект считается достаточным, если по нему уже можно собирать разделы статьи, главы диссертации и презентационные материалы без дополнительного пересчета результатов. ## 7. Часть B. Эксперименты, требующие дополнительных данных ### B1. Разделение лимфобластов и миелобластов Для этой постановки обязательно нужен новый корпус или доразметка текущего корпуса, где класс `blast` будет разделен минимум на: - `lymphoblast`; - `myeloblast`; - при необходимости `ambiguous blast-like`. Только после этого можно переносить на практику исходную гипотезу статьи о class-specific текстурных различиях лимфобластов и миелобластов. ### B2. Полноценный эксперимент по доменному сдвигу Нужны данные хотя бы из еще одного источника: - другая лаборатория; - другой сканер; - другая методика окраски; - другой режим подготовки препаратов. Тогда можно сравнивать: - handcrafted only; - deep only; - hybrid. И только в этом случае будет корректно обсуждать устойчивость к междоменному переносу. ### B3. Slide-level и case-level постановка Чтобы реализовать сильную анализаторно-ориентированную схему, требуются: - полноценные slide-level метки; - case-level клинические метки; - желательно информация о конечном диагнозе или наличии резидуальных бластов на уровне случая. Без этого текущий этап может дать только image-level приближение. ### B4. Экспертная клиническая интерпретация Для глубоких моделей и усиленной интерпретации нужны: - ручные контуры ядра и цитоплазмы; - выделение нуклеол; - при AML — специальные признаки типа палочек Ауэра; - экспертная blinded-оценка областей, на которые опирается модель. ### B5. Продвинутые deep и MIL-схемы Полноценные transformer-подобные модели, MIL, weak supervision и причинно-структурные архитектуры имеет смысл выносить в отдельный этап только после того, как будет завершен и воспроизводимо оформлен этап A. ## 8. Приоритеты реализации Код следует писать именно в таком порядке: 1. `A0` — индексация и аудит. 2. `A1` — аналитические подмножества. 3. `A2` — patient-level split. 4. `A3` — извлечение ROI. 5. `A5` — вычисление признаков. 6. `A6` — признаки и baseline-модели. 7. `A7` — интерпретация признаков. 8. `A8` — абляции. 9. `A10` — image-level агрегирование. 10. `A9` — ограниченные deep baselines. Такой порядок выбран специально: сначала нужно получить строго воспроизводимый, интерпретируемый и диссертационно полезный baseline, а уже потом усложнять модельную часть. ## 9. Минимальный первый кодовый спринт Чтобы начать реализацию немедленно, первым спринтом нужно закрыть следующие задачи: 1. Написать сборщик `object_index`. 2. Зафиксировать patient-level split. 3. Реализовать экспорт `bbox_crop` и `mask_crop`. 4. Реализовать первый набор признаков: - площадь; - периметр; - компактность; - RGB-статистики; - GLCM; - LBP. 5. Обучить Logistic Regression и Random Forest на `clean_cell_set`. 6. Построить первые object-level и image-level метрики. Именно после этого спринта в проекте уже появится рабочая база, на которую можно последовательно наращивать остальной код. ## 10. Что этот эксперимент даст для статьи и диссертации Если этап A будет выполнен качественно, то он уже сам по себе даст: - воспроизводимую оценку роли текстурных признаков; - сравнение признаковых режимов `bbox`, `mask`, `bbox+mask`; - практический аргумент в пользу patient-level протокола; - прикладную картину влияния шумовых классов и качества разметки; - bridge-результат между object-level классификацией и задачей автоматического анализатора. Именно это и должно стать центральным результатом первого экспериментального цикла.