Современное обнаружение объектов с помощью YOLOv5 и пользовательского набора данных!

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

YOLO - это аббревиатура от «You Only Look Once», он считается лучшим выбором для обнаружения объектов в реальном времени среди многих экспертов по компьютерному зрению и машинному обучению, и это просто потому, что это состояние -современный алгоритм обнаружения объектов в реальном времени с точки зрения производительности (FPS), простоты использования (настройка и конфигурации) и универсальности (модели могут быть закрыты для обслуживания различных устройств).

В этом уроке мы собираемся обучить модель обнаружения объектов в реальном времени с помощью YOLOv5 (последняя, ​​но неофициальная версия YOLO).

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

Краткая история YOLO

Джозеф Редмон представил первую версию YOLO в своей статье в мае 2016 года Вы только посмотрите один раз: унифицированное обнаружение объектов в реальном времени.

В следующем году Джозеф Редмон представил YOLOv2 в своей статье в декабре 2017 года под названием YOLO9000: лучше, быстрее, сильнее.

Он и его советник также опубликовали YOLOv3: постепенное улучшение в апреле 2018 года, это, безусловно, самая популярная и стабильная версия YOLO, у нее было несколько форков на github и, в частности, Гленн Джохер (издатель и автор YOLOv5) который не связан с Джозефом Редмоном, создал популярную реализацию YOLOv3 в PyTorch.

Редмон объявил, что отказывается от исследований в области компьютерного зрения в феврале 2020 года.

С этого момента стало неясно, кто и должен ли продолжать использовать имя «YOLO» для обозначения архитектур новых моделей. Некоторые считают YOLOv3 «последним YOLO».

Алексей Бочковский опубликовал YOLOv4 23 апреля 2020 года. Похоже, он связан с Джозефом Редмоном, и после релиза Джозеф Редмон дал своего рода одобрение или одобрение YOLOV4 https://t.co/FcnQPiySr7

Итак, несколько недель спустя, 29 мая 2020 года, Гленн Джохер из ultralytics создал репозиторий под названием YOLOv5, который не содержал никакого кода модели, а 9 июня 2020 года он добавил сообщение фиксации в свою реализацию YOLOv3 под названием YOLOv5 привет.

Реализация Jocher YOLOv5 отличается от предыдущих выпусков несколькими заметными особенностями. Во-первых, Джохер (пока) не опубликовал документ, сопровождающий свое освобождение. Во-вторых, Джохер изначально реализовал YOLOv5 в инфраструктуре Ultralytics PyTorch, которая очень интуитивно понятна в использовании и делает очень быстрые выводы, тогда как все предыдущие модели в семействе YOLO использовали Darknet (инфраструктура нейронных сетей с открытым исходным кодом, написанная на C и CUDA, это быстрый, простой в установке и поддерживает вычисления с использованием ЦП и графического процессора).

Репозиторий Йохера YOLOv5 - далеко не первое его участие в проекте YOLO: он сделал 2379 коммитов своей реализации YOLOv3 (pytorch).

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

(Примечание: YOLOv5 Гленна Джохера находится в стадии активной разработки. Джохер заявил, что он планирует опубликовать сводку YOLOv5 в качестве более надежной контрольной точки эффективности позже в этом году.)

Производительность YOLOv5 vs EfficientDet (обновлено 23.06) (источник)

Чтобы узнать больше о YOLOv5 и его предыдущих выпусках, посетите их сайт: https://www.ultralytics.com, официальное репо для YOLOv5 https://github.com/ultralytics/yolov прев5, а также официальное репо для YOLOv3 «https://github.com/ultralytics/yolov3

А теперь давайте погрузимся в…

Обучение модели YOLOv5 с пользовательским набором данных

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

Вы также можете загрузить и изучить код этого руководства здесь.

Шаги по обучению пользовательского детектора объектов YOLOv5 с пользовательским набором данных

  • Настройка среды и установка зависимостей YOLOv5
  • Предварительная обработка пользовательского набора данных
  • Определите конфигурацию и архитектуру модели YOLOv5
  • Обучите кастомный детектор YOLOv5
  • Оцените производительность YOLOv5
  • Визуализируйте данные тренировки YOLOv5
  • Запустите YOLOv5 Inference на тестовых изображениях
  • Экспорт сохраненных весов YOLOv5 для будущего вывода

Настройка среды и установка зависимостей YOLOv5

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

Требования: Python 3.7 или новее со всеми установленными requirements.txt зависимостями, включая torch >= 1.5.

Чтобы установить YOLOv5 и его зависимости, запустите:

$ git clone https://github.com/ultralytics/yolov5 # clone repo
$ pip install -U -r yolov5/requirements.txt # install dependencies
$ cd /content/yolov5 #change directory into project folder.

содержимое файла requirements.txt:

numpy==1.17
scipy==1.4.1
cudatoolkit==10.2.89
opencv-python
torch==1.5
torchvision==0.6.0
matplotlib
pycocotools
tqdm
pillow
tensorboard
pyyaml

Примечание. Для этого руководства я использовал macOS Catalina версии 10.15, впоследствии я протестировал его на ubuntu 18.04 и смог запустить его без ошибок или ошибок.

Вы готовы перейти к следующему шагу, если вам удалось без проблем установить YOLOv5 и его зависимости.

Предварительная обработка пользовательского набора данных

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

Вот некоторые данные об обнаружении пользовательских объектов в формате YOLOv5 из Roboflow, вы можете выбрать и загрузить любой набор данных, который хотите использовать в этом руководстве.

В этом уроке я собрал несколько изображений антенн с помощью дрона, пометил эти изображения меткой LabelImg.

Примечание. Если у вас есть изображения без ярлыков, вам сначала нужно пометить их. Для бесплатных инструментов маркировки с открытым исходным кодом мы рекомендуем следующие руководства по началу работы с LabelImg или началу работы с инструментами аннотации CVAT. Чтобы продолжить работу с этим уроком, попробуйте пометить не менее 100 изображений. Чтобы впоследствии повысить производительность вашей модели, вам нужно будет добавить метки к большему набору данных.

Вы можете посмотреть это видео на YouTube о том, как маркировать данные с помощью LabelImg.

Примечание. После разметки вам следует разделить наборы данных на обучающий набор, набор для проверки и набор тестов, все в отдельных папках, и убедитесь, что храните свои аннотации и изображения в одном каталоге. Рекомендуемый процент разделения - 70% данных в обучающем наборе, 20% в проверочном наборе и 10% в тестовом наборе. Затем вы должны скопировать папки обучения и проверки и вставить их в каталог data в папке проекта.

Преобразование формата аннотации

Вы можете использовать приведенный ниже сценарий, если вам нужно преобразовать формат аннотации из Pascal VOC XML в формат YOLOv5 txt, например, в моем случае после аннотирования и маркировки моих наборов данных (изображений) с помощью LabelImg формат аннотации был в XML, поэтому Я использовал приведенный ниже сценарий для преобразования в формат txt, который поддерживает YOLOv5. Этот скрипт также автоматически генерирует два текстовых файла, которые содержат полный путь ко всем изображениям в папках обучения и проверки, на эти текстовые файлы есть ссылки в файле конфигурации yaml, к которому мы скоро вернемся.

Примечание. Этот сценарий должен находиться в том же каталоге, что и набор данных для обучения и проверки (все они должны находиться внутри data папки, которая находится внутри yolov5 папка проекта).

Вот моя модифицированная версия скрипта:

import glob
import os
import pickle
import xml.etree.ElementTree as ET
from os import listdir, getcwd
from os.path import join
dirs = ['train', 'val']
classes = ['antenna']
def getImagesInDir(dir_path):
   image_list = []
   for filename in glob.glob(dir_path + '/*.jpg'):
       image_list.append(filename)
   return image_list
def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)
def convert_annotation(dir_path, output_path, image_path):
    basename = os.path.basename(image_path)
    basename_no_ext = os.path.splitext(basename)[0]
    in_file = open(dir_path + '/' + basename_no_ext + '.xml')
    out_file = open(output_path + basename_no_ext + '.txt', 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
       difficult = obj.find('difficult').text
       cls = obj.find('name').text
       if cls not in classes or int(difficult)==1:
           continue
       cls_id = classes.index(cls)
       xmlbox = obj.find('bndbox')
       
       b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text),                         float(xmlbox.find('ymin').text),                  float(xmlbox.find('ymax').text))
       bb = convert((w,h), b)
       out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
cwd = getcwd()
for dir_path in dirs:
    full_dir_path = cwd + '/' + dir_path
    output_path = full_dir_path +'/'
    if not os.path.exists(output_path):
        os.makedirs(output_path)
    image_paths = getImagesInDir(full_dir_path)
    list_file = open(full_dir_path + '.txt', 'w')
    for image_path in image_paths:
        list_file.write(image_path + '\n')                  
    convert_annotation(full_dir_path, output_path, image_path)
    list_file.close()
print("Finished processing: " + dir_path)

Определите конфигурацию и архитектуру модели YOLOv5

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

#train and val datasets (image directory or *.txt file with image paths)
train: /Users/macbook/Desktop/antenna/yolov5/data/train.txt
val: /Users/macbook/Desktop/antenna/yolov5/data/val.txt
# number of classes
nc: 1
# class names
names: ['antenna']

В моем случае файл конфигурации был назван antenna.yaml, это файл конфигурации модели для нашего пользовательского детектора объектов YOLOv5. Для этого урока мы выбрали самую маленькую и самую быструю базовую модель YOLOv5 - yolov5s. У вас есть возможность выбрать любую из четырех моделей YOLOv5, в которую входят:

  1. yolov5-s
  2. йолов5-м
  3. йолов5-л
  4. yolov5-x

Для дальнейшего сравнения моделей YOLOv5 вы можете посмотреть здесь.

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

Затем обязательно измените файл конфигурации YAML соответствующей версии модели YOLOv5, которую вы только что скачали и выбрали для использования в обучении, из каталога YOLOv5 folderchange в папку models и измените номер класса nc на 1.

# parameters
nc: 1 # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
# anchors
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

В моем случае я использовал yolov5, поэтому я открыл файл yolov5s.yaml и изменил количество классов на 1, так как в это время я пытаюсь обнаружить только один объект (антенну).

Наконец, у нас все хорошо настроено и мы готовы начать обучение нашей пользовательской модели детектора объектов YOLOv5 на пользовательских наборах данных.

Обучающий пользовательский детектор YOLOv5

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

  • img: определить размер входного изображения
  • партия: определить размер партии.
  • эпохи: укажите количество эпох обучения. (Примечание: здесь часто бывает 3000+!)
  • data: задаем путь к нашему файлу yaml
  • cfg: укажите конфигурацию нашей модели
  • веса: укажите собственный путь к весам.
  • name: названия результатов
  • nosave: сохранить только последнюю контрольную точку
  • cache: кешируйте изображения для более быстрого обучения.
  • устройство: для выбора обучающего устройства, «0» для GPU и «cpu» для CPU.

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

$ python3 train.py --img 640 --batch 1 --epochs 30 --data ./data/antenna.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --device cpu

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

Во время обучения вы хотите наблюдать за [email protected], чтобы увидеть, как работает ваш детектор - см. Этот пост о поломке mAP.

Оцените производительность пользовательского детектора YOLOv5

После завершения обучения обученная модель будет сохранена в вашей папке / каталоге «веса», а затем мы оценим, насколько хорошо выполняется процедура обучения, просмотрев метрики проверки. Сценарий обучения сбросит журналы тензорной доски в runs. Мы визуализируем их здесь:

И если вы не можете визуализировать Tensorboard по какой-либо причине, результаты также можно отобразить с помощью utils.plot_results и сохранить result.png

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

Визуализируйте данные тренировки YOLOv5

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

Запустите YOLOv5 Inference на тестовых изображениях

Теперь возьмем нашу обученную модель и сделаем вывод на тестовых изображениях. Для вывода мы вызываем эти веса вместе с conf, определяющим доверие модели (требуется более высокая степень достоверности, делает меньше прогнозов), и source выводом. source может принимать каталог изображений, отдельные изображения, видеофайлы, а также порт веб-камеры устройства. В качестве источника я переместил mytest1/*jpg на test_infer/.

python3 detect.py --source ./inference/images/test1.jpg  --weights weights/last.pt --conf 0.5

Ваши результаты будут сохранены в каталогеinference.

Заключение

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

Вы можете выполнить разветвление и изучить код этого руководства здесь.

Если у вас есть отзывы или предложения, вы можете оставить их в разделе ответов.

Свяжитесь со мной в Linkedin, Twitter и Github.

Отдельное спасибо Ultralytics и Roboflow.

Большое спасибо за то, что следуете моему руководству.