feat(module3): add simple competition workflow
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
# Модуль В: простой вариант
|
||||
|
||||
## 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]"
|
||||
```
|
||||
|
||||
Открыть кадры:
|
||||
|
||||
```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:
|
||||
|
||||
```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
|
||||
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
|
||||
```
|
||||
|
||||
Скрипт сначала открывает захват, по `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, а события выводятся в терминал и сохраняются в лог».
|
||||
Reference in New Issue
Block a user