Привет. Тема для меня новая, есть несколько вопросов.
Хоту сделать приложение для детекции радиодеталей(полосатых резисторов для начала) на видеопотоке.
Первая задача - тренировать нейросеть. Спросил варианты у
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) После детекции как лучше всего получить номинал резистора по полосам? Думал вырезать из оригинальной картинки по координатам, которые даст нейросеть детекции, и далее разворачивать и нормализовать картинку, и уже другая нейросеть или алгоритм будет смотреть на полосы и считать сопротивление. Такой путь имеет смысл? Чтобы не тренировать на исходной модели весь ряд резисторов, например, а только само понятие "резистор". Какой вариант тут подойдёт для второго шага?
Некоторые результаты детекции. Не видит/Плохо видит под углом, не видит с расстояния, есть детекция конденсаторов как резисторов и т.п.
Буду рад любым советам, пояснениям, ссылкам на туториалы