Всем привет! Несколько месяцев назад я начал пытался разбираться в 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 к моей модели. Я не стал пытаться делать какое-то грандиозное сравнение всего датасета, а решил по рабоче-крестьянски скармливать ему по одной фотографии и сравнивать результаты.
Так, например, я получил два таких результата:
Выводы
Проведя всю эту работу, могу сказать, что технология sahi мне не помогла и даже ухудшила результаты по двум аспектам:
Модель yolov8s+sahi нашло 33 чайки, в то время, как yolov8s, в одиночку, обнаружил 39.
У модели yolov8s+sahi уровень уверенности ниже, чем у yolov8s.
Почему получились именно такие результаты, я до конца не понимаю. Возможно, так случилось из-за того, что моя модель была не идеальная, и полученные неидеальные веса лишь усугубили результат в случае применения sahi. Напишите в комментарии, если догадываетесь в чем проблема, буду очень признателен)
Спасибо за прочтение статьи! Надеюсь, она была интересной и даже, может быть, познавательной.
Если у вас есть какие-то рекомендации или замечания, жду Ваши комментарии!