Генерация синтетического датасета для object detection из Blender-сцен с профилями соревнований по схеме scenes/<competition>/<year>/.
Текущий runtime больше не привязан к teknofest: выбор соревнования и года идёт через путь к конфигу, а вся scene-specific кастомизация описывается в YAML.
- единая точка входа: main.py
- два CLI-сценария:
runиdebug - профили сцен лежат в scenes
- старый
pipenv-flow удалён, проект теперь описан через pyproject.toml - экспорт аннотаций сейчас поддерживает только
YOLO bbox
Каждый профиль должен лежать так:
scenes/
<competition>/
<year>/
config.yaml
<scene>.blend
resources/
Правила:
competitionиyearвыводятся из пути кconfig.yaml.blendдолжен лежать рядом сconfig.yaml- все дополнительные файлы профиля описываются относительными путями от директории профиля
Сейчас в репозитории есть:
- scenes/teknofest/2024/config.yaml — мигрированный профиль из старого сценария
- scenes/sauvc/2026/config.yaml — шаблон под новую сцену SAUVC
- Python
3.10 - установленный
uv - Blender executable, путь к которому можно передать в CLI
Основные Python-зависимости:
pydanticPyYAMLopencv-pythonjoblibscikit-learnnumpy
uv syncЕсли uv попросит сначала создать lockfile, выполните:
uv lock
uv syncМинимальный запуск:
uv run python main.py run \
--blender /path/to/blender \
--config scenes/teknofest/2024/config.yamlТестовый debug-запуск с bbox прямо на изображениях:
uv run python main.py debug \
--blender /path/to/blender \
--config scenes/teknofest/2024/config.yamlЧто делает main.py:
- Валидирует путь
scenes/<competition>/<year>/config.yaml - Проверяет, что
.blendлежит рядом с конфигом - Создаёт export-директорию
- Сериализует resolved config
- Запускает Blender в headless-режиме через внутренний runner
- После рендера собирает YOLO-датасет со split
train/val/test
Поддерживаются две команды:
python main.py run --blender <path-to-blender> --config <path-to-config>
python main.py debug --blender <path-to-blender> --config <path-to-config>Аргументы:
--blender— абсолютный путь до Blender executable--config— путь доscenes/<competition>/<year>/config.yaml
Режимы:
run— обычный production export без нарисованных bboxdebug— тестовый export на20изображений с bbox, нарисованными прямо вimages/
Ключевые секции YAML:
scene— имена объектов, коллекций, материалов, нод и относительный путь до.blenddataset— список классов и отображениеobject_name -> class_namerender— размер изображения и Cycles samplessampling— число кадров, seed, лимиты и пороги валидации bboxrandomization— палитра цветов для recolorable объектовvisibility—geometricилиmist_modelexport— формат экспорта и размерыval/test
Ключевые ограничения:
dataset.classes— явный упорядоченный список классов для YOLOclass_idexport.formatпока допускает толькоyolo_bboxval_size + test_sizeдолжно быть меньше1
Ключевые поля в sampling, влияющие на устойчивость генерации:
min_valid_bboxes— минимальное число объектов на каждом сохранённом кадреmax_scene_attempts— watchdog на число пересэмплингов раскладки сцены для одного кадраtarget_object_attempts— число object-aware попыток, когда камера ставится рядом с выбранным объектом и наводится на негоrandom_fallback_attemptsиmax_camera_attempts— резервный random search по сценеtarget_horizontal_distance_range,target_vertical_offset_range— как далеко от целевого объекта можно ставить камеруtarget_yaw_jitter_deg_range,target_pitch_jitter_deg_range— насколько сильно шумить вокруг target-oriented ракурса
Runtime сначала пытается собрать кадр через target-oriented camera placement, а потом уходит в random fallback. Кадр сохраняется только если после всех фильтров в нём осталось минимум min_valid_bboxes валидных bbox.
Обычный запуск пишет результат в:
exports/<competition>_<year>_<timestamp>/
Debug-запуск пишет результат в:
exports/debug/<competition>_<year>_<timestamp>/
Внутри:
dataset.yaml
manifest.json
images/
train/
val/
test/
labels/
train/
val/
test/
В debug режиме bbox рисуются прямо в images/train|val|test.
Имена изображений:
img_000000.jpgimg_000001.jpg
Имена label-файлов:
img_000000.txtimg_000001.txt
dataset.yaml содержит train, val, test и список names.
manifest.json хранит metadata запуска, seed, классы и распределение по split.
Экспортируется только один target label на bbox:
class_idберётся из индекса класса вdataset.classes- значение класса строится только по
type, не поcolor
Формат строки в label-файле:
<class_id> <cx> <cy> <w> <h>
Все координаты нормализованы относительно размера изображения.
Профиль scenes/sauvc/2026 сейчас создан как шаблон.
Чтобы сделать его рабочим, нужно:
- положить реальный
.blendрядом сconfig.yaml - заменить placeholder-имена объектов и коллекций на фактические
- при необходимости описать
scene.mistи включитьvisibility.mode: mist_model
Pure-python тесты:
python3 -m unittest discover -s tests -vПокрыто:
- разбор пути профиля
scenes/<competition>/<year>/ - валидация resolved context
- YOLO export и split
train/val/test
Blender runtime отдельно нужно проверять на машине, где установлен Blender.
COCO bboxexportYOLO segmentationexport- отдельные smoke-тесты с реальным Blender executable в CI или локальном профиле