Pull to refresh

Первые шаги в ML на обучающем хакатоне: обнаружение птиц на фотографиях yolov8s + sahi

Level of difficultyEasy
Reading time4 min
Views3.7K

Всем привет! Несколько месяцев назад я начал пытался разбираться в ML и когда мне под руку попался легенький хакатон для школьников, связанный с CV, я решил, что это мой шанс!

P.s. Не ругайтесь пожалуйста за мою проф неграмотность, если таковую найдете в данном тексте. Я пока только разбираюсь в теме и хотел бы помочь таким же, как я людям, которые еще не разбирались в теме, дилетантским языком рассказать что к чему) Надеюсь, пост поможет побыстрее влиться во все это.


Шаг 1: Установка, импорт, распаковка, проверка

Изучая задачу, я понял, что мне нужно обнаруживать чаек по фотографиям. Для решения задачи я решил использовать yolov8s, потому что он мне показался оптимальнейшим из линейки yolov8 для моего случая. Также, мне как-то рассказывали про sahi (Slicing Aided Hyper Inference), и я решил, что это мой шанс попробовать этот инструмент в качестве улучшения конечного результата.

Итак, у меня был датасет, включающий фотографии, уже разбитые на train, validation, test, запакованные в zip архив. Первым делом, я устанавливаю и импортирую необходимые на первых парах библиотеки и распаковываю то, что нужно распаковать:

%pip install ultralytics
%pip install glob
%pip install zipfile
from glob import glob
import zipfile
import os
import ultralytics

zip_file = '/content/train.zip'
f = zipfile.ZipFile(zip_file, 'r')
f.extractall()
print(os.listdir())

zip_file = '/content/test.zip'
f = zipfile.ZipFile(zip_file, 'r')
f.extractall()
print(os.listdir())

Прописываю следующую строчку для проверки аппаратного и программного обеспечения, чтобы убедиться, что все в порядке:

ultralytics.checks()

Вывод должен содержать примерно такую строчку:

Ultralytics YOLOv8.0.159 ? Python-3.11.4 torch-2.0.1 CPU (Apple M2)
Setup complete ✅ (8 CPUs, 8.0 GB RAM, 181.7/460.4 GB disk)

И да, предупреждая некоторые вопросы внимательного читателя, я писал все это не в google collab, а в VS Code по причине того, что в сервисе от google есть ограничение по времени неактивности на странице и требуется каждые ~2 часа проходить капчу, мол я на месте. Мне это не понравилось. Я 3 раза ставил модель обучаться и уходил по своим делам и 3 раза мне говорили, что из-за того, что я не был активен, в целях экономии ресурсов они останавливают деятельность коллаба и требуется перезагрузить страницу. А в случае перезагрузки все файлы, не лежащие на гугл диске (если вы его не подключили к блокноту), теряются, а также обучение модели ставится на паузу. В какой-то момент, узнав, что у Ultralytics есть отдельный метод распределения ресурсов компьютера при обучении на чипах Apple Silicon, я побежал обучать модель на своем Macbook.

Шаг 2: Обучение модели

Для того, чтобы начать обучение модели на готовых данных требуется написать следующую строчку, где

  • task - аргумент, отвечающий за режим обучения модели,

  • mode - аргумент, отвечающий за режим процесса (обучение, валидация, тренировка и тд),

  • model - аргумент, отвечающий за тип модели, которая будет обучать нашу модель,

  • imgsz - аргумент, отвечающий за размер картинок, подаваемых на вход,

  • data - аргумент, отвечающий за путь к файлу .yaml, где находится первичная необходимая yolov8 информация,

  • epochs - аргумент отвечающий за количество полных проходов по набору train для обучения модели,

  • batch - аргумент, отвечающий за количество обработанных моделью примеров для одной итерации,

  • project - аргумент, отвечающий за расположение файла и итоговыми результатами,

  • device - в моем случае говорит yolov8, что нужно использовать алгоритмы для чипов apple silicon (в общем случае, для windows или для google collab можно не прописывать):

!yolo task=detect mode=train model=yolov8s.pt imgsz=640 data=..path../data.yaml epochs=10  batch=8 project=..path../training_results device='mps'

Мой файл .yaml выглядит следующим образом:

train: "..path../train/images"
val: "..path../valid/images"
 
# class names
names: 
  0: 'seagulls'

После запуска этой маленькой строчки, выполнение которой занимает ~4 часа, я получил следующие результаты:

Один из коллажей из фотографий тренировочного набора после обучения модели с выделенными объектами детектирования
Один из коллажей из фотографий тренировочного набора после обучения модели с выделенными объектами детектирования
Графики потерь модели
Графики потерь модели

Помимо этого были получены и другие графики, диаграммы, файл .csv с таблицей циферок потерь, два файла с последними и лучшими весами модели и файл .yaml со всеми параметрами для обучения модели.

Шаг 3: Валидация

Далее мне нужно было проверить результаты модели на валидационном датасете:

!yolo val model=..path../train/weights/best.pt data=..path../data.yaml

Здесь я также получил некоторые кривые и коллаж с размеченными красными рамками изображениями.

Шаг 4: Тест модели

Ну и наконец, скармливаю готовой модели тестовый датасет:

!yolo task=detect mode=predict model="..path../training_results/train/weights/best.pt" source="..path../images_test" save_txt = "True"

Тут я получаю папку отмеченных красными прямоугольниками фотографий с вероятностью правильности детектирования и папку "labels" с .txt файлами для каждой фотографии c четырьмя параметрами для каждого объекта: cls cx cy w h , где cls— категория объекта, cx, cy - координаты центра, w, h - ширина и высота объектов.

Попытка прикрутить SAHI

Теперь, когда основное дело сделано, я попытался применить технологию sahi к моей модели. Я не стал пытаться делать какое-то грандиозное сравнение всего датасета, а решил по рабоче-крестьянски скармливать ему по одной фотографии и сравнивать результаты.

Так, например, я получил два таких результата:

yolov8s
yolov8s
yolov8s+ sahi
yolov8s+ sahi

Выводы

Проведя всю эту работу, могу сказать, что технология sahi мне не помогла и даже ухудшила результаты по двум аспектам:

  1. Модель yolov8s+sahi нашло 33 чайки, в то время, как yolov8s, в одиночку, обнаружил 39.

  2. У модели yolov8s+sahi уровень уверенности ниже, чем у yolov8s.

Почему получились именно такие результаты, я до конца не понимаю. Возможно, так случилось из-за того, что моя модель была не идеальная, и полученные неидеальные веса лишь усугубили результат в случае применения sahi. Напишите в комментарии, если догадываетесь в чем проблема, буду очень признателен)
Спасибо за прочтение статьи! Надеюсь, она была интересной и даже, может быть, познавательной.

Если у вас есть какие-то рекомендации или замечания, жду Ваши комментарии!

Ссылки, если понадоблюсь: GitHub, Telegram

Tags:
Hubs:
Total votes 5: ↑5 and ↓0+5
Comments7

Articles