Initial commit
This commit is contained in:
@@ -0,0 +1,802 @@
|
||||
# Детализированный план эксперимента 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_<id>_obj_<index>.png`.
|
||||
5. Проверку, что `obj_<index>` совпадает с порядком строк в 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/<subset>/<patient_id>/<image_id>__obj_<id>.png`
|
||||
- `outputs/crops/mask/<subset>/<patient_id>/<image_id>__obj_<id>.png`
|
||||
- `outputs/crops/mask_tight/<subset>/<patient_id>/<image_id>__obj_<id>.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 классификацией и задачей автоматического анализатора.
|
||||
|
||||
Именно это и должно стать центральным результатом первого экспериментального цикла.
|
||||
Reference in New Issue
Block a user