Для обучения модели распознавания носков нужен размеченный датасет — набор фотографий с указанием, где именно на каждом снимке находятся носки (bounding box).
Фотографии снимаются напрямую с камеры Raspberry Pi. Скрипт делает серию снимков с паузами, чтобы успеть переложить носок в новое положение:
# На Raspberry Pi (требует sudo для доступа к камере)
sudo ./main.py shot --count 200 --output-dir imagesПараметры:
--count— количество снимков (по умолчанию 200)--output-dir— папка для сохранения (по умолчаниюimages/)--pause— пауза между снимками в секундах (по умолчанию 2)--move-pause— пауза каждые 10 снимков для смены позиции носка (по умолчанию 10)
- Разнообразие ракурсов: снимайте носки с разных сторон, на разном расстоянии от камеры
- Разное освещение: при дневном свете, при искусственном, в тени
- Разные поверхности: на полу, ковре, под мебелью, на диване
- Разные носки: разных цветов, размеров, сложенные и разложенные
- Фон: снимайте в реальных условиях квартиры, а не на однотонном фоне
- Количество: чем больше, тем лучше. Минимум 200 фото, оптимально — 500+
Roboflow — платформа для управления датасетами компьютерного зрения. Бесплатный тариф покрывает все наши потребности.
- Зарегистрироваться на roboflow.com
- Создать новый проект: Object Detection, 1 класс —
sock - Загрузить все фотографии (Upload Data)
На каждой фотографии нужно отметить bounding box (прямоугольник) вокруг каждого носка и присвоить ему класс sock.
Roboflow предоставляет встроенный редактор для разметки:
- Выбрать инструмент Bounding Box
- Обвести каждый носок на фотографии
- Указать класс
sock - Повторить для всех фотографий
Совет: если носок частично скрыт (например, под стулом), всё равно размечайте видимую часть. Модель научится распознавать и частично видимые носки.
Аугментация — автоматическое создание вариаций изображений для увеличения датасета. Roboflow может:
- Повороты — случайный поворот на ±15°
- Обрезка — случайная обрезка до 10% с каждой стороны
- Яркость — изменение яркости ±20%
- Размытие — лёгкое размытие (до 2.5 px)
- Шум — добавление шума (до 3%)
При создании новой версии датасета (Create New Version) Roboflow применит выбранные аугментации и увеличит количество изображений в тренировочной выборке.
Быстрое правило:
- Roboflow — если нужен самый быстрый путь от фотографий к готовому trainable-датасету;
albumentations— если нужен воспроизводимый pipeline аугментации через код.
Если нужен воспроизводимый локальный pipeline вместо Roboflow, популярный вариант — albumentations. Эта библиотека широко используется в computer vision и умеет работать с bounding box'ами.
Установка:
pip install albumentations opencv-pythonПример augmentation pipeline для датасета в стиле YOLO:
import cv2
import albumentations as A
transform = A.Compose(
[
A.Rotate(limit=15, border_mode=cv2.BORDER_CONSTANT, p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),
A.GaussianBlur(blur_limit=(3, 5), p=0.2),
A.GaussNoise(std_range=(0.02, 0.08), p=0.2),
A.RandomCropFromBorders(crop_left=0.1, crop_right=0.1, crop_top=0.1, crop_bottom=0.1, p=0.2),
],
bbox_params=A.BboxParams(format="yolo", label_fields=["class_labels"]),
)
image = cv2.imread("dataset/train/images/example.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
bboxes = [
[0.52, 0.48, 0.30, 0.22], # x_center, y_center, width, height (формат YOLO)
]
class_labels = ["sock"]
augmented = transform(image=image, bboxes=bboxes, class_labels=class_labels)
augmented_image = augmented["image"]
augmented_bboxes = augmented["bboxes"]Когда это удобно:
- если нужны воспроизводимые аугментации в коде
- если хочется version-control для augmentation pipeline
- если нужно запускать одинаковые преобразования локально, в ноутбуках или в CI
Для этого проекта Roboflow по-прежнему самый быстрый путь для управления датасетом, но albumentations — хороший вариант, если тебе ближе workflow через код.
После создания версии — скачать датасет в формате YOLOv8:
- Нажать Download Dataset
- Выбрать формат YOLOv8
- Выбрать download zip to computer или show download code
Или скачать через терминал:
curl -L "https://app.roboflow.com/ds/YOUR_DATASET_URL" > roboflow.zip
unzip roboflow.zip
rm roboflow.zipПосле распаковки датасет имеет следующую структуру:
dataset/
├── train/
│ ├── images/ # Тренировочные изображения (~70%)
│ └── labels/ # Аннотации в формате YOLO (txt)
├── valid/
│ ├── images/ # Валидационные изображения (~20%)
│ └── labels/
├── test/
│ ├── images/ # Тестовые изображения (~10%)
│ └── labels/
└── data.yaml # Конфиг датасета
Файл data.yaml описывает пути и классы:
train: dataset/train/images
val: dataset/valid/images
test: dataset/test/images
nc: 1
names: ['sock']В текущей версии датасета — 961 изображение (Roboflow workspace: socks-axfcs, project: socks1, version 2).
| ← Предыдущая | README | Следующая → |
|---|---|---|
| Настройка Raspberry Pi 4 (legacy) | Вернуться к README | Тренировка модели |