Final pipeline for DSB2018
Task descriprion: instance segmentation of nuclei https://www.kaggle.com/c/data-science-bowl-2018
Используется подход с использованием encoder-decoder архитектуры (Unet с различными экнодерами) и watershed transform для разделения инстансов
Пайплайн:
-
Препроцессинг (src.dataset_v0.py):
- Препроцессинг маски:
- Граница маски как разница cv2.dilate() и cv2.erode() исходной маски
- Ядро маски как cv2.erode() исходной маски
- "Энергия" для каждой nuclei как величина прямо пропорциональную удалению от центра клетки (см. функцию get_distance() в src.dataset_v0)
- Препроцессинг изображения: нормализация (div 255 / mean std / imagenet / CLAHE)
- Препроцессинг маски:
-
Аугментации (src.dataset_v0.py, src.augs.py):
- random shift, scale, rotate, flip
- random crop: кропаются только участки с площадью маски > threshold
- random put: если изображение меньше входа сети, то генерируется canvas и изображение помещается в случайное место на нем
- random contrast, brightness
-
Сеть: resnet50-unet с двумя (тремя) выходами: бинарная маска, центр каждой клетки (граница клетки)
-
Тренировка (src.trainer_v0.py)
- 5 фолдов, без стратификации
- loss: dice_bce / weighted dice_bce, веса - из п. 1.1.3 препроцессинга
- lr schedule с понижением lr каждые 50 эпох
- Cyclic lr
- Для тренировки использовались доп. данные (но не для валидации)
-
Инференс (src.predictor_v0.py):
- Большие изображения (больше входа сети): crop+overlap со stride=16px. На перекрываемых областях - усреднение
- TTA: rotate 90-180-270
- оптимизация threshold по train+valid выборке, усреднение по фолдам
- watershed transform
Clone this repo Modify trainer.py:
- Change GLOBAL_PATH (dataset folder)
- Modify training params: -- phases = ['train', 'test'] -- unet_input = 224 -- batch_size = 24 -- dropout = 0.3 -- batch_norm = True -- predict_seeds = True - seed are center of nuclei (cv2.erode()) -- use_bnds = False -- predict_on_crops = False -- norm_type = 'mean_std' -- n_folds = 5 -- exclude_folds = [] -- use_model = ZF_Seg_ResNet50_224x224 -- lr_sched = [[100, 0.0002, '1']]
- Implement FPN - it should give ~10% boost
- Try focal loss / bce+lovasz loss
- Pseudolabeleing