Всем привет! Решила я вернуться на Хабр с новым мини-проектом. Сегодня попробуем детектить дорожные знаки используя YOLOv8. Что ж, приступим! Первое что мы делаем это открываем Google colab и создаем New Notebook. После того как всё создалось, то сверху ищем <среду выполнения>. Дальше такие действия: Сменить среду выполнения -> T4 GPU -> Сохранить. (По незнанию мне пришлось запускать проект 2 раза, потому что у меня стояла среда выполнения CPU, поэтому сделаем сразу все важные моменты в самом начале). P.s. меня забанили пока я писала статью, поэтому у вас есть 2 варианта (я не работала ещё ни разу с Google Colab, прошу не кидаться тапками):1: переписать код и переключиться на GPU уже после написанного. 2: использовать готовый блокнот и переключиться на GPU, когда уже будете готовы запускать код.Иначе получите это: Невозможно подключиться к ускорителю (GPU) из-за лимитов на использование в Colab. Так-с, перейдём сразу к делу, проверим всё ли у нас правильно выбралось:  nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Wed_Sep_21_10:33:58_PDT_2022 Cuda compilation tools, release 11.8, V11.8.89 Build cuda_11.8.r11.8/compiler.31833905_0   Sat Aug 12 08:27:04 2023      NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   CUDA Version: 12.0 ... Если получим такие выводы, то всё отлично. Можно продолжать работать :) Чтобы не путаться в последующих файлах, сразу удалим папку sample_data, а то она немного будет нам мешаться. 2.1: Клонируем репозиторий Есть несколько важных деталей, которые нужно сделать в репозитории:1: В файле general_json2yolo.py меняем код в 274 строке на h, w, f = img['height'], img['width'], img['file_name'].split('/')[1] . 2: В general_json2yolo.py и labelbox_json2yolo.py, нужно добавить перед каждым utils точку, чтобы было так from .utils import ...   Если у вас возникли вопросы почему так надо сделать, то объясню:1: Метод .split('/') разделяет строку img['file_name'] по символу / и создает список подстрок. Затем  выбирает второй элемент этого списка, то есть вторую подстроку после разделителя /. Строка img['file_name'] содержит путь к файлу с одним или несколькими слешами /, и нам нужно получить имя файла без пути.   2: Я долго не понимала, что я делаю не так и почему у меня не импортится файл, который лежит в той же папке с файлами, которые мы используем. Пришлось лезть в документацию импортов и смотреть какие варианты вообще есть. На своем железе такой ошибки не было, но в Google Colab она почему-то вылезла. Если у вас есть какие-то объяснения этой проблемы, то напишите в комментариях, буду благодарна :) Так-с, идём дальше! 2.2: Переходим к установке библиотек Если всё successfully installed, то переходим к самому датасету! 3.1: Скачиваем датасет Дальше нам потребуется Kaggle. Если нет аккаунта -> создаём его, а если есть то переходим в Settings -> API -> Create New Token. Автоматически скачается json файл, там уже будут данные. Немного расскажу о самом датасете, пока он скачивается. Набор данных RTSD содержит кадры, предоставленные компанией "Геоцентр Консалтинг". Изображения получены с широкоформатного видеорегистратора, который снимает с частотой 5 кадров в секунду. Разрешения изображений от 1280×720 до 1920×1080. Фотографии сделаны в разное время года, в разное время суток и при различных погодных условиях . В наборе используется 155 знаков дорожного движения в формате разметки - COCO.   3.2: Распаковываем архив с данными 3.3: Ну и чтобы он нам не мешался, то можем его удалить 4.1: Импортим библиотеки 4.2: Переходим к конвертации Мы будем использовать готовый скрипт от Ultralytics, который скачали в самом начале. Это папка JSON2YOLO. Перейдём к конвертации СOCO-формата в YOLO-формат. Советую делать всё постепенно, если вы используете Google Colab. У меня возникали ошибки при выполнении, если я использовала код целиком.  Отлично, разметка у нас есть, не хватает лишь изображений, которые ей соответствуют. Добавим их :) Создадим файл "trafic_signs.yaml" с описанием путей и классов, используемых в датасете. Это обязательное требование для YOLOv8.   5.1: Установим библиотеку для записи данных yaml в файл. 5.2: Импортим библитеку 5.3: Опишем пути и классы для обучения 6.1: Устанавливаем библиотеки Переходим непосредственно к обучению модели, наконец-то :) 7.1: Импортим библиотеки Если спросите зачем импортить torch и gc, то дам такой ответ. Они нужны для очистки графической памяти, если вам нужно будет это сделать, то пропишите: 7.2: Начинаем обучать модель P.s. если хотите, то можете поколдовать над размером батчей, у меня стоит 5 для обучения на colab, т.к. там всего 15гб GPU_mem. Ну или можете взять и другую модель от YOLOv8, а можно и больше эпох сделать. Тут уже всё на ваш выбор :) Самое время посмотреть на результаты после обучение, давайте потестируем модельку :) Как итог могу сказать, что получилось у меня обучить модельку всего 4 эпохи (вышло практически 6 часов), на 5 эпохе Google colab решил, что я превысила время использования ресурсов и остановил обучение не дав скачать веса и удалив все файлы. Так что совет на будущее, если будете обучать на colab, то сохраняйте веса каждую эпоху, как это делала я, просто потом дообучите модельку и всё. Думаю, что я так и сделаю в ближайшее время, чтобы сравнить результаты. Видно, что на 2 фотке некоторые знаки не получилось распознать из-за столба, но думаю что эту проблему можно решить. На 3 тесте тоже есть проблемы с распознаванием знака работы эвакуатора, хотя остальные 2 ей удалось найти. Итоги подведены, поэтому спасибо за прочтение статьи, надеюсь, она была полезной! Я только начинаю изучать CV и ML, поэтому, если у вас есть рекомендации по материалам/проектам, то порекомендуйте что-нибудь, буду благодарна :) Ну и оставлю ссылочки: GitHub, Telegram