Задать вопрос
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант

Как тренировать Yolo, размер датасета, итоговый loss?

Привет. Тема для меня новая, есть несколько вопросов.

Хоту сделать приложение для детекции радиодеталей(полосатых резисторов для начала) на видеопотоке.
Первая задача - тренировать нейросеть. Спросил варианты у DeepSeek, он предолжил Yolo8-nano
Нашел размеченый датасет подходящий через гугл-поисковик датсетов.
Для тренировки использовал такой код:
from ultralytics import YOLO
import os

# Загрузка модели
# Используем yolov8n.pt, так как это nano-версия, подходящая для мобильных устройств
model = YOLO('yolov8n.pt')

# Путь к файлу data.yaml
data_yaml_path = os.path.join('data', '1', 'data.yaml')

# Проверка существования файла data.yaml
if not os.path.exists(data_yaml_path):
    print(f"Ошибка: Файл {data_yaml_path} не найден. Убедитесь, что путь указан верно.")
else:
    # Тренировка модели
    # epochs: количество эпох (можно увеличить для лучшего результата)
    # imgsz: размер изображения (640 - стандарт для YOLOv8)
    # data: путь к файлу data.yaml
    # project: название папки для сохранения результатов тренировки
    # name: название конкретного запуска тренировки
    # plots: True для сохранения графиков тренировки
    results = model.train(data=data_yaml_path, epochs=50, imgsz=640, project='runs/detect', name='resistor_detection_v1', plots=True)

    print("Тренировка завершена. Результаты сохранены в папке runs/detect/resistor_detection_v1")
    print("Графики тренировки можно найти в папке runs/detect/resistor_detection_v1/results.png и runs/detect/resistor_detection_v1/confusion_matrix.png")

Потом сконвертировал модель в другой формат:
from ultralytics import YOLO
model = YOLO('./runs/detect/resistor_detection_v1/weights/best.pt')
model.export(format='tflite')

И после добавил в этот проект, чтобы проверить как модель работает.
Итог: работает, но не очень хорошо.

Тема для меня новая, и это пока proof-of-concept, и есть несколько вопросов.
1) Yolo8-nano - оптимальный выбор или можно/нужно брать более современные модели?
2) Какой должен быть размер датасета? Какой характерный размер?
3) Сколько эпох тренировать? До каких значений потерь? Сейчас попробовал в colab зарядить 500 эпох с аугментацией датасета, результат такой:
Model summary (fused): 72 layers, 3,005,843 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00,  1.83it/s]
                   all         28         46      0.981          1      0.995      0.659

На каком-то моменте улучшения прекратились, и это лучший результат.
3) Для оптимизации по скорости нужно ли детектировать в оттенках серого? Или это необязательно и на производительности не скажется?
4) После детекции как лучше всего получить номинал резистора по полосам? Думал вырезать из оригинальной картинки по координатам, которые даст нейросеть детекции, и далее разворачивать и нормализовать картинку, и уже другая нейросеть или алгоритм будет смотреть на полосы и считать сопротивление. Такой путь имеет смысл? Чтобы не тренировать на исходной модели весь ряд резисторов, например, а только само понятие "резистор". Какой вариант тут подойдёт для второго шага?

Некоторые результаты детекции. Не видит/Плохо видит под углом, не видит с расстояния, есть детекция конденсаторов как резисторов и т.п.
Скрины

687304411b4fd414353043.jpeg
68730447d7bfd131634541.jpeg
687304509d731830596523.jpeg
687304579fdca411811553.jpeg


Буду рад любым советам, пояснениям, ссылкам на туториалы
  • Вопрос задан
  • 151 просмотр
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
1) Уже есть 12 версия яло. И зачем ты взял нано версию?
2) С нейросетями нет такого, что взял А, Б и С и у тебя всё получилось. Количество обучающих картинок зависит от предполагаемого разнообразия. Если ты фотографируешь на цифровой фотоаппарат строго вертикально при хорошем освещении, то примеров нужно будет меньше, чем если фоткать на смартфон в тёмного подвале.
3) Как loss перестаёт уменьшаться или на проверочных данных он начнёт расти.
3) Проводишь эксперименты. Нет ответов не все случая жизни.
4) Да, возможно отдельная сеть, которая будет получать готовую развёртку, даст более стабильные варианты.

Проблему я тут вижу в датасете - его примеры с отдельными элементами не похожи на твои снимки с плат. Так что придётся создавать свой. Можно разметить 10 плат и дальше 11-ую путь уже сеть помогает тебе размечать.
Ответ написан
Комментировать
@rPman
200 изображений и оно работает? На генерируй по больше изображений в датасете, поворотами и добавлением смазанного изображения и шумами алгоритмов сжатия видео, а так же наложениями нескольких объектов друг на друга. Еще можно собрать датасет на основе своих видео (твоя камера, твое освещение), просто вырезая из своих кадров box-ы распознанных элементов, собирать из них обучающую выборку (естественно модифицируя их как выше показано) и повторно тюнить модель.

Делай несколько снимков с чуть чуть сдвинутой камерой (например сдвинуто в сторону или повернута, можно программно делать) у всех алгоритмов искусственного зрения глюки обычно эпизодические, это видно на видео, внезапно пропадают детекции для случайных объектов, но на следующем кадре уже есть.

p.s. Есть алгоритмы сегментации (facebook SAM) которые просто выделяют объекты по контурам, эти алгоритмы можно совместить, распознавая сначала контуры, а затем, выделяя изображение с помощью этого контура (там изображение - маска), уже распозновай сам объект, так алгоритм будет работать с идеальными изображениями, на которых обучался.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы