3.8 KiB
Модуль В: простой вариант
1. Нарезать видео на кадры
Из корня репозитория:
mkdir -p module3/dataset/raw
ffmpeg -i video.mp4 -vf fps=2 module3/dataset/raw/frame_%05d.jpg
Двух кадров в секунду обычно достаточно. Удали смазанные и почти одинаковые кадры. Оставь хотя бы 30–60 нормальных изображений.
2. Разметить локально
Один раз установить X-AnyLabeling в отдельное окружение:
python3 -m venv ~/.venvs/xanylabeling
~/.venvs/xanylabeling/bin/pip install -U uv
~/.venvs/xanylabeling/bin/uv pip install "x-anylabeling-cvhub[cpu]"
Открыть кадры:
~/.venvs/xanylabeling/bin/xanylabeling module3/dataset/raw \
--labels module3/dataset/classes.txt --autosave
Классы уже лежат в dataset/classes.txt:
hammer
pliers
wrench
Нажми R, обведи каждый видимый инструмент прямоугольником, выбери класс,
затем D для следующего кадра. После разметки выбери File -> Export Annotations -> Export YOLO Annotations -> Detection, укажи
dataset/classes.txt. В dataset/raw/labels должны появиться TXT-файлы.
Подготовить train/valid/test:
python3 module3/simple_prepare_dataset.py
Скрипт создаст module3/training_new и при повторном запуске пересоздаст только
эту папку.
3. Обучить через Ultralytics CLI
cd module3
source .venv/bin/activate
yolo detect train model=yolo11n.pt data=training_new/data.yaml epochs=30 patience=7 imgsz=512 batch=8 device=0 workers=4 project=training_new/runs name=tools
cp training_new/runs/tools/weights/best.pt models/latest.pt
Если не хватает видеопамяти, поменяй только batch=8 на batch=4.
4. Показать работу модели в OpenCV
На тестовых фотографиях:
python simple_module_b.py training_new/test/images
На исходном видео:
python simple_module_b.py /путь/к/video.mp4
На обычной USB-камере:
python simple_module_b.py 0
На изображении будут bounding box, класс и confidence. Результаты также пишутся
в logs/simple_module_b.log. Q или Esc закрывает окно.
5. Открыть и закрыть захват
После запуска симулятора и контроллеров:
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
python3 module3/simple_gripper.py
Скрипт сначала открывает захват, по Enter закрывает и ещё по Enter снова
открывает. Команды сохраняются в module3/logs/simple_gripper.log.
Если нужно отдельно показать движение всей руки, используй выданный пример:
ros2 launch ar_webots_fms_ros2 moveit_api_example.launch.py
Что сказать эксперту
«Я нарезал видео на кадры, разметил три класса bounding box-ами, разделил датасет на train/valid/test и обучил YOLO11n через Ultralytics CLI. В OpenCV показываю класс, confidence и bounding box. Управление захватом отправляет ROS 2 команду контроллеру RMC1, а события выводятся в терминал и сохраняются в лог».