Files
E01_textural_features_blast…/docs/data_audit.md
T

212 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Аудит данных для E01
Документ фиксирует фактическое состояние доступных для экспериемнта данных.
## 1. Источники данных
- `data` — исходные изображения и object detection-разметка.
- `data_masks` — те же данные с дополнительными масками объектов в `images_results/masks_sam`.
## 2. Структура одного пациентского каталога
Для большинства пациентов в `data` используется одинаковая структура:
- `images/` — исходные изображения;
- `images_labels/` — текстовые файлы разметки объектов;
- `predefined_classes.txt` — словарь классов.
В `data_masks` для тех же пациентов дополнительно присутствует каталог:
- `images_results/masks_sam/` — маски отдельных объектов в формате `stem_class_<class_id>_obj_<index>.png`.
Отдельно нужно зафиксировать специальный случай:
- в корне обоих наборов присутствует каталог `part-1`, который не соответствует формату пациентского идентификатора;
- в нем находится `33` изображения, `33` label-файла и `477` размеченных объектов;
- в `data_masks` для него есть `475` масок;
- до уточнения происхождения этого каталога его не следует включать в основной patient-level протокол.
## 3. Проверенные количественные характеристики
### 3.1. Общий объем
Для воспроизводимости нужно различать:
- полный сырой объем каталога;
- основной patient-level корпус, который используется в эксперименте.
Полный сырой объем:
- число каталогов верхнего уровня в `data`: `123`;
- число каталогов верхнего уровня в `data_masks`: `123`;
- среди них `122` пациент-идентифицированных каталогов и один специальный каталог `part-1`;
- число изображений: `12 521`;
- число файлов разметки: `12 489`;
- число объектов по detection-разметке: `86 873`.
Основной patient-level корпус, рекомендуемый для первой фазы эксперимента:
- число пациентских каталогов: `122`;
- число изображений: `12 488`;
- число файлов разметки: `12 456`;
- число объектов по detection-разметке: `86 396`.
### 3.2. Наблюдения по разметке
- пустых файлов разметки: `26`;
- изображений без `.txt`-разметки: `32`;
- такие изображения встречаются только у пациентов `P190315.002` и `P190408.001`;
- файлов разметки без соответствующего изображения не обнаружено;
- в `4 991` строках файлов разметки идентификатор класса записан в формате с плавающей точкой, например `7.0`; при загрузке нужно использовать нормализацию `int(float(class_id))`.
### 3.3. Наблюдения по маскам
- всего масок объектов в основном patient-level корпусе: `86 360`;
- изображений, для которых есть хотя бы одна маска: `12 428`;
- изображений без масок: `60`;
- пациентов, у которых есть изображения без масок: `15`.
Из этих `60` изображений:
- `32` совпадают с изображениями без detection-разметки;
- остальные `28` изображений имеют разметку, но не имеют полного покрытия масками.
### 3.4. Проверка соответствия labels и masks
Для изображений, у которых число строк в `images_labels/*.txt` совпадает с числом файлов `*_obj_XXXX.png`, было проверено соответствие классов и порядка объектов.
Результат:
- проверено изображений: `12 395`;
- изображений с полным совпадением порядка объектов: `12 395`;
- изображений с нарушением последовательности `obj_0000, obj_0001, ...`: `0`;
- изображений с несовпадением классов между строкой label-файла и именем маски: `0`.
Это позволяет принять следующий контракт данных: индекс `obj_XXXX` соответствует порядку строки в detection-разметке.
## 4. Словарь классов
Основной словарь классов совпадает у `122` пациентов:
| id | Класс |
|---:|---|
| 0 | Lymphocyte |
| 1 | Metamyelocyte |
| 2 | Monocyte |
| 3 | Myelocyte |
| 4 | Normoblasts |
| 5 | Rod neutrophil |
| 6 | Segmentonuclear neutrophil |
| 7 | blast |
| 8 | Promyelocyte |
| 9 | Eosinophil |
| 10 | Basophil |
| 11 | Magakariocyte |
| 12 | Bad cells |
| 13 | plasma cells |
| 14 | artifacts |
| 15 | gumpricht shadows |
| 16 | methoses |
| 17 | normoblasts: oxyfilny |
| 18 | macrophages |
| 19 | normoblasts: erythroblasts |
| 20 | normoblasts: basophilic |
| 21 | normoblasts: polychromatophilic |
У пациента `240612.007` в `predefined_classes.txt` есть дополнительный класс `22 mast cells`, однако фактических объектов этого класса в текущем корпусе не обнаружено.
## 5. Распределение объектов по классам
Наиболее представленные классы:
| id | Класс | Число объектов |
|---:|---|---:|
| 7 | blast | 61 861 |
| 12 | Bad cells | 7 825 |
| 0 | Lymphocyte | 5 660 |
| 15 | gumpricht shadows | 3 600 |
| 6 | Segmentonuclear neutrophil | 1 715 |
| 3 | Myelocyte | 1 052 |
| 2 | Monocyte | 1 038 |
| 17 | normoblasts: oxyfilny | 1 035 |
| 5 | Rod neutrophil | 545 |
| 21 | normoblasts: polychromatophilic | 416 |
| 1 | Metamyelocyte | 414 |
| 9 | Eosinophil | 333 |
Редкие классы присутствуют, но для самостоятельной устойчивой оценки их объема недостаточно:
- `Promyelocyte`: `5`;
- `Magakariocyte`: `7`;
- `macrophages`: `7`;
- `plasma cells`: `24`;
- `Basophil`: `28`;
- `artifacts`: `54`.
## 6. Распределение по пациентам и изображениям
- пациентов, у которых встречается хотя бы один `blast`: `100`;
- пациентов без `blast`: `22`;
- изображений с хотя бы одним `blast`: `8 618`;
- изображений только с `blast`: `3 508`;
- изображений со смешанным составом `blast + other`: `5 110`;
- изображений без `blast`: `3 812`.
Это означает, что текущий набор подходит не только для object-level классификации, но и для image-level агрегирования, когда нужно оценивать вероятность наличия бластов на изображении по совокупности обнаруженных объектов.
## 7. Недопокрытие масками
Найдено `35` изображений, у которых число строк в detection-разметке не совпадает с числом масок объектов. Всего недостающих масок объектов: `36`.
Недостающие маски по классам:
| id | Класс | Число недостающих масок |
|---:|---|---:|
| 7 | blast | 13 |
| 15 | gumpricht shadows | 9 |
| 12 | Bad cells | 5 |
| 2 | Monocyte | 3 |
| 6 | Segmentonuclear neutrophil | 2 |
| 0 | Lymphocyte | 1 |
| 20 | normoblasts: basophilic | 1 |
| 5 | Rod neutrophil | 1 |
| 3 | Myelocyte | 1 |
Практический вывод: маски покрывают практически весь корпус, поэтому mask-based признаки можно считать основной, а не вспомогательной веткой текущего эксперимента. При этом для воспроизводимости необходимо зафиксировать правило fallback: если маски для объекта нет, данный объект либо исключается из mask-only ветки, либо используется только в bbox-only ветке.
## 8. Что текущие данные позволяют исследовать
Текущий корпус уже позволяет:
- строить основной протокол на `122` пациент-идентифицированных каталогах;
- строить patient-level разбиения;
- извлекать object-level кропы по detection-разметке;
- использовать mask-restricted ROI для признаков;
- сравнивать `bbox-only` и `mask-based` признаки;
- решать бинарную задачу `blast / non-blast`;
- оценивать image-level наличие бластов через агрегирование объектных предсказаний;
- изучать влияние классов качества, артефактов и сложных отрицательных примеров.
## 9. Что текущие данные не позволяют доказательно исследовать
На текущем корпусе нельзя считать полноценно подтвержденными следующие постановки:
- включение каталога `part-1` в основной patient-level корпус без дополнительного уточнения его происхождения;
- различение `lymphoblast / myeloblast`, так как в разметке есть только общий класс `blast`;
- внешнюю межлабораторную валидацию и устойчивость к доменному сдвигу;
- case-level и slide-level клиническую постановку с подтвержденными диагнозами;
- сопоставление результатов модели с экспертной разметкой нуклеол, палочек Ауэра и других специализированных структур.
## 10. Прямое следствие для плана эксперимента
Первый этап эксперимента должен быть построен вокруг следующей последовательности:
1. аудит и нормализация данных;
2. выделение основного patient-level корпуса и исключение `part-1` из базового протокола до уточнения его статуса;
3. формирование индексных таблиц на уровне пациента, изображения и объекта;
4. извлечение кропов и mask-aware областей интереса;
5. object-level `blast / non-blast` baseline;
6. сравнение признаков по режимам `bbox`, `mask`, `bbox+mask`;
7. image-level агрегирование как приближение к задаче автоматического анализатора;
8. только после этого — расширение постановки на новые данные и более сложные модели.