сам продукт https://alexman2505.pythonanywhere.com/
Инженер компьютерного зрения / Machine Learning Engineer (для гидравлических роботов) Тестовое задание, тема: сегментация конечностей
Легенда Вам необходимо разработать прототип системы машинного зрения, которая умеет выделять на изображении либо кисть руки человека, либо хвост кота (на выбор кандидата, если не оговорено иное). Классы стандартных предобученных моделей (COCO) не содержат «хвост», а «рука» там сегментируется только в контексте всего тела. Ваша задача — адаптировать SOTA-модель для решения этой узкой задачи при ограниченных данных.
Цель задания Оценить навыки работы с современными моделями детекции/сегментации (Ultralytics YOLO), умение готовить набор данных, проводить перенос обучения (fine-tuning) и разворачивать простое приложение (инференс).
Техническое задание (Варианты на выбор)
Вариант А (Рука человека) Датасет: использовать EgoHands, Face-Hand или создать синтетический набор (10-20 фото своих рук в разных положениях + аугментация). Задача: сегментировать только кисти рук (игнорировать предплечья). Маска должна быть бинарной (рука/фон). Ограничение: не использовать готовые решения для хенд-трекинга типа MediaPipe. Только YOLO + дообучение.
Вариант Б (Хвост кота) — рекомендуемый Датасет: вам НЕ выдаётся готовой размеченной выборки «хвост». Необходимо собрать ~30-50 изображений котов (можно из открытых источников) и вручную (или полуавтоматически) разметить только хвосты (формат COCO/YOLO Segment). Инструменты: CVAT, LabelMe, Roboflow или написание скрипта для генерации масок (например, вырезание хвоста на однотонном фоне). Задача: сегментация экземпляра (instance segmentation) — выделить контур хвоста.
Этапы выполнения (Ожидаемый результат)
-
Подготовка данных • Написать скрипт для конвертации разметки в формат YOLO .txt (нормализованные координаты полигона: class x1 y1 x2 y2 ...). • Бонус: сгенерировать синтетические данные: наложить маску хвоста на случайный фон (albumentations).
-
Обучение (Training) • Использовать предобученную YOLOv8n-seg или YOLOv11n-seg. • Заморозить бэкбон (backbone) или использовать Transfer Learning. • Подобрать гиперпараметры (imgsz, batch, epochs) для малого датасета. • Реализовать аугментации: поворот, сдвиг, изменение яркости (особенно важно для рук/хвостов в разных ракурсах). • Результат: Метрики mAP50-95 на валидационной выборке.
-
Инференс и демонстрация • Разработать простое приложение (Python + Flask/Gradio/Streamlit или OpenCV GUI). • Функция: загрузка изображения/видео, на выходе — изображение с наложенной маской (полупрозрачный слой) и контуром.
Описание проделанной работы
- Подготовка данных:
- Самостоятельный сбор датасета (50 изображений котов из открытых источников)
- Разметка и аннотирование на платформе в Roboflow (с vpn). Выделение полигонами (Polygon и Smart Polygon) только хвостов в формате YOLO .txt (нормализованные координаты полигона: class x1 y1 x2 y2 ...)
Ссылка на датасет (опять с vpn): https://app.roboflow.com/s-workspace-w8noc/cat_tail_segmentation/1
- Первичная аугментация (для увеличения разнообразия) средствами Roboflow
- Дополнительная аугментация встроенными средствами YOLO
- Обучение модели.
- Выбор модели: предобученная YOLOv8n-seg.
- Метод обучения Transfer Learning (дообучение на котах).
- Обучение было на GPU NVIDIA 3060
- Подбор гиперпараметров, определение лучших:
epochs=39,
batch=8,
imgsz=640,
workers=4,
copy_paste=0.2,
mosaic=1.0, weight_decay=0.0005
- Результат:
- Метрики Precision 0.97, mAP50-95 0.38 на валидационной выборке.
-
Демонстрация инференса на приложении Flask!!! Было сделано 2 версии проекта:
-
Приложение Flask + onnx, развернутое на PythonAnywhere. Для наглядной демонстрации проекта (не требует разворачивания силами проверяющего)
-
Локальный запуск системы c ultralytics (6 ГБ библиотек)
-
Flask + onnx. Пояснения к работе приложения
https://alexman2505.pythonanywhere.com/
- Для демонстрации проекта развернуто легковесное веб-приложение на Flask, которое использует onnxruntime для инференса. Приложение имеет один эндпойнт (главную страницу), позволяет загрузить фотографию кота, запустить обработку и посмотреть на результат распознавания.
- Сервис PythonAnywhere для развертывания приложения на Flask имеет ограничение в 500 МБ по объему предоставляемого дискового пространства. Поэтому в целях демонстрации прототипа пришлось прибегнуть в некоторым оптимизациям. А именно: модель была конвертирована в onnx формат (окружение с ultralytics занимет 6 ГБ).
- Также ограничено использование OpenCV при постобработке. Эта библиотека тоже не помещалась диск, и отвечала за создание контура хвоста на фотографии. Однако при запуске ultralytics хвост обводится (см. ниже). Приложение выводит на картинке прямоугольник, а все вычисленные точки контура (полигон сегментации!) и метрики уверенности выводятся в виде структурированной таблицы под изображением. Это позволяет наглядно продемонстрировать, что модель выполняет именно сегментацию, а не просто детекцию.
- Т.к. для обучения было использования мало изображений – рекомендуется загружать фотографии с однотонным фоном для лучшего распознавания хвоста.
Прототип https://alexman2505.pythonanywhere.com/ успешно определяет хвосты на загруженных фотографиях.
- Результат работы c ultralytics (требуется разворачивание и запуск)
-
Предстоит описание структуры репозитория (train.py и predict.py)
-
В данный момент структура репозитория: intehros_test/cat_tail_segmentation.v1i.yolov8/train.py — скрипт для обучения модели (использует ultralytics YOLO). intehros_test/cat_tail_segmentation.v1i.yolov8/predict.py — скрипт для демонстрации работы модели на одном изображении. intehros_test/requirements.txt — список зависимостей для локального запуска. Папка runs/segment/cat_tail_final/experiment— автоматически создается при обучении и содержит веса модели, графики и CSV с метриками. Фотография result.jpg в репозитории в папке после работы ultralytics.
Для проверки на ultralytics:
- Создайте виртуальное окружение для проекта python -m venv venv
- Активируйте виртуальное окружение (windows) source venv/Scripts/activate
- Запуск инференса. python predict.py
- Программа запустит модель и разметит хвосты на изображении (см. ниже)
Критерии оценки Качество данных: насколько аккуратно размечены полигоны. Код: чистота, наличие README, requirements.txt, структура train.py и predict.py. Результат: модель должна более-менее сносно определять хвост/руку на новых фото из интернета, а не только на обучающей выборке.