11 KiB
E01 Textural Features Blast Pipeline
Постановка задачи
Проверка, насколько интерпретируемые морфометрические, цветовые и текстурные признаки действительно полезны для автоматизированного обнаружения бластных клеток на микроскопических изображениях препаратов крови, если оценка проводится на реальных данных с разметкой объектов, масками и разделением по пациентам.
Предмет проекта
- объектно-уровневая постановка
blast / non-blast; - сравнение признаковых и более сложных моделей на одинаковых данных;
- оценка роли сегментационных масок при извлечении признаков;
- переход от классификации отдельного объекта к анализаторно-ориентированной оценке изображения;
- фиксация ограничений текущих данных и выделение задач, требующих нового корпуса.
Навигация по проекту
- docs/data_audit.md — зафиксированный аудит структуры и качества доступных данных.
- docs/reproducibility_guide.md — подробная инструкция по воспроизводимому запуску
foundation,H1-H5и полного прогона.
Воспроизводимый запуск
Эксперимент организован в виде:
- одного базового блока
foundation; - отдельных блоков
H1-H5по гипотезам; - общего блока
allдля полного последовательного прогона.
Точки входа работают в resumable-режиме:
- если нужные артефакты уже существуют, они валидируются и переиспользуются;
- если какого-то этапа не хватает, пересчитывается только недостающая часть;
- итоговые короткие summary по каждому блоку сохраняются в outputs/reports/hypotheses.
Установка и запуск
Код проверен на CPython 3.12. Для полного прогона требуется около 7 ГБ под выходные артефакты; лучше иметь не менее 10 ГБ свободного места. Исходные изображения и маски в репозиторий не входят.
Из корня проекта создайте окружение и установите зафиксированные зависимости.
Вариант с uv:
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -r requirements.txt
То же самое через стандартный venv и pip:
python3.12 -m venv .venv
./.venv/bin/python -m pip install --upgrade pip
./.venv/bin/python -m pip install -r requirements.txt
Подготовьте два каталога:
data_root— исходные изображения, object detection-разметка иpredefined_classes.txt(использовался оригинальный рабор https://cloud.mail.ru/public/rb2S/BEfYpp1bq);masks_root— копия структуры набора с масками вimages_results/masks_sam(использовался оригинальный набор https://cloud.mail.ru/public/2Tb7/8kMa411XX, это тот же набор, что и первый, только дополненный масками).
Скопируйте шаблон конфигурации и укажите абсолютные пути к этим каталогам:
cp configs/datasets/local_paths.template.json configs/datasets/local_paths.json
{
"data_root": "/absolute/path/to/data",
"masks_root": "/absolute/path/to/data_masks"
}
После этого полный эксперимент и тесты запускаются так:
make all
make test
Команда make repro-check последовательно выполняет оба шага. На чистом
рабочем дереве make all строит foundation, затем H1–H5. При повторном
вызове готовые артефакты проверяются и переиспользуются. Для принудительного
пересчёта всех этапов используйте make all FORCE=1.
Конфигурационный файл не обязателен. Пути можно передать непосредственно:
make all DATA_ROOT=/absolute/path/to/data MASKS_ROOT=/absolute/path/to/data_masks
Или через переменные среды:
export E01_DATA_ROOT=/absolute/path/to/data
export E01_MASKS_ROOT=/absolute/path/to/data_masks
make all
Прогресс можно отслеживать в папке outputs/ — там будут появляться результаты прогона экспериента. Наблюдать за прогрессом можно из второго терминала:
find outputs/crops/mask -type f | wc -l
find outputs/crops/mask_tight -type f | wc -l
du -sh outputs
Ожидаемые конечные количества: 86 250 mask-кропов и 86 166 tight-mask-кропов.
Для непрерывного контроля можно повторять проверку каждые 10 секунд (происходит подсчёт кол-ва файлов в директории outputs/ и подвсёт объёма директории outputs/):
while true; do
clear
date
PID=$(pgrep -f '[r]un_all_hypotheses.py' | head -1)
if [[ -n "$PID" ]]; then
ps -p "$PID" -o pid,etime,%cpu,%mem,state,command
else
echo "Процесс run_all_hypotheses.py не найден"
fi
du -sh outputs
find outputs -type f | wc -l
find outputs -type f -mmin -2 | tail -10
sleep 10
done
Отдельные блоки запускаются командами:
make foundation
make h1
make h2
make h3
make h4
make h5
Результаты запуска
Результаты запуска дополнительно положил в папку на диске, чтобы можно было свериться.
Основной результат полного запуска —
outputs/reports/hypotheses/run_all_hypotheses_summary.md. Численные таблицы
находятся в outputs/tables, предсказания — в outputs/predictions, графики —
в outputs/figures. Для сравнения нового прогона с опубликованным результатом
следует в первую очередь проверить размеры выборок и таблицы
baseline_model_leaderboard.csv, ablation_mask_usage.csv,
ablation_dataset_regimes.csv, image_level_metrics.csv,
patient_level_ranking_metrics.csv и deep_vs_handcrafted.csv.
Прямые entrypoint-скрипты:
- run_foundation.py
- run_h1_interpretable_features.py
- run_h2_mask_effect.py
- run_h3_noise_regimes.py
- run_h4_aggregation.py
- run_h5_deep_vs_handcrafted.py
- run_all_hypotheses.py
Какие скрипты считаются публичными точками входа, а какие внутренними служебными шагами, отдельно описано в scripts/README.md.
Каталоги проекта
configs/— конфигурации запуска; локальные пути к данным задаются черезconfigs/datasets/local_paths.jsonи не коммитятся.data_access/— пояснения по доступу к данным без хранения самих данных в репозитории.docs/— аналитические материалы и аудит данных.notebooks/— исследовательские ноутбуки.outputs/dataset_index/— манифесты пациентов, изображений и объектов.outputs/splits/— зафиксированные patient-level разбиения.outputs/crops/— извлеченные объектные кропы.outputs/features/— таблицы признаков.outputs/checkpoints/— обученные модели.outputs/predictions/— предсказания на object-level и image-level.outputs/figures/иoutputs/tables/— артефакты для статьи и диссертации.outputs/reports/иreports/— промежуточные отчеты и итоговые summary-файлы.src/— основной код проекта.tests/— проверки корректности пайплайна.
Что не попадает в GitHub
В .gitignore вынесены:
- все содержимое
outputs/; - локальное окружение
.venv/и кэш.uv-cache/; - локальный файл путей
configs/datasets/local_paths.json; - служебные и бинарные директории вроде
vendor/; - генерируемые экспортные версии отчетов
reports/*.pdf,reports/*.docx,reports/*.html.
Ключевые рабочие решения
- Основная постановка для текущих данных:
blast vs non-blast, а неlymphoblast vs myeloblast. - Главная единица недопущения утечки: пациент.
- В базовый patient-level протокол входят только
122каталогов с patient id; - Основной сопоставитель объектов: порядок строк в
images_labels/*.txtи индексobj_XXXXв имени маски. - Научная ценность текущего экспериента: воспроизводимая проверка полезности текстурных признаков, влияния масок и реалистичных условий data quality.