Тестовое задание 1 на вакансию CV Engineer
в компанию "Русагро_технологии"
.
В агропроме вам предстоит работать с грязными данными в самых разных смыслах. В папке images
несколько фото резервуаров с ЖОУ (жидкие органические удобрения). Попробуйте предложить решение и реализовать его в коде, позволяющее определять линию уровня поверхности жидкости.
Это могло бы помочь в задаче определения объема ЖОУ в резервуаре.
Мы также оценим вашу критику и предложения по подходу к решению данной задачи, выходящие за рамки вашего времени на решение домашнего кейса.
Я остановился на сегментации поверхности ЖОУ и стен резервуара для ЖОУ с помощью нейронной сети Mask RCNN Resnet50
. Вычислении контуров ограничивающих их маски сверху. Далее по каждому ограничивающему маски сверху контуру вычисляется медиана всех значений y-координаты и мы получаем границу определяющую уровень ЖОУ (y_jou
) и верхнюю границу резервуара для ЖОУ (y_res
). Уровень ЖОУ относительно стенки резервуара (h_jou
) вычисляется как
Ниже показан пример того как это выглядит на картинке из тестовой выборки:
рассчитаем метрику AP, detectron2 имеет ее встроенную поддержку через COCO API.
по рамкам получаем:
category | AP | category | AP |
---|---|---|---|
JOU | 98.218 | block | 86.735 |
по маскам получаем:
category | AP | category | AP |
---|---|---|---|
JOU | 98.317 | block | 90.000 |
Поверхность ЖОУ и по рамкам и по маскам распознается отлично! Поверхность стенок резервуара, уже хуже. Примечательно, что по маскам все же лучше.
Чтож, отличный результат для обучающей выборки, состоящей из всего 5 картинок =) (правда еще Flip'нутых, что увеличивает их до 15-ти).
Правда и test состоит тоже всего из 4-х. (правда еще Flip'нутых, что увеличивает их до 12-ти).
Анализ оценки уровня ЖОУ относительно стенки резервуара ($h_{res}$ ) с помощью обработки верхних контуров от масок для тесовых картинок
Посмотрим на верхние границы полученные с помощью обработки верхних контуров от масок "vis_folder/val/hjou_by_mask/3.jpg"
Получаем точную границу определяющую уровень ЖОУ (синий
) и верхнюю границу резервуара для ЖОУ (зеленый
). И корректно оцениваем уровень ЖОУ относительно стенки резервуара (красный
).
Посмотрим на верхние границы полученные с помощью обработки верхних контуров от масок "vis_folder/val/hjou_by_mask/6.jpg"
Получаем точную границу определяющую уровень ЖОУ (синий
) и верхнюю границу резервуара для ЖОУ (зеленый
). И корректно оцениваем уровень ЖОУ относительно стенки резервуара (красный
).
Посмотрим на верхние границы полученные с помощью обработки верхних контуров от масок "vis_folder/val/hjou_by_mask/7.jpg"
Здесь резервуар наклонен в кадре, мы изначально ищем границы резервуара предполагая, что он расположен горизонтально. Благодаря обработке верхнего контура маски границы стали точнее. Но наша обработка контура все равно ищет горизонтальную прямую, так как является просто медианой всех y-координат, содержащихся в верхних контурах. Нужна обработка, учитывающая потенциальный наклон. Например, мы могли бы попробовать линейную регрессию по x, y-координатам содержащихся в верхних контурах. И тогда мы бы уже получали прямую с наклоном (не успел проверить).
Итог: обработка верхних контуров масок точно границу определяющую уровень ЖОУ (синий
) и верхнюю границу резервуара для ЖОУ (зеленый
). И мы корректно оцениваем уровень ЖОУ относительно стенки резервуара (красный
) в случае горизонтально расположенного резервуара на фото.
Для фото на которых резервуар расположен под наклоном можно применить более сложную обработку верхнего контура маски. Например, мы могли бы попробовать линейную регрессию по x, y-координатам содержащихся в верхних контурах. И тогда мы бы уже получали прямую с наклоном (не успел проверить).