Привет, читатель!

Перед тобой статья-путеводитель по обучению YOLO4 в Google Colab

Что понадобится:

  1. аккаунт в Google.

  2. Colab с подключенyой GPU.

Подготовка к запуску.

p.s. необходимо чтобы уже был готов dataset для обучения.

настройка cfg

Шаг 1. Включение графического процессора в вашем ноутбуке

Включаем GPU, чтобы YOLOv4 обучалась раз в 100 быстрее, чем без.

  • Нажмите Среда выполнения --> Сменить среду выполнения:

  • Выберите Аппаратный ускоритель GPU и сохраните

Шаг 2: Клонирование и создание Даркнета

# клонировать репозиторий даркнета c GitHub
!git clone https://github.com/AlexeyAB/darknet
# измените файл makefile, чтобы включить графический процессор и OPENCV
%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile
# проверка CUDA
!/usr/local/cuda/bin/nvcc --version
# создает даркнет, чтобы могли использовать исполняемый файл 
#даркнета для запуска или обучения детекторов объектов
!make

Шаг 3: Загрузите предварительно подготовленные веса YOLOv4

YOLOv4 уже прошел обучение на наборе данных coco, который содержит 80 классов, которые он может предсказать. Мы возьмем эти предварительно обученные веса, чтобы мы могли запустить YOLOv4 на этих предварительно обученных классах и получить обнаружения.

!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

Шаг 4: Определите Вспомогательные функции

Эти три функции являются вспомогательными функциями, которые позволят вам отображать изображение в записной книжке Colab после выполнения обнаружений, а также загружать и загружать изображения в облачную виртуальную машину и с нее.

# определение вспомогательных функций
def imShow(path):
  import cv2
  import matplotlib.pyplot as plt
  %matplotlib inline
  image = cv2.imread(path)
  height, width = image.shape[:2]
  resized_image = cv2.resize(image,(3*width, 3*height), interpolation = cv2.INTER_CUBIC)
  fig = plt.gcf()
  fig.set_size_inches(18, 10)
  plt.axis("off")
  plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
  plt.show()


# используйте это для загрузки файлов
def upload():
  from google.colab import files
  uploaded = files.upload() 
  for name, data in uploaded.items():
    with open(name, 'wb') as f:
      f.write(data)
      print ('saved file', name)

# используйте это для выгрузки файла
def download(path):
  from google.colab import files
  files.download(path)

Как обучить Свой собственный Детектор пользовательских Объектов YOLOv4!

Теперь пришло время создать свой собственный детектор объектов YOLOv4, чтобы распознавать любые классы / объекты, которые вы хотите!

Для этого требуется пара трюков и советов, поэтому обязательно внимательно следуйте остальной части урока.

Для создания пользовательского детектора YOLOv4 нам понадобится следующее:

  • Помеченный Пользовательский Набор данных

  • Пользовательский файл .cfg

  • файлы obj.data и obj.names

  • train.txt файл (test.txt здесь также необязательно)

Шаг 1: Сбор и маркировка пользовательского набора данных

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

Это можно сделать двумя способами. с помощью или с помощью изображений Google или создания собственного набора данных и использования инструмента аннотаций для ручного рисования меток. (Я рекомендую первый способ!)

Способ 1: Использование набора данных открытых изображений Google (РЕКОМЕНДУЕТСЯ)

Этот метод я рекомендую, так как вы можете собрать тысячи изображений и автоматически сгенерировать их метки в течение нескольких минут! Сбор набора данных из набора данных Google Open Images и использование инструментария OIDv4 для создания меток просты и экономичны по времени. Набор данных содержит помеченные изображения для более чем 600 классов! Здесь!

Создание DataSet описано в этом ноутбуке

В этом уроке будем создавать детектор объектов номерного знака, используя данные из набора данных Google Open Images.

Создание DataSet для поиска номеров можно посмотреть в этом ноутбуке

Способ 2: Ручная маркировка изображений с помощью инструмента аннотации

Если вы не можете найти нужные изображения или классы в наборе данных открытых изображений Google, вам придется использовать инструмент аннотаций для ручного рисования надписей, что может быть утомительным процессом.

Я создал предыдущее видео, в котором рассказываю о том, как массово загружать изображения из Google Images, а также о том, как использовать LabelImg, инструмент аннотации, для создания пользовательского набора данных для YOLOv4. Нажмите на ссылку ниже, чтобы узнать, как это сделать.

Создание меток и аннотаций для пользовательского набора данных YOLOv3 (Видео) (тот же формат для YOLOv4)

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

Теперь у вас есть свои собственные наборы данных YOLOv4!

Подборка датасетов для машинного обучения

Шаг 2. Перемещение Пользовательских Наборов Данных В Облачную Виртуальную Машину

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

Я рекомендую переименовать папку обучающего набора данных с вашими изображениями и текстовыми файлами на вашем локальном компьютере в "obj", а затем создать zip-папку папки "obj". Затем я рекомендую загрузить zip-файл на ваш Google Диск. Так что теперь у вас должно быть obj.zip где-нибудь на вашем Google диске.

Сделайте то же самое с вашим набором данных проверки, но назовите его "тест". Так что теперь у вас должно быть test.zip также загружено на ваш Google Диск.

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

Теперь мы можем скопировать zip-файлы и распаковать их в вашей облачной виртуальной машине.

from google.colab import drive
drive.mount('/content/drive')

#здесь мои наборы данных хранятся на моем Google Диске 
#(я создал папку yolov4 для хранения всех важных файлов для 
#пользовательского обучения).
!ls /content/drive/MyDrive/yolov4/

# # скопируйте оба набора данных в корневой каталог виртуальной 
#машины Collab (закомментируйте test.zip если вы не используете 
#набор данных для проверки)
!cp /content/drive/MyDrive/yolov4/obj.zip ../
!cp /content/drive/MyDrive/yolov4/test.zip ../

# распакуйте наборы данных и их содержимое так, чтобы они теперь 
#находились в папке /darknet/data/
!unzip ../obj.zip -d data/obj
!unzip ../test.zip -d data/test

Шаг 3: Настройка файлов для обучения

Этот шаг включает в себя правильную настройку пользовательских файлов .cfg, obj.data, obj.names, train.txt и test.txt файлы.

Важно настраивать все эти файлы с особой осторожностью, так как опечатки или небольшие ошибки могут вызвать серьезные проблемы с вашим пользовательским обучением.

1. Файл Cfg

Скопируйте файл yolo v4.cfg на свой Google Диск, запустив ячейку ниже. Это позволит нам отредактировать его в текстовом редакторе.

# загрузите cfg на Google диск и измените его название
!cp /content/darknet/cfg/yolov4-custom.cfg /content/drive/MyDrive/yolov4/yolov4-obj.cfg

# для загрузки на локальный компьютер (измените его имя на yolov4-obj.cfg после загрузки)
download('cfg/yolov4-custom.cfg')

Теперь нам нужно отредактировать файл .cfg в соответствии с нашими потребностями на основе детектора объектов. Откройте его в коде или текстовом редакторе, чтобы сделать это. Теперь нам нужно отредактировать файл .cfg в соответствии с нашими потребностями на основе детектора объектов. Откройте его в коде или текстовом редакторе, чтобы сделать это.

Если вы загрузили cfg на google диск, вы можете использовать встроенный Текстовый редактор, зайдя на свой google диск и дважды щелкнув на yolov4-obj.cfg, а затем нажав на раскрывающийся список Открыть с помощью и выбрав Текстовый редактор.

Рекомендация по настройке cfg

Я рекомендую иметь batch = 64 и subdivisions = 16 для достижения конечных результатов. Если у вас возникнут какие-либо проблемы, увеличьте их до 32.

Внесите остальные изменения в cfg в зависимости от того, на скольких классах вы тренируете свой детектор.

Примечание: Я установил свои max_batches = 6000, steps = 4800, 5400,, и изменил classes = 1 в трех слоях YOLO и filters = 18 в трех сверточных слоях перед слоями YOLO.

Как настроить Ваши переменные:

ширина = 416

высота = 416 (они могут быть любыми кратными 32, стандартно 416, иногда вы можете улучшить результаты, увеличив значение, например, 608, но это замедлит обучение)

max_batches = (количество классов) * 2000 (но не менее 6000, поэтому, если вы тренируетесь для 1, 2 или 3 классов, это будет 6000, однако детектор для 5 классов будет иметь max_batches = 10000)

steps = (80% максимальных наборов), (90% максимальных наборов) (так что, если ваш max_batches = 10000, то steps = 8000, 9000)

filters = (количество классов + 5) * 3 (таким образом, если мы обучаем для одного класса, то наши фильтры = 18, но если вы тренируетесь для 4 классов, то наши фильтры = 27)

Необязательно: Если у вас возникнут проблемы с памятью или вы обнаружите, что тренировка занимает очень много времени. В каждом из трех слоев yolo в cfg измените одну строку с random = 1 на random = 0, чтобы ускорить обучение, но немного снизить точность модели. Также поможет сэкономить память, если у вас возникнут какие-либо проблемы с памятью.

# загрузите пользовательский файл .cfg обратно в облачную виртуальную машину с Google Диска
!cp /content/drive/MyDrive/yolov4/yolov4-obj.cfg  ./cfg

2. obj.names и obj.data

Создаем новый файл в редакторе кода или текста под названием obj.names, где у нас будет по одному имени класса в строке в том же порядке, что и у нашего classes.txt с этапа создания набора данных.

ПРИМЕЧАНИЕ: В название класса не должно быть пробелов. По этой причине я изменил "Регистрационный знак транспортного средства" на license_plate.

Пример для многоклассового файла obj.names:

Мы также создаем файл obj.data и заполняем его следующим образом (соответствующим образом изменяем количество классов, а также местоположение резервной копии).

Этот резервный путь - это то место, где мы будем сохранять веса нашей модели на протяжении всего обучения. Создайте папку резервной копии на своем Google диске и укажите правильный путь к ней в этом файле.

# загрузите файлы obj.names и obj.dataе в облачную виртуальную машину с Google Диска
!cp /content/drive/MyDrive/yolov4/obj.names ./data
!cp /content/drive/MyDrive/yolov4/obj.data  ./data

3. Генерирование train.txt и test.txt

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

К счастью, я создал сценарии, которые легко генерируют эти два файла с правильными путями ко всем изображениям.

Доступ к скриптам можно получить из репозитория Github Repo

Просто загрузите два файла на свой локальный компьютер или загрузите их на свой Google Диск, чтобы мы могли использовать их в записной книжке Colab.

#Клонируем репозиторий с 
!git clone https://github.com/theAIGuysCode/YOLOv4-Cloud-Tutorial

#Теперь просто запустите оба скрипта, чтобы выполнить за нас работу по созданию двух текстовых файлов.
!python /content/darknet/YOLOv4-Cloud-Tutorial/yolov4/generate_train.py
!python /content/darknet/YOLOv4-Cloud-Tutorial/yolov4/generate_test.py

#убедитесь, что недавно созданный train.txt и test.txt можно увидеть в нашей папке darknet/data
!ls /content/darknet/data/

Если вы не уверены, сработала ли генерация файлов, и хотите еще раз проверить, все ли прошло по плану, дважды щелкните на train.txt на левой стороне проводника файлов, и это должно выглядеть так.


image.png

Он будет содержать одну строку для каждого пути обучающего изображения.
image.png Он будет содержать одну строку для каждого пути обучающего изображения.

Шаг 4: Загрузите предварительно подготовленные веса для сверточных слоев.

На этом шаге загружаются веса для сверточных слоев сети YOLOv4. Использование этих весов помогает вашему пользовательскому детектору объектов быть более точным, и вам не придется так долго тренироваться. Вам не обязательно использовать эти веса, но поверьте мне, это поможет вашей модели сходиться и быть точной намного быстрее. ИСПОЛЬЗУЙ ЭТО!

!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

Шаг 5: Обучите Свой Собственный Детектор Объектов!

Теперь мы готовы обучить свой пользовательский детектор объектов YOLOv4 любым классам, которые выбрали. Поэтому выполните следующую команду. (-флаг dont_show предотвращает появление диаграммы, так как блокнот Colab не может открывать изображения на месте, -map flag означает среднюю точность на графике, чтобы увидеть, насколько точна ваша модель, добавьте map flag , только если у вас есть набор данных для проверки)

!./darknet detector train <path to obj.data> <path to custom config> yolov4.conv.137 -dont_show -map

СОВЕТ: Это обучение может занять несколько часов в зависимости от того, сколько итераций вы выбрали в файле .cfg. Чтобы это работало, когда вы спите или идете на работу в течение дня и т. Д. Однако облачный сервис Colab отключает вас от виртуальных машин, если вы слишком долго простаиваете (30-90 минут).

Чтобы избежать этого, одновременно удерживайте (F12), чтобы открыть представление инспектора в вашем браузере.

Вставьте следующий код в окно консоли и нажмите Ввод

function ClickConnect(){
  console.log("Working");
  document
    .querySelector('#top-toolbar > colab-connect-button')
    .shadowRoot.querySelector('#connect')
    .click()
  }
setInterval(ClickConnect,60000)

Он будет щелкать по экрану каждые 10 минут, чтобы вас не выгнали за бездействие!

# тренируйте свой собственный детектор! (раскомментируйте %%ниже, если у вас возникли проблемы с памятью или ваш Colab выходит из строя)
# %%capture
!./darknet detector train data/obj.data cfg/yolov4-obj.cfg yolov4.conv.137 -dont_show -map

После тренировки можем просмотреть диаграмму того, как наша модель работала на протяжении всего процесса обучения, выполнив приведенную ниже команду. Он показывает диаграмму средних потерь по сравнению с итерациями. Чтобы модель была "точной", мы должны стремиться к потере менее 2.

# показать диаграмму.png того, как пользовательский детектор объектов справился с обучением
imShow('chart.png')

XИТРОСТЬ: : Если по какой-то причине вы получите ошибку или ваш Colab простаивает во время тренировки, вы не потеряли свою частично обученную модель и веса! Каждые 100 итераций файл весов с именем yolov4-obj_last.weights сохраняется в папке my drive/yolov4/backup/ (где бы ни находилась ваша папка резервного копирования). Вот почему мы создали эту папку на нашем Google диске, а не на облачной виртуальной машине. Если ваша среда выполнения выйдет из строя, а папка резервной копии окажется в вашей облачной виртуальной машине, вы потеряете вес и прогресс в тренировках.

Мы можем начать тренировку с нашего последнего сохраненного файла весов, чтобы нам не пришлось перезапускать! У-У-У! Просто выполните следующую команду, но с указанием местоположения резервной копии.

!./darknet detector train data/obj.data cfg/yolov4-obj.cfg /mydrive/yolov4/backup/yolov4-obj_last.weights -dont_show

Шаг 6: Проверка средней точности (Карта) Вашей модели

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

ПРИМЕЧАНИЕ: Если вы считаете, что ваш файл окончательных весов переполнен, важно выполнить эти команды карты, чтобы увидеть, является ли один из ранее сохраненных весов более точной моделью для ваших классов.

!./darknet detector map data/obj.data cfg/yolov4-obj.cfg /mydrive/yolov4/backup/yolov4-obj_1000.weights

Шаг 7: Запустите Свой Собственный Детектор Объектов!!!

Вы сделали это! Теперь у вас есть собственный детектор объектов, чтобы делать свои собственные обнаружения. Время проверить это и немного повеселиться!

# нужно перевести наш пользовательский cfg в тестовый режим
%cd cfg
!sed -i 's/batch=64/batch=1/' yolov4-obj.cfg
!sed -i 's/subdivisions=16/subdivisions=1/' yolov4-obj.cfg
%cd ..

# запустите свой пользовательский детектор с помощью этой команды (загрузите изображение на свой Google диск для тестирования, флаг порога устанавливает точность, которой должно быть обнаружение, чтобы показать его)
!./darknet detector test data/obj.data cfg/yolov4-obj.cfg /mydrive/yolov4/backup/yolov4-obj_last.weights /mydrive/images/car2.jpg -thresh 0.3
imShow('predictions.jpg')

Ссылка на Google Colab

Комментарии (0)