refactor(module3): reduce simple demo to one script

This commit is contained in:
2026-09-15 22:40:00 +03:00
parent 6c5e23c86c
commit 6bc567ea9e
4 changed files with 79 additions and 203 deletions
+15 -82
View File
@@ -1,112 +1,45 @@
# Модуль В: простой вариант
# Простой модуль В
## 1. Нарезать видео на кадры
Из корня репозитория:
## Кадры
```bash
mkdir -p module3/dataset/raw
ffmpeg -i video.mp4 -vf fps=2 module3/dataset/raw/frame_%05d.jpg
```
Двух кадров в секунду обычно достаточно. Удали смазанные и почти одинаковые
кадры. Оставь хотя бы 30–60 нормальных изображений.
## 2. Разметить локально
Один раз установить X-AnyLabeling в отдельное окружение:
## Разметка
```bash
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/pip install "x-anylabeling-cvhub[cpu]"
~/.venvs/xanylabeling/bin/xanylabeling module3/dataset/raw --labels module3/dataset/classes.txt --autosave
```
Открыть кадры:
```bash
~/.venvs/xanylabeling/bin/xanylabeling module3/dataset/raw \
--labels module3/dataset/classes.txt --autosave
```
Классы уже лежат в `dataset/classes.txt`:
```text
hammer
pliers
wrench
```
Нажми `R`, обведи каждый видимый инструмент прямоугольником, выбери класс,
затем `D` для следующего кадра. После разметки выбери `File -> Export
Annotations -> Export YOLO Annotations -> Detection`, укажи
`dataset/classes.txt`. В `dataset/raw/labels` должны появиться TXT-файлы.
Подготовить train/valid/test:
Рамки рисуются клавишей `R`, следующий кадр — `D`. Экспорт: `File -> Export
Annotations -> Export YOLO Annotations -> Detection`. Затем:
```bash
python3 module3/simple_prepare_dataset.py
```
Скрипт создаст `module3/training_new` и при повторном запуске пересоздаст только
эту папку.
## 3. Обучить через Ultralytics CLI
## Обучение
```bash
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
yolo detect train model=yolo11n.pt data=training_new/data.yaml epochs=30 patience=7 imgsz=512 batch=8 device=0 project=training_new/runs name=tools exist_ok=True
cp training_new/runs/tools/weights/best.pt models/latest.pt
```
Если не хватает видеопамяти, поменяй только `batch=8` на `batch=4`.
## 4. Показать работу модели в OpenCV
На тестовых фотографиях:
```bash
python simple_module_b.py training_new/test/images
```
На исходном видео:
```bash
python simple_module_b.py /путь/к/video.mp4
```
На обычной USB-камере:
```bash
python simple_module_b.py 0
```
На изображении будут bounding box, класс и confidence. Результаты также пишутся
в `logs/simple_module_b.log`. `Q` или `Esc` закрывает окно.
## 5. Открыть и закрыть захват
После запуска симулятора и контроллеров:
## Запуск
```bash
source /opt/ros/jazzy/setup.bash
source ~/ros2_ws/install/setup.bash
python3 module3/simple_gripper.py
cd ~/scripts/mvch
module3/.venv/bin/python module3/simple_module_b.py
```
Скрипт сначала открывает захват, по `Enter` закрывает и ещё по `Enter` снова
открывает. Команды сохраняются в `module3/logs/simple_gripper.log`.
Если нужно отдельно показать движение всей руки, используй выданный пример:
```bash
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, а события выводятся в терминал и сохраняются в лог».
Ввод предмета нужен только для показа. Скрипт выводит YOLO в окне OpenCV, через
5 секунд открывает захват, а через 2 секунды закрывает его. Выход — `Q` или
`Esc`.